Webhacking.kr 8번 문제풀이

동스토리 ㅣ 2020. 11. 3. 20:12

반응형

 

안녕하세요.

웹 해킹 8번 문제 풀이하겠습니다.

 

소스를 보면 다음과 같다.

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

 

[Line: 15] agent에 "HTTP_USER_AGENT"값을 넣어주고 있다. 

* trim(): 문자열의 양쪽 공백을 제거하는 함수

 

[Line: 17~21] agent에 "from"이 대/소문자로 입력되는 경우 "Access Denied!" 문구를 출력한다.

 

* preg_match($pattern, $subject [,$matches])

: preg_match() 함수는 정규 표현식에 해당하는 패턴이 검색되면, 더는 검색하지 않고 검색을 중단합니다.

이 함수는 일치하는 패턴이 존재하면 1을 반환하고, 존재하지 않으면 0을 반환합니다.

i 플래그: 대/소문자를 구분하지 않는다.

 

* htmlspecialchars(): 문장 내에 HTML 코드가 들어가는 특수 문자를 포함시켜 입력한 후 화면으로 출력할 때 그 HTML 특수 문자가 HTML 태그로 적용되어 출력되는 것이 아니라, HTML 특수 문자가 일반 문자로 인식되어 그대로 출력되도록 해줍니다.

[Line: 23~24] count_ck에 id를 넣어주고 70개 이상일 경우 db에서 삭제한다.

 

[Line: 26~35] agent가 현재의 "HTTP_USER_AGENT"와 같은지 체크한 후 ck에 넣어준다.

그중 ck [0]이 admin일 경우 문제가 풀린다.

 

[Line 37~40] agent가 현재의 "HTTP_USER_AGENT"와 같지 않을 경우, agent, ip, guest의 값을 넣어준다.

 

--> agent에 ip와 id값에 sql injection을 시도하면 문제가 해결된다.

 


 

values('{$agent}', '{$ip}', 'guest')

 

agent값에 SQL 인젝션을 시도하여 $agent = a','1.1.1.1','admin'),('b을 넣어주면,

 

values('a','1.1.1.1','admin'),('b','{$ip}','guest')을 만들 수 있다.

 

그렇다면, Burp Suite를 사용하여 User-Agent값을 변경해주면

db에 admin과 guest가 들어간 것을 확인할 수 있다.

다시 admin에 agent인 a를 User-Agent에 변경 후 시도하게 되면

 

감사합니다.

 

 

 

반응형

'Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 10번 문제풀이  (0) 2020.11.08
Webhacking.kr 9번 문제풀이  (0) 2020.11.07
Webhacking.kr 7번 문제풀이  (0) 2020.07.25
Webhacking.kr 6번 문제풀이  (0) 2020.06.13
Webhacking.kr 5번 문제풀이  (0) 2020.06.10