본문 바로가기
해킹/webhacking.kr

[webhacking.kr] Challenge(Old) old-07 풀이

by yenua 2022. 6. 19.
반응형

https://webhacking.kr/challenge/web-07/index.php?val=1 

 

Challenge 7

 

webhacking.kr

 

문제 사이트를 보면 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);
}
?>

 get 방식으로 받아오는 인자 val이 존재하지 않으면, 1을 자동으로 대입하고, 값이 있으면 preg_match로 값에 대한 필터링을 진행한다. 이후, 랜덤하게 if문에 들어가서, 쿼리문을 실행하게 되는데 값이 제대로 나오지 않으면 nice try!가 뜨게 된다. 결론적으로는 val 값을 쿼리에 넣었을 때 그 결과의 첫번째 값이 2면 통과할 수 있다.

 

preg_match를 살펴보면 2, -, +, from, _, =, \s, *, / 를 필터링 하고 있다. 제대로 안보고 원래 부등호 쪽으로 접근했다가 필터링 부분을 다시 보니까 사칙연산 기호가 다 들어가 있길래 뭔가 계산을 하는 건가 싶었다. 보니까 나머지 연산 기호(%)가 없길래 이걸 사용해서 2를 만들었다.

 

5%3을 그냥 넣었더니 qurry error가 났다. 처음에는 문구 자체만 보고 5%3이 잘못된건가 싶어 찾아봤었는데, 소스코드를 다시 보니 qurry error는 쿼리의 결과가 안 나왔을 떄 출력되는 값이었다. union으로 그냥 2가 나오게 해보자.

 

1 union select 2 로 입력했더니, denied 당했다. 공백이 문제인가 싶어서 다른 화이트스페이스들 다 넣어봤는데 다 막혀 있었다... 코드 상에는 안나와있는거 같은데! +가 문제인가?

아무튼 특정 코드들은 공백을 괄호로 바꿀 수도 있는데, 마침 랜덤 조건문에서도 괄호를 사용 중이므로 아래와 같이 exploit을 작성했다.

0)union(select(8%3)

이렇게 입력했는데, 안됐다. 랜덤 조건문이 있는 이유가 있을 것 같아 찾아보니 괄호가 연속적으로 들어가면 우리가 생각하는 값과 다르게 나오게 되는데 그런 이유로 $rand이 1이 될 때까지 새로고침을 해주어야 통과할 수 있게 된다.

굉장히 여러번 새로고침을 해주었었는데, 워게임 문제면서 나빴다.. rand 값 정도는 출력시켜 주지 내가 잘못된 것인 줄 알았다.

 

 

 

 

 

반응형