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
[웹해킹] sfw 2 - (time based sql injection)
sfw2 write up 문제를 푸는 과정에서 엄청난 삽질을 했다. los 문제풀이에서 참인 case를 만들면 출력문구가 나오는 것에 너무 익숙해져서 그 편견을 못벗어난게 문제인거같다. 그래도 그 과정에서 필
man-25-1.tistory.com
문제 풀이
먼저 에러가 어떻게 발생하는지 한번 테스트 해보자
[SQL injection] 지수 연산을 이용한 error based
mysql에서 9e2의 연산은 지수 연산으로써 9*(10*10)의 결과로 900을 나타낸다. select 9e0; ==> 9 select 9e1; ==> 90 select 9e2; ==> 900 select 9e999 ==> Error Code: 1367. Illegal double '9e999' value f..
wooeong.tistory.com
my sql에서 9e307까지 표현이 가능하다고 한다. 그래서 에러를 발생시키기 위해 9e307*3의 수를 가지고 에러를 발생시켜보자.
한글자씩 찾을때마다 pw에 더해주면서 비밀번호를 유추하면 된다.
'개인 공부 > 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 |
댓글