Lord of SQL Injection - 22번 문제풀이
[22번 문제 - Dark_Eyes]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(mysqli_error($db)) exit();
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes");
highlight_file(__FILE__);
?>
|
cs |
해당 문제는 21번 문제와 같이 Error Based SQL Injection 이다.
대신 이번엔 조건 함수들을 필터링해서 좀 더 어렵게 낸 듯 하다. 나 또한 이번 문제는 몇 일 고민하다가 도저히 모르겠어서 검색해서 알아냈다...ㅜ
다른 조건 함수들이 있는지를 찾아보기도 했지만, 저 필터링 된 함수들 외에 다른 종류의 DBMS 함수들만 나오고 별다른 건 없어서 엄청 애먹었다..
결론부터 말하자면 해당 문제는 UNION 을 이용한 서브쿼리를 통해 조건을 줄 수 있다!!!
아예 처음보는 방법이라 검색해서 푸는게 아니였다면 절대 못 알아냈을거다.
pw=1' or id='admin' and (select 1 union select length(pw)=8) #
해당 값에서 빨간색 글자 부분이 서브 쿼리이고, 앞의 쿼리의 결과는 1로 나오고, 뒤의 쿼리의 결과가 참일 경우 1을 반환해서 결과값은 1만 반환하게 된다.(단일행)
만약, 뒤의 쿼리의 결과가 거짓일 경우 0을 반환해서 결과값은 1과 0이 나오게 된다.(다중행)
다중행의 결과가 나올 경우 전체 쿼리문의 처음 SELECT 문과의 행의 개수가 맞지않아 오류가 발생하게 된다.
이러한 특성을 이용해서 해당 문제를 풀 수 있다.
서브 쿼리에서 조건을 줄 수 있는 뒤의 SELECT 문을 Blind SQL Injection 기법을 이용해서 PW를 알아낼 수 있다.
이미 앞에서 많이 사용한 방법이니 굳이 적지는 않겠다. 자동화 스크립트를 통해서 빠르게 알아낼 수 있다.
[문제 풀이 구문]
https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=5a2f5d3c