늘모자란, 개발 :: [webhacking.kr] Challenge 59

늘모자란, 개발



가입을 시키고, admin으로 로그인해야되는 문제일것 같지만 소스를 보자.


<?

if($_POST[lid] && $_POST[lphone])
{
$q=@mysql_fetch_array(mysql_query("select id,lv from c59 where id='$_POST[lid]' and phone='$_POST[lphone]'"));

if($q[id])
{

echo("id : $q[id]<br>lv : $q[lv]<br><br>");

if($q[lv]=="admin")
{
@mysql_query("delete from c59");
@clear();
}

echo("<br><a href=index.php>back</a>");
exit();
}

}


if($_POST[id] && $_POST[phone])
{
if(strlen($_POST[phone])>=20) exit("Access Denied");
if(eregi("admin",$_POST[id])) exit("Access Denied");
if(eregi("admin|0x|#|hex|char|ascii|ord|from|select|union",$_POST[phone])) exit("Access Denied");

@mysql_query("insert into c59 values('$_POST[id]',$_POST[phone],'guest')");
}

?>


join은 id,phone이고,
login은 lid, lphone이다.

가입시엔 admin이라고 적어서 내는것도 안되고, CHAR와 헥스, 아스키(ascii,ord)를 쓸수가 없다.
admin으로 끼워넣을 생각하지 말라는것 같다.
그럼 요렇게는 안될까? lid에는 필터링이 상대적으로 빈약하기때문에 로그인쿼리에서 INSERT를 해서 admin으로 넣는것이다

내가 생각했던 쿼리는 요거다.

"select id,lv from c59 where id=''; insert  into c59 values(CHAR(97),CHAR(97),CHAR(97,100,109,105,110)); #$_POST[lid]' and phone='$_POST[lphone]'"


올리는 이유가 뭐냐고? 안되기 때문이다... ㅠㅠ 접근은 괜찮게 한것 같은데...
어쨌든 내생각으로 내린 결론은 ' 가 차단되고 있는것 같다. 결국 정공으로 회원가입시키고 돌파해야하는 방법밖에 없는 것 같다.

id는 ''가 있고 phone이 없으니 phone을 노리자. 아이디에 admin을 하는건 안되니 phone에다 넣고 주석처리 해보자.

문자열 함수 읽다가 REPLACE가 있어서 이렇게 시도 해보기로 했다
'1',REPLACE('zdmin','z','a') --


뭐 어디 걸리는데는 전혀 없는데, 길이에서 걸린다. 20자 제한 ㅡㅡ
저렇게만 해도 31자. 문제가 심각하다. 줄인다고 줄여봤지만 28자가 한계.. 8자를 더 지워야한다. 그러려면 인자 한개만으로 문자열 필터를 통과해야하는데, 아스키를 제외하고 인자를 한개만 받고 문자열을 어떻게 할 함수는 한개밖에 없다. REVERSE...

축약해서 이렇게 만들어봤다. 이러면 정확히 20자!라고 좋아했는데 20자도 필터링에 걸린다 하......

1,reverse('nimda')--


하여튼 이대론 할 수 없다. 다른 방법을 찾아보자.....
찾다 찾다 이런걸 발견했다 컬럼이름에 쓴걸 고대로 변수처럼 쓸수 있다는것!!!
뭐 정확하진 않았지만 해볼 가치가 있었다.

이러면 아이디에 nimda를 적어주고, reverse필드에는 id라고만 적어주면 된다. 고쳐보자.

1,reverse(id));-- 


짧다. (뒤에 띄어쓰기도 적어줘야한다)
문제 해결!


2016/04/04 01:01 2016/04/04 01:01