[webhacking.kr] old-7 Write-Up

두비니

·

2022. 8. 30. 18:54

 

 

webhacking.kr old-7

Write-Up

 

 

01. 문제분석

 

페이지 자체에 큰 요소는 없어보인다. 소스코드를 보자.

 

<?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>

 

 

02. Solution

 

위 소스코드를 해석하면, 우리는 GET 형식으로 val 변수를 넘겨주게 된다. 이 $val 변수는 필터링을 거쳐 select lv from chall7 where lv=($go) 등의 과정을 거치고, 이 결과가 2인 경우 문제를 풀 수 있다.

 

문제를 조금 더 풀기 어렵게 random으로 5가지 경우의 수 중에서 고르게 되어있다. 아마 맞는 페이로드를 가지고 어느정도 계속 해보라고 이렇게 짠 것 같다.

 

기본적인 생각은 다음 쿼리를 만들어내는 것이었다.

select lv from chall7 where lv=(2)

 

근데 이제 필터링이 다음과 같은...

  • 2
  • -
  • +
  • from
  • _
  • =
  • \s (공백)
  • *
  • /

 

그래서 단순히 https://webhacking.kr/challenge/web-07/index.php?val=2 같은 생각은 먹히지 않는다. 가장 먼저 했던 생각은 6%4로 2를 만드는 거였다. 그런데 6%4로 시도하면 계속 query error가 발생했다.

 

 

2가 아니라 다른 값을 넣어도 계속 에러가 생기는 것으로 봐서 DB 자체에 2라는 값이 없는게 아닐까? 라는 생각이 들었다. 그래서 union을 써서 불러와보았다. 원하는 쿼리는 다음과 같다.

 

select lv from chall7 where lv=(5%3) union 5%3

 

참고) UNION: https://www.w3schools.com/sql/sql_union.asp

 

SQL UNION Operator

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

payload는 다음과 같습니다.

0)union(select(5%3)

 

'War Games > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] old-9 Write-Up  (0) 2022.08.31
[webhacking.kr] old-8 Write-Up  (0) 2022.08.31
[webhacking.kr] old-6 Write-Up  (0) 2022.08.30
[webhacking.kr] old-5 Write-Up  (0) 2022.08.29
[webhacking.kr] old-4 Write-Up  (0) 2022.08.28