PHP環境XML外部實體注入防禦(XXE)

2021-10-22 18:47:27 字數 2960 閱讀 9370

php 7.0.30

libxml 2.8.0

為了演示php環境下的xxe漏洞,本例將libxml2.8.0版本編譯進php中。php 版本並不影響xxe利用。

使用如下命令編譯並啟動環境:

cd vulhub/php/php_xxe

docker-compose up -d

web目錄如下

$ tree .

.├── dom.php # 示例:使用domdocument解析body

├── index.php

├── ******xmlelement.php # 示例:使用******xmlelement類解析body

└── ******xml_load_string.php # 示例:使用******xml_load_string函式解析body

dom.php、******xmlelement.php、******xml_load_string.php均可觸發xxe漏洞,具體輸出點請閱讀這三個檔案的**。

如dom.php**如下

<?php 

$data

=file_get_contents

('php://input');

$dom

=new

domdocument()

;$dom

->

loadxml

($data);

print_r

($dom);

?>

其中file_get_contents(「php://input」):

php://input 是可以訪問請求的原始資料的唯讀流。

post 請求的情況下,最好使用 php://input 來代替 $http_raw_post_data,因為它不依賴於特定的 php.ini 指令。

而且,這樣的情況下 $http_raw_post_data 預設沒有填充, 比啟用 always_populate_raw_post_data 潛在需要更少的記憶體。

enctype=「multipart/form-data」 的時候 php://input 是無效的。

1, php://input 可以讀取http entity body中指定長度的值,由content-length指定長度,不管是post方式或者get方法提交過來的資料。但是,一般get方法提交資料 時,http request entity body部分都為空。

2,php://input 與$http_raw_post_data讀取的資料是一樣的,都只讀取content-type不為multipart/form-data的資料。os

t2,p

hp不能

識別的c

onte

nt−t

ype類

型的時候

,會將h

ttp請

求包中相

應的資料

填入變數

_post 2,php不能識別的content-type型別的時候,會將http請求包中相應的資料填入變數

p​ost2

,php

不能識別

的con

tent

−typ

e型別的

時候,會

將htt

p請求包

中相應的

資料填入變數o

st資料

相一致。

5,ph

p://

inpu

t資料總

是跟_post資料相一致。 5,php://input資料總是跟

p​ost數

據相一致

。5,p

hp:/

/inp

ut資料

總是跟http_raw_post_data相同,但是php://input比htt

praw

post

data

更湊效,

且不需要

特殊設定

php.

ini6

,php

會將pa

th欄位

的que

rypa

th部分

,填入全

局變數http_raw_post_data更湊效,且不需要特殊設定php.ini 6,php會將path欄位的query_path部分,填入全域性變數

更湊效,

且不需要

特殊設定

php.

ini6

,php

會將pa

th欄位

的que

ryp​

ath部

分,填入

全域性變數

_get。通常情況下,get方法提交的http請求,body為空。

7、file_get_contents(「php://input」)就可以獲取非 enctype="multipart/form-data"提交過來的資料

8、@file_get_contents(「php://input」)加上@是遮蔽對應的錯誤

9、json_decode( @file_get_contents(「php://input」) ,true),由於我們與前端協定的資料是json,所以我們對接收到的資料內容進行json解析,以便抓取對應的資料進行使用。

****** xxe payload:

<?xml version="1.0" encoding="utf-8"?> 

]>

&xxe;

抓包後進行修改利用xxe注入獲取任何想要的檔案內容

如圖

PHP環境 XML外部實體注入漏洞(XXE)

好好學習,天天向上 libxml2.9.0以後,預設不解析外部實體,導致xxe漏洞逐漸消亡。為了演示php環境下的xxe漏洞,本例會將libxml2.8.0版本編譯進php中。php版本並不影響xxe利用。libxml2.8.0版本 使用vulhub 使用docker啟動 docker compos...

XML外部實體注入

參考文章 xxe漏洞逐漸走向消亡 libxml 2.9.0 以後 預設不解析外部實體 遂 xxe漏洞逐漸消亡 語法 1.xml元素都必須有關閉標籤。2.xml 標籤對大小寫敏感。3.xml 必須正確地巢狀。4.xml 文件必須有根元素。5.xml 的屬性值須加引號。結構 1.xml 文件宣告,在文件...

OWASP之XXE(XML外部實體注入)

前提條件 libxml2.9.1 及以後,預設不解析外部實體。可使用phpinfo 檢視libxml的版本資訊。後加phpinfo.php xml文件 組成 xml宣告,dtd部分,xml部分 cross domain policy根節點,http dtd引用檔案位置 dtd 文件型別定義 為xml...