아래는 서버 코드이다.
<?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");
$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");
highlight_file(__FILE__);
?>
이번 문제는 정말 매우 쉬운 난이도이지만 코드를 잘 살피지 않은 나는 시간을 좀 쓰게 되었다.
코드를 보면 싱글쿼터와 admin이라는 문자열을 필터링 하고 있다.
싱글 쿼터를 어떻게든 닫아줘야 문자열 우회를 할 수 있을 것 같아서 아래와 같은 시도들을 여러번 했다.
아래를 보자.
대표적으로 한 시도 하나를 뽑겠다.
아래에 id에 쿼리를 인젝션 해야하는데
백 슬래시를 사용해서 해봤지만 역시 싱글 쿼터를 닫지 못했고 16진수로 우회한 문자열은 의미가 없었다.
그러던 중 아래 정규식을 다시 보게되었는데 뒤에 i가 없는 것을 확인했다...
i는 대소문자를 구별안하겠다는 표시인데 i가 없으므로 A와 a는 엄연히 다른 문자로 취급이 되었다.
그래서 아래와 같이 admin이 아닌 Admin으로 해주었더니 정규식에서는 우회가 되면서 sql에서는 대소문자 구별이 없기 때문에 성공적으로 admin을 가져올 수 있었다.