Level 59
<? 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')"); } ?>
전체 소스이다. if문 하나씩 살펴보자.
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(); } }
쿼리문을 보면 c59테이블에서 id와 lv값을 조회한다. 그리고 id가 존재하는 경우 id와 lv값을 출력한다.
lv의 값이 'admin'인 경우 문제가 풀리게 된다.
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')"); }
phone 파라미터 값이 20이상이면 "Access Denied"를 출력한다.
id 파라미터 값이 'admin'이면 "Access Denied"를 출력한다.
phone 파라미터 값에 'admin, 0x, #, hex ..' 등이 있으면 "Acess Denied"를 출력한다.
쿼리문을 보면 insert문을 이용하여 c59테이블에 id와 phone파라미터를 'geust'로 넣는다.
id 파라미터는 ' ' 로 감싸 있지만, phone은 감싸져 있지 않으므로, phone은 정수만 입력 가능하다.
여기서 우리는 phone 파라미터를 인젝션 포인트로 잡는다.
위와 같이 입력하게 되면, insert into c59 values('test', 1, 123)-- ,'guest'))
이렇게 값이 들어가게 된다.
결론 적으로 insert into c59 values('test', 1, 123)
이 되게 된다.
정상적으로 인젝션이 잘 이루어 지고 있음을 알 수 있다.
이제 admin이라는 문자열을 필터링을 우회하면 될 듯 하다.
insert 쿼리는 values 부분에 문자열 대신 칼럼명을 넣을 수 있다.
예를들어, insert into member(id, lv) values('test', id) 라고 입력하게 되면 lv부분에 id값이 들어가게 된다.
위 방법을 이용하여 id값에 'admin'문자열을 거꾸로 넣고, reverse함수를 이용하여 lv값을 세팅하면 될 것 같다.
위와 같이 넣게 되면, insert into c59 values('nimda', 1, 'admin')
이 될것이다.
그렇게 되면 id:nimda, phone:1, lv:admin 이 된다.