<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("dragon");
highlight_file(__FILE__);
?>
쿼리문 중간에 주석 문자인 #
이 들어가 있어서 pw
부분에 무슨 짓을 해도 실제 쿼리문에 영향을 줄 수 없다.
첫 번째 힌트에서 말 한 것처럼 프로그래밍을 할 때 주석이 영향을 미치는 범위를 생각해보면 주석 문자로부터 그 줄 끝까지였다.
한마디로 다음 줄은 영향을 미치지 않는 것이다.
이 점을 응용하여 pw
에 개행 문자 %0a
를 삽입해주면 %0a
뒤에 삽입되는 구문은 다음 줄에 쓴 것으로 취급당해 주석에서 벗어나게 될 수 있다. 이를 통해 공격을 할 수 있게 된다.