728x90
<?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);
}
?>

val 인자의 값을 go 변수에 저장하여 이용한다.

preg_match 함수는 정규표현식을 이용하여 필터링한다. 2, -, +, from, _, =, 공백, *, / 를 필터링 하고 있다.

rand 함수는 1이상 5이하의 값을 랜덤으로 선택한다. rand 값에 따라 쿼리가 달라지고 쿼리 실행 결과값이 2라면 문제가 풀린다.

단순히 val 인자에 2를 주면 필터링 되기에 우회해야한다. % 연산자를 사용할 것이다. % 연산자는 나머지를 구하는 연산자다. 예를 들면 5%3은 2다. mod도 동일한 연산을 한다. 5 mod 3 또는 mod(5,3) 방식으로 사용가능하다.

val에 5%3을 넣으면 query error가 뜰 것이다. 코드를 보면 쿼리의 실행 결과값이 없는 것이다. 즉, lv가 2인 데이터는 db에 존재하지 않는다. 그럼 억지로 2를 반환하게 해야한다. 이때 union select 문을 사용한다.

val=9999)union(select(5%3)

9999는 db에 없을 것 같은 값을 고른 것이다. 공백은 필터링 되기에 괄호를 이용해야한다. 쉽게 이해될 것이다.

rand 값이 1인 경우가 얻어걸릴 때까지 시도해야한다. 괄호 개수가 문법에 맞게 일치하는 경우는 rand=1인 경우 뿐이기 때문이다. rand=1인 경우 앞 뒤로 괄호가 한 개씩 붙는 것을 볼 수 있다. 쿼리는 아래와 같이 완성될 것이다.

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

결과적으로 union 앞의 select는 반환 값이 없을테지만 뒤의 select는 2를 반환하여 최종적으로 2가 반환된다.

 

728x90

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

old-09  (0) 2023.02.20
old-08  (2) 2023.02.18
old-06  (0) 2023.02.18
old-05  (0) 2023.02.18
old-04  (0) 2023.02.18

+ Recent posts