[*] SQL Comment Attack SQL 쿼리를 가장 쉽게 정복할 수 있는 방법 중에 하나는 바로 주석을 이용하는 것이다. MySQL에서 많은 종류의 주석이 쓰이는데, 공격에 많이 쓰이는 주석을 소개하겠습니다. 1. -- (MySQL기반) 2. # (%23 : 오라클기반) 3. /* 4. // 5. (주석은 아니지만 쿼리를 바로 끝낼 수 있는것) %00 |
<?php include "./config.php"; login_chk(); dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"; echo "
query : {$query}
"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id'] == 'admin') solve("cobolt"); elseif($result['id']) echo "Hello {$result['id']}
"; highlight_file(__FILE__); ?>
You are not admin :(
7번째줄을 보면 gremlin문제와 비슷해보이지만, pw부분에 md5()함수로 패스워드를 해싱하는것을 볼 수있다.
10번째줄을 보면 id의 값이 admin이면 cobolt가 풀리는것 같습니다.
즉, 패스워드값을 확인 안한다.
gremlin문제와 같이 id값에 admin을 넣고 pw부분을 주석처리 해보겠습니다.
id값 : admin%27--%20 (%27은 싱글쿼터('), %20은 공백, 주석은 '--')
id값 : admin%27%23 (%27은 싱글쿼터('), %23은 '#')
너무 쉽게 풀렸습니다. 혹시 admin말고 id값도 무조건 참으로하면 어떻게 될까하고 값을 넣어봤습니다.
"Hello rubiya You are not admin :(" 이라고 출력되네요..
[또 다른 풀이]
이번에는 md()함수를 무력화 시키는 방법으로 문제를 풀어보자.
id값은 'admin'을 넣고, pw값에 '1'을 넣어보자.
위 그림과 같이 pw값에 '1'을 넣으면 md5()함수 안에 값으로 들어간다.
pw값을 무조건 참으로 만들려면 md5()함수를 먼저 무력화시켜야 한다.
pw값에 ') 값을 입력해보자.
')를 집어넣게 되면 md5()함수가 닫히고, 그 뒤에 우리가 원하는 값을 집어 넣을 수 있게 된다.
그럼 gremlin문제처럼 pw를 무조건 참으로 만들어보자.
맨 뒷부분에 ')이 거슬린다. 저부분은 주석처리해주자.