webhacking.kr 7번 문제풀이 Write Up 입니다.

인증을 하면 admin 페이지로 접속할 수 있나 봅니다.

당연히 인증은 되지 않습니다.

view-source를 눌러 소스코드를 살펴봅니다.
조건에 맞으면 인증가능한 auth 버튼이 생성되는 것 같습니다.
<?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);
}
?>
이 코드가 핵심인 것 같습니다.
SQL 문이 있는 것을 보니 SQL Injection을 시도하라는 것 같...아 보이지만 그냥 preg_match로 filtering 걸려있는 것을 우회하는 것 같습니다.
일단 코드에 따르면 SQL 구문 결과가 2가 되면 될 것 같습니다.
GET 방식으로 $go 변수의 값을 받아 오는 것 같은데, 기본값은 1임을 확인할 수 있습니다.

당연하지만 이렇게 하면 preg_match 때문에 작동이 되지 않습니다.

preg_match에서 %(나머지값연산) 연산자는 filtering 되지 않기에 5%3을 넣어 보았습니다.
그런데 query error라고 합니다.
select lv from chall7 where lv=(2) 에 관한 결과가 없는 것 같습니다.
강제로 2를 넣어야 할 것 같은데, union을 이용해 SQL문을 작성해봅니다.
select lv from chall7 where lv=(3)union(select(5%3)) 이렇게 union으로 구문을 합쳐줍니다. 이렇게 되면 union에 의해 두 구문 중 작동되는 구문이 실행됩니다.
중간에 들어가는 3)union(select(5%3) 를 URL에 입력합니다.
괄호를 쓰는 이유는 공백이 filtering되기 때문입니다.
처음 숫자는 1 말고 아무거나 입력하면 됩니다. 여기서는 3을 입력했습니다.

혹시 [그림 6]처럼 작동이 안 된다면 될 때까지 시도해야 합니다.
rand()가 1이 아니라서 그렇습니다.

여러 번 시도하면 정답처리 됩니다.
'CTF > webhacking.kr' 카테고리의 다른 글
[CTF] webhacking.kr 10번 Write-Up (0) | 2022.10.14 |
---|---|
[CTF] webhacking.kr 8번 Write-Up (0) | 2022.10.14 |
[CTF] webhacking.kr 6번 Write-Up (0) | 2022.10.11 |
[CTF] webhacking.kr 5번 Write-Up (0) | 2022.10.11 |
[CTF] webhacking.kr 4번 Write-Up (0) | 2022.10.11 |
댓글