728x90
Lord of sql injection - frankenstein 풀이 |
los 28번 프랑켄슈타인 풀이입니다.
문제 접근
if(preg_match('/prob|_|\.|\(|\)|union/i', $_GET[pw])) exit("No Hack ~_~"); $query = "select id,pw from prob_frankenstein where id='frankenstein' and pw='{$_GET[pw]}'"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if(mysqli_error($db)) exit("error"); |
여기까지 살펴보면, error based sql injection에 union과 괄호가 금지된 문제처럼 보인다.
$_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_frankenstein where id='admin' and pw='{$_GET[pw]}'"; $result = @mysqli_fetch_array(mysqli_query($db,$query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("frankenstein"); highlight_file(__FILE__); |
문제의 목적은 admin의 pw를 구하는 것이다.
union, ( ) 이 필터링 되지않았다면, 쿼리를
pw=' or id='admin' and if(length(pw)=N,(union select 1,2),1)%23 과 같이 union select를 이용해서 에러를 발생시켜
문제를 해결할 수 있었을 것이다. 이 문제는 union과 ( ) 이 금지되어있다 이럴때는 어떻게 하면 좋을까
잘 생각해봐도 떠오르질 않아서 검색해보았더니, 큰 수를 곱해서 에러를 발생시키는 방법이 있다고한다. 또한 if 문 대신
case when then end 와 like를 사용해서 대체할 수 있다.
case when then end의 사용은 이미 sfw2 를 풀때에 충분히 학습했기때문에 문법적인 것에 대한 내용은 이 글을 참고하면 된다.
https://man-25-1.tistory.com/100
문제 풀이
먼저 에러가 어떻게 발생하는지 한번 테스트 해보자
my sql에서 9e307까지 표현이 가능하다고 한다. 그래서 에러를 발생시키기 위해 9e307*3의 수를 가지고 에러를 발생시켜보자.
한글자씩 찾을때마다 pw에 더해주면서 비밀번호를 유추하면 된다.
728x90
'개인 공부 > WEB' 카테고리의 다른 글
[웹해킹] LOS 30 - (Ouroboros) (0) | 2021.07.03 |
---|---|
[웹해킹] LOS 29 - (Phantom) (0) | 2021.07.03 |
[웹해킹] LOS 27 - (Blue Dragon) (0) | 2021.07.03 |
[웹해킹] LOS 26 - (Red Dragon) (0) | 2021.07.03 |
[웹해킹] LOS 25 - (Green Dragon) (0) | 2021.07.03 |
댓글