이번에는 49번을 풀어보겠습니다.
바로 이 직전에 했던 문제와 98% 비슷한 문제입니다.
약간 필터링이 더해진 것뿐입니다.
힌트만 보실분은 아래에 힌트를 눌러주세요 :D
그러면 바로 소스 분석으로 들어가보겠습니다.
<?
if(time()<1258110000) exit();
if($_GET[lv])
{
if(eregi("union",$_GET[lv])) exit();
if(eregi("from",$_GET[lv])) exit();
if(eregi("select",$_GET[lv])) exit();
if(eregi("or",$_GET[lv])) exit();
if(eregi("and",$_GET[lv])) exit();
if(eregi("\(",$_GET[lv])) exit();
if(eregi("\)",$_GET[lv])) exit();
if(eregi("limit",$_GET[lv])) exit();
if(eregi(",",$_GET[lv])) exit();
if(eregi("/",$_GET[lv])) exit();
if(eregi("by",$_GET[lv])) exit();
if(eregi("desc",$_GET[lv])) exit();
if(eregi("asc",$_GET[lv])) exit();
if(eregi("cash",$_GET[lv])) exit();
if(eregi(" ",$_GET[lv])) exit();
if(eregi("%",$_GET[lv])) exit();
if(eregi("%09",$_GET[lv])) exit(); // 필터링
$q=@mysql_fetch_array(mysql_query("select id from zmail_member where lv=$_GET[lv]"));
echo($q[0]);
if($q[0]=="admin") @solve(); //admin
}
?>
이번에도 역시 매우 간단한 소스들입니다.
하지만 이전 비슷한 문제보다 더 많은 필터링을 하고 있습니다.
우리의 최종목표는 admin으로 접속하는 것입니다.
지난번엔 concat()을 이용해서 admin으로 했지만, 이번에는 ( 도 )도 ',' 도 죄다 필터링을 합니다.
그리고 or 도 필터링하니 말 다했네요 ㅠ-ㅠ
하지만 우회 방법이 있습니다.
프로그래밍을 해본분이라면 다 알만한 || <- or 이라는 뜻입니다.
||의 특징은 or 처럼 띄어쓰기를 하지 않아도 된다는 것입니다.
= 은 따로 필터링 하지 않으니 바꿀 필요는 없습니다.
문제는 admin을 어떻게 집어넣느냐 인데, 바로 Hex 를 이용하면 가능합니다.
0xFF 이런형식으로 집어넣을수 있습니다.
admin => 0x61646d696e
공격 구문을 간단하게 생각해보면
123 or id=admin
이런식으로 하면 됩니다.
위에 말씀드린 것을 바탕으로 시도하면 문제가 풀립니다.
webhacking.kr 57번 (0) | 2012.11.28 |
---|---|
Webhacking.kr 55번 중간 풀이. (10) | 2012.11.05 |
Webhacking.kr 46번 write up (2) | 2012.11.04 |
Webhacking.kr 37번 Write up (2) | 2012.11.04 |
webhacking.kr 45번 write up (2) | 2012.11.02 |