[ LS - 09 ] 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]);
$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");
highlight_file(__FILE__);
?>
PHP 문법
strtolower()
- 소문자로 치환된 문자열을 반환
- 예시)
$string="I aM APpLE";
echostrtolower($string); - 결과)
i am apple
str_replace()
- 해당 되는 문자열을 원하는 문자열로 치환
- 예시)
$string = "abcdefabcdef";
$result = str_replace ("abc", "zzz", $string);
결과)
echo $result; // 출력 결과 : zzzdefzzzdef
코드 해석
if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
- ' 필터링 수행
$_GET[id] = strtolower($_GET[id]);
- 입력된 문자를 모두 소문자로 변환
$_GET[id] = str_replace("admin","",$_GET[id]);
- admin 문자열이 들어올 경우 ""(빈칸) 으로 치환
if($result['id'] == 'admin') solve("vampire");
- id가 admin이면 문제 해결
문제 해결
admin이 ""(빈칸)으로 치환되지만 함수 처리 이후 admin이 Injection 되도록 수행
- GET 방식으로 URL에 SQL 대입 ( ?id=adadminmin )
- query : select id from prob_vampire where id='admin'