LOS # vampire
쿼리문은 이렇다.
query : select id from prob_vampire where id=''
코드를 분석해보자.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
// 역시나 싱글쿼터가 필터링되고 있다.
$_GET[id] = strtolower($_GET[id]);
$_GET[id] = str_replace("admin","",$_GET[id]);
// id를 입력받은 뒤에, 이를 replace 하고 있다.
<str_replace()>
: 보통 단순히 문자열을 다른 문자열로 치환할 때 사용하는 함수
사용 형식
: str_reaplce("문자열", "치환 문자열", 치환 시작 index)
치환 시작 index부터 규칙에 따라 치환이 이루어진다.
$query = "select id from prob_vampire 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("vampire");
// replace한 이후의 값이 'admin'이면 문제가 해결될 것으로 보인다.
highlight_file(__FILE__);
?>
치환된 이후의 값이 'admin'이 되어야 하는 문제이므로,
역방향으로 문제를 풀어나가면 될 것 같다!
admin이 " " 공백으로 치환되므로,
adadminmin
-> ad" "min
->admin
이 될 것이다.
그러므로 adadminmin을 입력해주면 된다.
(str_replace()함수 우회의 너무나 대표적인 예시이다..!)
문제를 쉽게 해결했다!