los : darkelf
[코드분석]
<?php
include "./config.php";
login_chk();
dbconnect();
↑DB분석을 위한 코드
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
↑preg_match를 통한 필터링. or 과 and 가 포함된 입력값은 필터링
$query = "select id from prob_darkelf 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>";
if($result['id'] == 'admin') solve("darkelf");
↑문제의 포인트
[내 풀이]
코드를 통해 id='admin'일 때 문제가 해결된다고 한다.
앞의 문제와 비슷한 유형이지만 필터링하는 문자열이 다르다.
앞에서는 공백을 필터링해서 공백대신 가능한 문자열로 대체해주었다.
그렇다면 이번 문제는 or 과 and 를 필터링하는 경우이므로 or 과 and를 대체해줄 문자열로 대신해주면 된다.
구글링해본 결과,
or 은 || 으로 and 는 && 로 대체하여 우회가능하다.
이상하게도 fail 하였다. ㅠㅠ
고민하다가 혹시나 하는 생각에 | 와 & 의 url 에서의 문자로 찾아보았다.
( url 인코딩 → | 은 %7c 그리고 & 은 %26 )
SUCCESS !!!
[p.s]
|| 과 && 를 인코딩한 문자열로 하지 않은 경우에 쿼리가 왜 중간이 잘려나갔는지 모르겠다. ㅠㅠ
이거 역시 내일 민지언니에게 물어봐야징 ㅎ.ㅎ
물어본 결과!!
&랑 #은 문자열 그대로 넣으면 인식은 못하더라고 한다. 아직 언니두 이유는 모르신다구 한다.