d0r1

[webhacking] old 7 본문

webhacking

[webhacking] old 7

d0r1 2023. 11. 8. 10:31
<?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>

 

다음과 같이 이루어져 있는데

data[0] 가 2가 나오면 문제가 풀리는 듯 하다

 

그러나 정규표현식에 의해 2가 막혀있다

 

mysql은 다음과 같이 숫자를 표현할 수 있는데

해당 방법을 통해, 2를 표현해보자

 

그러나 쿼리에러가 발생해서 넘어가지 않음을 확인할 수 있다.

즉 이것은 val를 숫자로 받지 않고, 문자로 받고 있기 때문이라고 예측 할 수 있다

 

여기서 또 다른 방법이 있다면 union을 사용하는 것이다

 

union의 경우, 두 가지의 케이스를 모두 가져올 수 있다

 

1 union val=2

인 경우, 1인 경우와 2인 경우 두개 다 출력한다는 소리다

 

그러나 1의 경우에는 위에서 필터링에 의해 걸리기 때문에, val 검색 조건에 걸리지 않는 값을 넣어서 해당 문제를 풀 수 있다

 

https://webhacking.kr/challenge/web-07/index.php?val=8)union(select(5%3))

 

Challenge 7

 

webhacking.kr

 

8을 넣었지만, nice try가 반환되었다

 

val 비교하는 과정에서 아마도 8이 있지 않았을까라고 생각이 든다

 

없을만한 숫자를 넣어서 우회를 해보자

 

--- 

라고 생각했는데, 자세히 살펴보니까

rand(1,5)에 의해 랜덤 값이 계속 반복된다

 

즉, 2가 나올때까지 반복해야한다는 말..

열심히 반복을 하다보면 문제가 풀린다

 

문제를 자세히 안봐서 30분을 삽질 했네..

'webhacking' 카테고리의 다른 글

[webhacking] old 61  (0) 2023.11.10
[webhacking] old-56  (0) 2023.11.07
[webhacking] old-49  (0) 2023.11.07
[webhacking] old-02  (0) 2023.11.07
[webhacking.kr] old-23  (0) 2023.08.29