Lord of SQL Injection # troll
쿼리문이다!
query : select id from prob_troll where id=''
php코드를 간단하게 분석해보쟈.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match("/admin/", $_GET[id])) exit("HeHe");
// 입력 받은 id 에서 문자를 필터링하고 있다.
이 필터링 조건들을 우회해 주어야 할 것으로 보인다.
-> 싱글 쿼터 ('), 문자열 'admin'
$query = "select id from prob_troll where id='{$_GET[id]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("troll");
// 문제의 해결 조건이다.
id가 'admin'이면 된다는데....분명 위에서는 'admin'이라는 문자열을 필터링 해주고 있었다!
highlight_file(__FILE__);
?>
여러가지 방법들이 떠올랐다..
가장 먼저 'admin'을 hex로 바꿔 입력하는 방법이 떠올랐지만 문제가 해결되지 않았다.
' 필터링으로 의해, 입력값이 무조건 문자열 형태로 변환되어 인식되기 때문인 것 같았다.
주석처리를 통해 해결하는 방법도 떠올려봤지만 귀찮을 것 같았다..
preg_match에서
preg_match('/\'/i', ) 이런식으로 뒤에 i를 붙여 쓰게 되면,
대/소문자를 구분하지 않게 된다.
반대로 이 i를 붙여 쓰지 않으면, 대/소문자를 구분하지 않는다.
이 문제의 preg_match의 경우는
'admin'과 'ADMIN'을 다르게 여긴다는 것이다.
이렇게 작성하면, preg_match 필터링을 우회할 수 있게 된다.
(굳이 모두 대문자로 쓰지 않고,
대/소문자를 섞어서 써 주어도 우회가 가능하다!)
그리고, 데이터베이스에서는 대/소문자를 구별 없이 인식하므로
문제를 해결 할 수 있다!
생각보다 간단하게 해결했다!