참고 URL
- XML에 대한 자세한 설명: http://tcpschool.com/xml/intro
- http://blog.skinfosec.com/220707575523
- XXE에 대한 설명(영문): https://www.acunetix.com/blog/articles/xml-external-entity-xxe-vulnerabilities/
- XXE를 이용항 여러 공격(한글): https://beistlab.files.wordpress.com/2015/01/grayhash_intro_xxe.pdf
1. Introduction
1.1. XML이란?
- Extensible Markup Language의 약자
- 다목적 마크업 언어로 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하기 위해 사용
- 데이터를 저장하고 전달하는 목적으로 사용 (데이터를 보여주는 목적 X
- 태그가 미리 정의되어 있지않고, 사용자가 직접 정의 가능
- 종료 태그가 반드시 포함되어야함 → 생략 시 에러
- 태그 사용 시 대소문자, 띄어쓰기 구별
- 속성값은 반드시 따옴표로 구별
1.2. XPath란?
- XML Path Language의 약자
- XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어
- XML 문서를 탐색하기 위해 경로 표현식(path expression) 사용
- 절대경로(/로 시작하며 루트 노드부터 탐색)와 상대경로(기준으로 지정되는 노드부터 탐색)로 나타냄
2. XPATH(XML Path Language) Injection
2.1. XPATH Injection이란?
- SQL Injection과 비슷하지만 서버에 XPATH 쿼리를 조작하여 요청 후 로그인 우회 및 데이터 추출 등이 가능한 취약점
- form 필드나 URL 파라미터에 인젝션 시도
- XML 기반의 인증 시스템이 구현된 경우, 인증 우회가 가능
2.2. 공격방법?
다음의 users.xml을 기반으로 로그인 처리가 된다고 가정하자.
[users.xml]
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<username>admin</username>
<password>admin123</password>
<role>admin</role>
</user>
<user>
<username>testest</username>
<password>testest123</password>
<role>guest</role>
</user>
</users>
정상적으로 admin으로 로그인할 경우, XPath 쿼리는 다음과 같으며, role에 들어있는 값을 반환한다.
string(//user[username/text()='admin' and password/text()='admin123']/role/text())
이 때, 사용자 입력값을 적절하게 필터링하지 않는 경우, SQL Injection과 동일하게 username과 password 입력창에 ' or '1'='1을 입력하면 Xpath Injection이 가능하다.
공격 시 완성되는 쿼리문은 다음과 같다.
string(//user[username/text()='' or '1'='1' and password/text()='' or '1'='1']/role/text())
위의 쿼리는 결과값이 항상 참이므로 로그인 우회가 가능하다.
2.3. 대응 방안?
- SQL Injection과 동일하게 방어 (싱글쿼터('), 더블쿼터(") 등의 특수 문자 필터링)
3. XXE(XML External Entities) Injection
3.1. XXE Injection이란?
- Server-side Request Forgery(SSRF)의 일종
- XML의 DTD (Document Type Definition)를 조작하여 가능
** DTD : 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의
XML 문서 하나에 오직 1개의 DTD만 존재 가능
- XML 문서의 외부참조 기능을 이용하여 서버의 중요정보 파일을 가져오거나, 오픈포트 등을 확인하는 공격
3.2. 공격방법?
3.2.1. 환경 구성
[xxe.php]
<html>
<body>
<meta charset='utf-8'/>
<php?
$xml=$_POST['xml'];
if($xml){
$doc = simplexml_load_string($xml);
}
?>
<form method="post">
<textarea name="xml" rows="12" cols="100">
<?
echo $xml;
?>
</textarea>
<input type="submit">
</form>
<?
echo $doc;
?>
</body>
</html>
3.2.2. DTD 변경 시도
3.2.3 SYSTEM 함수 이용한 로컬파일 읽기
- SYSTEM 함수 - 외부 문서를 불러올 수 있는 기능 제공
3.3. XXE Injection의 한계?
- DTD 선언이 가능해야 함
- 불러오는 외부 리소스가 DTD 문법에 어긋나지 않아야 함
- Binary 파일 불러오기 불가
- 파일 불러오기의 경우, 서버 구동 사용자((예) apache, nobody 등)가 해당 파일에 대한 읽기(r)권한이 있어야 불러오기가 가능함
3.4. 대응 방안?
- 근본적인 해경방안으로는 entity 기능을 비활성화
- 안전한 함수 사용(PHP 기준)::
-> libxml_use_internal_errors(true) : XML 파싱 도중 오류가 발생했을 경우, 오류 메시지 출력을 하지 않게 막아주는 함수-> libxml_disable_entity_loader(true) : 외부 리소스를 불러오지 못하게 하는 함수
'Hacking > Web' 카테고리의 다른 글
[취약점] File Inclusion 취약점 ① - LFI(Local File Inclusion) (0) | 2018.03.19 |
---|---|
[기타] PHP Session 저장 원리 (0) | 2018.03.16 |
[기타] apmsetup7 설치 (0) | 2018.03.16 |
[기타] 자바스크립트를 통한 Xecureweb(제큐어웹) 적용 시 파라미터 확인 및 변조 (0) | 2018.03.12 |
[기타] 정규표현식 (0) | 2018.02.22 |