아래는 서버코드다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");
$query = "select id from prob_wolfman 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("wolfman");
highlight_file(__FILE__);
?>
전 문제들과 비교했을 때 코드를 보면 특별한 건 없고
아래 정규식 문자들을 필터링하는 것 까지는 똑같다.
허나 공백을 필터링한다.
하지만 지금껏 문제를 풀 때 자연스럽게 탭을 url인코딩한 %09로 우회하고 있었다.
그걸 사용하면 될 거 같다.
아래 pw에 인젝션을 해야한다.
익스플로잇을 짜면 아래와 같이 짜보았다.
or 연산으로 전자의 식이 거짓이 나오고 후자의 식이 admin으로 참이나와서 admin의 id를 가져오게 할 것이다.
공백을 우회하기 위해서 url에서 %09로 우회했다.
아래와 같이 했다.
그랬더니 성공적으로 flag를 얻을 수 있다.
아직까지 특별하게 어려운 난이도는 나오지 않은 것 같다.