[webhacking.kr] old-8 Write-Up

두비니

·

2022. 8. 31. 06:37

 

 

 

webhacking.kr old-8

Write-Up

 

 

01. 문제분석

 

 

 

 

 

간단한 페이지다. 소스코드를 보자.

 

<?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"));
$ip=$_SERVER['REMOTE_ADDR'];
if(preg_match("/from/i",$agent)){
  echo("<br>Access Denied!<br><br>");
  echo(htmlspecialchars($agent));
  exit();
}
$db = dbconnect();
$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_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>

 

 

핵심 부분은 여기와 같다.

$agent=trim(getenv("HTTP_USER_AGENT"));
$ip=$_SERVER['REMOTE_ADDR'];
if(preg_match("/from/i",$agent)){
  echo("<br>Access Denied!<br><br>");
  echo(htmlspecialchars($agent));
  exit();
}
$db = dbconnect();
$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_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)");
}
?>

 

각각 HTTP_USER_AGENT 및 ip를 받아 SQL을 실행시킨다. 아래 결과가 admin으로 나오는 것이 최종 목표이다.

 

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");

 

이를 수정하기 위해서는 burp suite를 통해 수정하는 것이 필수적이다.

 

 

02. Solution

 

Burp Suite를 통해 https://webhacking.kr/challenge/web-08/의 패킷을 잡으면, 다음과 같이 USER-AGENT가 뜨는 것을 볼 수 있다. 이 값을 받아 그대로 SQL 쿼리를 실행시키기 때문에, 이를 이용해 수정하면 될 것 같다.

 

원하는 SQL 쿼리를 만들기 위해, 기존의 SQL Table을 알아볼 필요가 있다.

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

 

만약 결과값이 없을 경우 다음과 같이 chall8이라는 테이블에 각각 agent, ip, id라는 컬럼을 넣는다. 이때 우리가 id가 'admin'인 값을 넣을 수 있어야 하는데, 이는 우리가 $agent를 원하는 값으로 수정할 수 있기 때문에 SQL Injection을 진행하면 된다.

 

 

그러면 총 2개의 값이 chall8 테이블에 추가된다. 현재 chall8의 상태는 다음과 같다.

agent ip id
test 127.0.0.1 admin
aaa [실제 ip] guest

 

 

총 2개가 추가된 것을 볼 수 있다. 3개로 뜨는 이유는 맨 처음에 기본값으로 값이 잘 들어가는지 확인했기 때문이다.

 

 

그럼 이제 값이 admin으로 추출될 수 있도록 하면 된다.

User-Agent값을 이전에 admin의 data를 추가할 때 썼던 User-Agent 값으로 바꿔서 보내면?

 

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

[webhacking.kr] old-10 Write-Up  (0) 2022.09.01
[webhacking.kr] old-9 Write-Up  (0) 2022.08.31
[webhacking.kr] old-7 Write-Up  (0) 2022.08.30
[webhacking.kr] old-6 Write-Up  (0) 2022.08.30
[webhacking.kr] old-5 Write-Up  (0) 2022.08.29