Wargame/Webhacking.kr

webhacking.kr - old 07

G_OM 2024. 3. 22. 13:24

 

 

문제화면이다.

 

소스코드를 한번 보자.

 

 

 

 

 

 

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

 

 

 

1.GET 요청에서 'val' 매개변수 값을 가져와 '$go' 변수에 저장한다.

2.'$go' 변수가 없거나 비어있다면 'val' 매개변수 1로 설정 후 재로딩

3. 정규표현식을 통한 입력 필터링

4.'$go' 변수 에 따라 'cha117' 테이블에서 'lv' 열을 선택하는 쿼리를 실행한다. [1~5 난수]

5.querry의 결과가 '2'면 문제가 풀린다.

 

SQL Injection 문제이다.

 

 

 

if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");

 

필터링을 먼저 우회해야하기 때문에 필터링부터 살펴보자.

 

'2' : 문자열에 문자 '2' 거부

'|' : OR 연산자 거부

'-' : 문자열 '-' 거부

'\+' : 특수 문자 + 거부

'from' : 문자열 'from' 거부

'_' : _(언더스코어) 거부

'=' : 문자열에 등호(=) 거부

'\s' : 공백 문자(띄어쓰기,탭,줄바꿈) 거부

'\*' : 문자열에 '*' 거부

'\/' : 문자열에 슬래시(/) 거부

'i' : 대소문자에 구분하지 않는다.

 

 

일단 사칙연산에 대해서 다 필터링을 해두었다.

 

필터링에 포함되지않은 '%'[나머지 값 연산자]을 사용하면 된다.

 

그리고 UNION SELECT [ 쿼리문들을 합쳐 하나의 쿼리문으로 만듦] 도 사용하자.

 

 

 

 

 

 

 

 

 

 

 

val 값은 1[기존 val 값],2 [필터링]을 피해서 임의 의 수 13이라고 했고

 

UNION (SELECT(5%3)) : 5%3 , 5를 3으로 나눈 값 나머지값 2를 가지고 된다.

 

%23 : URL 인코딩 주석처리 SELECT 부분 이후에 주석 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

난수가 있기에 새로고침을 몇번 해야 한다.