공격 백터
- 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)
Quine SQLi 설명에 나온 참고 사이트를 참고하여 Quine SQLi를 시도하니 문제를 클리어할 수 있었다.
'워게임 > Lord of SQLInjection' 카테고리의 다른 글
[Lord of SQLInjection] Alien Write UP (0) | 2021.09.07 |
---|---|
[Lord of SQLInjection] Zombie Write UP (0) | 2021.09.01 |
[Lord of SQLInjection] Phantom Write UP (0) | 2021.08.26 |
[Lord of SQLInjection] Frankenstein Write UP (0) | 2021.08.25 |
[Lord of SQLInjection] Blue Dragon Write UP (0) | 2021.08.19 |