본문 바로가기
웹 해킹/Webhacking.kr

[Webhacking.kr] old-07

by L3m0n S0ju 2021. 8. 27.

 

 

 

 

문제 서버로 접속하면 위와 같이 auth와 소스코드를 볼 수 있다. 소스코드는 아래와 같다.

 

 

 

 

 


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

 

 

 

 


소스코드를 요약하면 go에 2를 넣으면 문제를 클리어할 수 있다. 문제는 필터링 부분이다.

 

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

 

/2      -> 숫자 2 사용불가

-        -> 주석 사용불가

\+     -> +문자 사용불가

=       -> = 사용불가

\\s   -> \s는 공백문자[\t\r\n\v\f] 사용불가 

        \t -> Tab : %09

        \r -> Carrage Return(\r) : %0d -> 커서를 현재 행의 맨 좌측으로 옮기기

        \n -> Line Feed(\n) : %0a -> 커서를 현재 행의 다음 행으로, 즉 아래로 내리기
        \v -> Vertical Tab -> 수직 탭

 

 

 

 


select lv from chall7 where lv=(($go))

 

익스플로잇은 위 명령어가 실행될때를 가정한다. 확률은 20프로이지만 여러번 실행하면 된다. $go변수에 주입할 sql injection은 아래와 같다.

 

0)union(select(char(50

 

위 sql문을 입력하면 select lv from chall7 where lv=((0)union(select(char(50)) 다음과 같이 문장이 완성되어 char(50)은 아스키 코드값으로 숫자 2를 의미하므로 lv에는 숫자 2가 저장된다. lv 컬럼에 숫자 0값을 가진 데이터가 없다면 unionㅇ으로 추가한 2만 남게된다.

 

 

 

 


'웹 해킹 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-15  (0) 2021.09.04
[Webhacking.kr] old-08  (0) 2021.08.31
[Webhacking.kr] old-06  (0) 2021.08.27
[Webhacking.kr] old-05  (0) 2021.08.26
[Webhacking.kr] old-04  (0) 2021.08.26

댓글