klaus

[Lord of SQL Injection] darkknight 12번 본문

모의해킹/Wargame

[Lord of SQL Injection] darkknight 12번

klus! 2022. 12. 16. 12:01

0. 다크나이트

다크나이트를 검색하면 batman만 나온다..ㅎㅎ

php마이페이지를 만들다가 힘들어서 문제하나를 풀어봅니다.(?)

 

1. 전체 코드

2. 주요 코드 분석

if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); 
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe"); 
$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";

 

먼저, preg_match함수를 확인해보면 no를 받는 변수에서 prob와 _ , . , ( , ) 을 필터링하고 추가로 '와 subtstr과 ascii, =을 필터링한다.

또 pw를 받는 변수에서는 '를 필터링한다. 둘 다 i를 통해 대소문자를 구분하지 않는 것을 알 수 있다.

SQL 쿼리문을 보면 아이디는 Guest로 고정되어 있습니다.

$_GET[pw] = addslashes($_GET[pw]); 
$query = "select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'"; 
$result = @mysqli_fetch_array(mysqli_query($db,$query)); 
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight"); 

addslashes 함수로 ', ", 널 값을 필터링한 쿼리문을 다시 실행시켜 $result['pw'] == $_GET['pw'] 이면 Solve 결과적으로 이번 문제도 진짜 비밀번호를 찾아야 풀리는 문제입니다.

 

3. Solve

이번 문제 역시 블라인드 SQLi이기 때문에 참 또는 거짓값이 나오는 페이로드를 작성하고 페이로드를 바탕으로 문제를 풀어보겠습니다.

 

Step. 1 admin으로 로그인할 수 있는 기본 페이로드 작성( 참/거짓)

먼저, ?no=1 || id like "admin" 사용하여 admin으로 로그인하였습니다. 하지만, 해당 문제는 패스워드도 알아야하기 때문에 기본 페이로드를 통해 문제를 풀어보겠습니다.

 

Step2. Pw길이파악하기

[+] 우회코드

- substr : mid, right(left), substring

- ascii : ord,hex 

? no=1 || id like "admin" %26%26 length(pw) like 8 에서 참 값으로 pw의 길이는 8

Step3. Pw data 찾기

mid함수를 사용해서 문제풀이!! mid함수를 사용하여 subtstr를 필터링 우회하겠습니다.

사용법은 subtstring와 동일합니다.

그럼 기본 페이로드를 작성해보겠습니다.

? no=1 || id like "admin" %26%26 mid(pw,1,1) like 0로 작성할 수 있습니다.

다만, 해당 페이로드로는 숫자만 찾을 수  있기 때문에 ascii를 우회할 방법으로

hex함수를 사용해서 16진수로 변경해주고

conv함수를 사용해서 입력된 값을 16진수에서 10진수로 변경해서 문제를 풀었습니다.

길이는 8

pw는 0b70ea1f

Comments