Webhacking.kr old-7번 문제입니다.
소스코드 링크와 auth가 있습니다 일단 접속 해보겠습니다.
접속이 안된다는 군요 어쩔수 없이 소스코드를 보겠습니다.
<?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>
코드를 해석하면 rand(1,5)로 새로고침할때마다 1~5중 랜덤하게 값이 정해집니다.
쿼리가 실행에 실패하면 nice try가 출력되며
성공하면 $data 값이 나오는데 랜덤한 숫자만큼 $go를 감싸고 있는 것으로 보입니다.
즉, nice try가 떠도 구문은 성공했으나 20%확률로 통과가 된다는 것입니다.
맨 아래 코드에서는 $data[0]==2일때 solve(7)이 실행되므로 값을 2로 맞춰야 한다는 것을 알 수 있습니다.
그럼 2를 대입하면 되는데 preg_match()에서 필터링이 걸려있습니다. (2, - ,+, from, _ , = , \s , * , \ )들이 필터링되어 전송되는 것을 보아 우리는 필터링을 우회하면서 2라는 값을 출력해야 한다는 것입니다.
가장 간단하게 5%3을 먼저 해보겠습니다.
이게...에러가 나는군요 어디서 왜 에러가 났는지는 공부가 부족해서 모르겠습니다.
어쨋든 nice try는 뜨지 않았으니 코드 작성에 실패한 것같습니다.
아까 필터링에 + - 도 막혀있어 어떻게 하나 해맸는데
from이 막혀있는걸 보고 SQL문이 생각 났습니다
SELECT 문은 SELECT 6을 입력하면 6이 출력됩니다. 이것을 이용하면 될것 같습니다.
일단 2 가 필터링으로 걸려있으니 CHAR(50)을 사용해 2를 표현하겠습니다.
SQL문을 작성하는데 필요한 공백이 필터링에 걸려있으니 ( )를 사용해 대체하겠습니다.
이걸 몰라서 시도했다가 Access Denied를 봤습니다.
여기에 SELECT 문을 연결하는 합집합 역할을 하는 UNION문이 필요합니다.
최종 코드는 아래와 같이 됩니다.
val=100을 지정한 이유는 기본값인 1을 하면 앞의 구문이 실행되어 버리는 불상사를 방지하기 위해서입니다.
어떻게 알았냐면...알고싶지 않았어요
기본값을 1로 설정하고 3분간 새로고침을 했는데 20%가 이렇게 안맞아? 하면서 통과되지 않아 찾아보니
앞의 값이 True가 되면 안된다고 합니다. 그래서 val에 없을 만한 값 100으로 지정했습니다.
최종적으로 작성한 코드를 실행하면 당연히 한번에 안됩니다.
랜덤한 1~5이므로 여러번 새로고침해서 랜덤한 값과 일치할때를 찾아야합니다.
그래도 nice try!가 출력됬으니 구문은 실행된것으로 보입니다.
대략 10여번 새로고침하니
문제가 해결되었습니다!
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup 17번 문제 (0) | 2022.07.06 |
---|---|
Webhacking Writeup 16번 문제 (0) | 2022.07.06 |
Challenge(old)-03번 문제 Writeup (0) | 2022.06.15 |
Challenge(old)-11번 문제 Writeup (0) | 2022.06.15 |
Challenge(old)-10번 문제 Writeup (0) | 2022.06.15 |