[Lord of SQL Injection] darkknight 12번
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