초기 화면이다.
view-source부터 확인해 보았다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 7</title>
</head>
<body>
<?php
$go=$_GET['val'];
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
$db = dbconnect();
$rand=rand(1,5);
if($rand==1){
$result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
}
if($rand==2){
$result=mysqli_query($db,"select lv from chall7 where lv=(($go))") or die("nice try!");
}
if($rand==3){
$result=mysqli_query($db,"select lv from chall7 where lv=((($go)))") or die("nice try!");
}
if($rand==4){
$result=mysqli_query($db,"select lv from chall7 where lv=(((($go))))") or die("nice try!");
}
if($rand==5){
$result=mysqli_query($db,"select lv from chall7 where lv=((((($go)))))") or die("nice try!");
}
$data=mysqli_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]==1){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Access_Denied!')\"><p>");
}
elseif($data[0]==2){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
solve(7);
}
?>
<a href=./?view_source=1>view-source</a>
</body>
</html>
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
이 부분부터 보면, preg_match는 정규표현식과 문자열을 비교한다.
go에 '2', '-', '+', 'from', '_', '=', 공백 문자, '*', '/' 중에 하나라도 있으면 안된다.
url도 val=1로 되어있으니 go는 1이 되어있을 것이다.
rand로 (1,5) 사이 숫자를 받고 rand 값에 따라 sql 구문이 괄호 개수만 달라진다.
data로 sql 구문의 결과값을 저장하고 data의 0번째 인덱스의 값이 2이면 solve(7) 함수가 실행되며 문제가 풀린다.
즉, go변수, val값을 url에서 바꿔서 sql 구문을 조작해 data 변수 값을 조작하면 되는 문제인 것 같다.
select lv from chall7 where lv=($go) 이 구문을
select lv from chall7 where lv=(아무값) union select 2#)로 만들면 될거 같다.
2가 필터링되고 있고 사칙연산도 필터링되고 있기 때문에 %를 이용하면 된다.
go값을 333)union(select(5%3))%23 으로 해주면 된다.
%23은 #를 url인코딩한 값이다.
이렇게 url에 입력을 해주면 되는데 rand값이 1일 때만 성공적으로 실행되기 때문에 될 때까지 계속 새로고침을 눌러주면 된다.
'웹해킹 > webhacking.kr' 카테고리의 다른 글
old-11 롸업(webhacking.kr) (0) | 2023.12.05 |
---|---|
old-10 롸업(webhacking.kr) (0) | 2023.12.04 |
old-06 롸업(webhacking.kr) (0) | 2023.12.04 |
old-05 롸업(webhacking.kr) (0) | 2023.12.04 |
old-01 롸업(webhacking.kr) (0) | 2023.12.04 |