호빵둥이 IT Blog

Webhacking.kr 8번 풀이 :: 호빵둥이 IT Blog 본문

프로그래밍/[워게임]Webhacking.kr

Webhacking.kr 8번 풀이 :: 호빵둥이 IT Blog

d2n0s4ur 2020. 5. 18. 20:00

 

 

 

 

 

안녕하세요!

 

오늘은 워게임, Webhacking.kr Chellenge 8번 문제를 풀어보도록 하겠습니다.

 

이번 문제는 SQL 인젝션과 패킷 조작을 사용한 문제입니다.

 

패킷 조작은 며칠 전 포스트 올렸던 Burp Suite 프로그램을 사용하도록 하겠습니다.

 

 


링크 : [프로그래밍/프로그램 소개] - 해킹툴 Burp Suite 설치 및 간단한 사용법 알아보기 :: 호빵둥이 IT Blog

 

해킹툴 Burp Suite 설치 및 간단한 사용법 알아보기 :: 호빵둥이 IT Blog

허락받지 않은 해킹은 불법행위입니다. 본 포스트는 해당 프로그램의 사용법을 알려주는 것이며 법에 어긋나는 행위를 했을 경우 책임지지 않습니다. 안녕하세요! 이번에 Webhacking.kr 8번 문제를

h-bread.tistory.com


 

 

 

#문제 보기


https://webhacking.kr/challenge/web-08/

 

Challenge 8

 

webhacking.kr

 

다음에 접속해서 문제를 확인합니다.

 

 

hi guest라고 반가주는 모습.

 

 

View-source를 클릭해 문제를 확인해보도록 하겠습니다.

 

 

 

 

 

 

 

#소스코드 분석하기


 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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>
cs

 

 

마찬가지로, 필요 있는 부분만 따로 보도록 하겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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)");
}
?>
cs

 

 

2번째 줄에서 $agent에 USER_AGENT 값을 저장합니다. 이때 Trim() 함수를 사용해서 혹시나 있을 양쪽 스페이스바를 모두 지워줍니다.

 

3번째 줄에서 $ip에 ip값을 넣어줍니다.

 

4 ~ 8번째 줄에서 $agent 값에 from 또는 FROM이 들어가면 Access Denied! 를 출력합니다.

 

USER_AGENT값을 이용해서 데이터를 SELECT 하는 구문을 막기 위해서 인 것 같습니다.

 

10 ~ 11번째 줄에서 id 개수가 70개 이상이면 DB에서 지워줍니다.

 

13 ~ 22번째 줄에서 agent 변수가 현재 접속한 유저의 USER_AGENT와 같은지 비교하고, 만약 같다면 체크를 해줍니다.

 

그중에서도 agent의 id가 admin이면 문제가 풀리는 구조입니다.

 

만약 agent 변수가 존재하지 않는다면 24 ~ 27번째 줄에서 agent와 ip, id를 넣어줍니다.

 

그러면, USER_AGENT를 이용해서 SQL 인젝션을 시도해보도록 하겠습니다.

 

 

 

 

 

 

 

#문제 풀기


 

 

$ck == false일 때 

 


insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')


 

다음 쿼리문이 실행됩니다.

 

현재 우리가 건드릴 수 있는 값이 $agent 이므로,

 

이를 이용해서 SQL 인젝션을 시도합니다.

 

$agent = a','1.1.1.1','admin'),('b 값을 넣어주면,

 

 

 


insert into chall8(agent,ip,id) values('a','1.1.1.1','admin'),('b','{$ip}','guest')


 

 

즉, 결과적으로 chall8이라는 Table에

 

('a','1.1.1.1','admin'), ('b','{$ip}','guest') 이렇게 값이 2개가 들어갈 것입니다.

 

이후에 다시 접속할 때 USER_AGENT에 'a'를 넣어서 접속을 시도하면, 문제가 풀릴 것입니다.

 

Burp Suite을 사용해서 패킷을 조작해보도록 하겠습니다.

 

Proxy 서버를 켜고 Burp에 접속하겠습니다.

 

 

 

Burp Suite에 들어간 모습

 

 

이후 메뉴에서 [Proxy] > [Intercept] > [Intercept is off]를 클릭해 Intercept를 켜줍니다.

 

다시 https://webhacking.kr/challenge/web-08/에 접속하고 엔터를 치면,

 

Challenge 8

 

webhacking.kr

 

 

패킷수정이 가능하다.

 

 

User-Agent 속성을 "a','1.1.1.1','admin'),('b"로 수정한 다음 Forward를 눌러줍시다.

 

 

User-Agent를 변경하고 Forward를 눌러주자

 

 

그러면,

 

 

성공적으로 수정된 패킷이 보내졌다.

 

 

성공적으로 2개의 값이 들어간 것을 확인할 수 있습니다.

 

1개는 admin으로 들어간 데이터이고, 1개는 자신의 아이피로 등록된 guest입니다.

 

이제 다시 F5를 눌러주고,

 

 

User-Agent를 수정하자.

 

 

User-Agent를 a로 수정하고 Forward를 눌러주면,

 

 

문제를 풀었다!

 

 

문제가 풀렸습니다!

 

 

 

 

 

#연관된 활동


 

 

이번에는 처음으로 Burp Suite 툴을 사용해봤습니다.

 

실제로 Burp Suite는 웹의 취약점을 찾거나 테스트를 하기 위한 목적으로 많이 사용됩니다.

 

해당 툴의 간단한 사용방법은 익히는 것을 추천드립니다.

 

 

 

 

 

모든 인터넷 연결은 '패킷'을 주고받는 행위로 생각할 수 있습니다.

 

패킷의 구조를 익혀두는 것을 추천드립니다.

 

(추후에 따로 포스트 올리도록 하겠습니다)

 

 

이상으로 Webhacking.kr 8번 문제 풀이를 마치도록 하겠습니다!

 

 

 

 

 

 

 

 

포스트 잘 보셨다면 하단에 ♡ 꼭 눌러주시길 부탁드립니다!

(♡ 는 블로거에게 큰 힘이 됩니다)

 

 

 

[이전글] : 2020/05/17 - [프로그래밍/[워게임]Webhacking.kr] - Webhacking.kr 7번 풀이 :: 호빵둥이 IT Blog

 

Webhacking.kr 7번 풀이 :: 호빵둥이 IT Blog

안녕하세요! 오늘은 워게임, Webhacking.kr Chellenge 7번 문제를 풀어보도록 하겠습니다. 이번 문제는 SQL 인젝션을 사용한 문제입니다. #문제 보기 https://webhacking.kr/challenge/web-07/index.php?val=1 Ch..

h-bread.tistory.com

[다음글] : 2020/06/19 - [프로그래밍/[워게임]Webhacking.kr] - Webhacking.kr 9번 풀이 :: 호빵둥이 IT Blog

 

Webhacking.kr 9번 풀이 :: 호빵둥이 IT Blog

안녕하세요! 오늘은 워게임, Webhacking.kr Chellenge 9번 문제를 풀어보도록 하겠습니다. 이번문제는 SQL블라인드인젝션을 사용한 문제입니다. #문제 보기 우선 https://webhacking.kr/challenge/web-09/ 에 접..

h-bread.tistory.com

 

Comments