스포하자면 이번 문제도 blind sql injection 문제다.
문제를 보러 가봅시다.
문제 살펴보기

darkelf 문제에서 본 조건문이 보인다.
문제 풀이에 필요한 부분을 분석하면 아래와 같다.
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
이번 문제도 or과 and 연산자를 우회하는 문제다.
or는 ||로, and는 &&로 사용하면 될 것 같다.
$query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'";
...
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
해당 where문을 참으로 만들 경우,
Hello (반환된 행의 id 컬럼 값)을 출력한다.
대놓고 이걸 활용하여 blind sql injection을 수행하라고 한다.
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
addslashes 함수를 통해 pw 파라미터의 값의 특수문자를 이스케이프 처리하고,
해당 값이 id 컬럼의 값이 'admin'인 행의 pw 컬럼의 값이랑 일치하면 문제가 풀리게 된다.
결국 admin의 pw 값을 알아내라는 문제다.
문제 풀이 과정
or과 and만 우회하면 되는 문제이기 때문에
orc 문제에서 사용했던 python 코드를 조금만 수정하여 사용하면 될 것 같다.
이번 문제에서도 length 함수를 사용하여 pw 컬럼 값의 길이를 구하였다.
아래 코드는 내가 작성한 pw 컬럼 값의 길이를 구하는 함수다.
참고로 &는 url에 직접 입력하여 파라미터의 값으로 넣어주려면
%26으로 url enconding을 해서 넣어주어야 한다.
하지만 python requests 모듈을 사용해서 get 방식으로 데이터를 전달하면
알아서 url encoding을 해주기 때문에 그냥 사용해도 된다.
위 함수를 실행시켜 얻은 pw 값의 길이는 다음과 같다.

이제 이 길이를 사용해서 pw 값을 구하면 된다.
이번에도 left 함수를 사용하여 pw의 값을 구하였다.
python 코드에 대한 설명은 주석을 참고하길 바란다.
이제 위 함수를 실행시켜 pw 값을 구해보도록 하자.

함수를 실행시켜 위 값을 구하였다.
이를 이제 pw 파라미터의 값으로 넣어주면 문제가 풀릴 것이다.

pw 값이 제대로 구해졌나보다.
orge clear!
전체 python 코드
원하는 값이 제대로 전달되고 있는지 확인해보려면
res = req.get 이후에 res.url 값을 확인해보거나, 직접 해당 url로 이동해보는 것도 나쁘지 않다.
'web > Lord of SQLInjection' 카테고리의 다른 글
| Lord of SQLInjection - 9번 : vampire (0) | 2023.12.10 |
|---|---|
| Lord of SQLInjection - 8번 : troll (0) | 2023.12.10 |
| Lord of SQLInjection - 6번 : darkelf (1) | 2023.12.10 |
| Lord of SQLInjection - 5번 : wolfman (0) | 2023.12.10 |
| Lord of SQLInjection - 4번 : orc (0) | 2023.12.09 |