336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
문제 이름 : darknight
소스코드
<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";
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_darkknight where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
highlight_file(__FILE__);
?>
클리어 조건을 보면 admin의 pw을 알아내는거니 블라인드 인젝션인거같다.
먼저 필터링 된것부터 살펴보자
pw값으로는 ('),(\),
no값으로는 substr,ascii,= 등이 필터링되었다.
일단 pw값에서 쿼리를 조작하는건 불가능하다 ' ' 로 감싸져있고 여기서 조작하려면 '로 닫아줘서 새로운 쿼리를 추가해줘야 하는데
'작은따움표가 필터링되있어서 pw에서는할수가없다.
그러므로 쿼리조작은 no값에서 해줘야한다.
no를 보게되면 블라인드 인젝션에서 사용되는 substr,ascii 등과같은 함수들이 필터링되었다
또 값을 대입하지못하게 = 까지 필터링해버렸다.
이문제는 이전 골렘(golem) 문제와 같은유형이다.
골렘문제에서 사용했던대로 풀어주면 쉽게가능하다.