|
from:http://drops./tips/12751 0x01 整體
學(xué)習(xí)代碼審計(jì)的目標(biāo)是能夠獨(dú)立完成對(duì)一個(gè)CMS的代碼安全監(jiān)測(cè)。其通用的思路有: 通讀全文代碼,從功能函數(shù)代碼開始閱讀,例如include文件夾下的common_fun.php,或者有類似關(guān)鍵字的文件。 看配置文件,帶有config關(guān)鍵字的文件,找到mysql.class.php文件的connect()函數(shù),查看在數(shù)據(jù)庫(kù)連接時(shí)是否出現(xiàn)漏洞。 繼續(xù)跟讀首頁(yè)文件,index.php,了解程序運(yùn)作時(shí)調(diào)用了哪些函數(shù)和文件 以index.php文件作為標(biāo)線,一層一層去擴(kuò)展閱讀所包含的文件,了解其功能,之后進(jìn)入其功能文件夾的首頁(yè)文件,進(jìn)行擴(kuò)展閱讀。
0x02 各種洞洞
a.文件操作漏洞能不用文件名參數(shù)就不用 盡量不要讓用戶可控 平行用戶的權(quán)限 管理員的權(quán)限 操作權(quán)限 禁止傳入?yún)?shù)類似于這種 .. ,/,\ 檢查傳入的參數(shù),做出限制,停止程序往下執(zhí)行
1.文件包含漏洞:(1) 本地文件包含: 

(2) 遠(yuǎn)程文件包含: (3) 文件包含截?cái)啵?/p> 2.文件讀取(下載)漏洞:搜索關(guān)鍵函數(shù): file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
3.文件上傳漏洞:搜索關(guān)鍵函數(shù): move_uploaded_file() 接著看調(diào)用這個(gè)函數(shù)的代碼是否存在為限制上傳格式或者可以繞過(guò)。
(1) 未過(guò)濾或本地過(guò)濾:服務(wù)器端未過(guò)濾,直接上傳PHP格式的文件即可利用。 (2) 黑名單擴(kuò)展名過(guò)濾: 
不被允許的文件格式.php,但是我們可以上傳文件名為1.php(注意后面有一個(gè)空格) (3) 文件頭 content-type驗(yàn)證繞過(guò): (4) 防范: 使用in_array()或 利用三等于===對(duì)比擴(kuò)展名。 保存上傳文件是重命名,規(guī)則采用時(shí)間戳拼接隨機(jī)數(shù):md5(time() + rand(1,1000))。
4.文件刪除漏洞:搜索關(guān)鍵函數(shù): Metinfo的任意文件刪除漏洞: 
$action = delete即可刪除.sql的文件,如果文件不是sql直接刪除提交的文件名
target.com/recovery.php?&action=delete&filename=../../index.php
b.代碼執(zhí)行漏洞1.代碼執(zhí)行函數(shù):搜索關(guān)鍵函數(shù):eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map() (1) preg_replace()函數(shù): mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
當(dāng)$pattern處存在e修飾符時(shí),$replacement 會(huì)被當(dāng)做php代碼執(zhí)行。 (2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…): 第一個(gè)參數(shù)為回調(diào)函數(shù),第二個(gè)參數(shù)是回調(diào)函數(shù)的參數(shù) 

(3)eval()和assert(): 當(dāng)assert()的參數(shù)為字符串時(shí) 可執(zhí)行PHP代碼 【區(qū)分】: eval(' phpinfo(); ');【√】 eval(' phpinfo() ');【X】assert(' phpinfo(); ');【√】 assert(' phpinfo() ');【√】2.動(dòng)態(tài)函數(shù)執(zhí)行:動(dòng)態(tài)函數(shù)后門: 1 2 3 | <>
$_GET['a']($_GET['b']);
>
|

3.命令執(zhí)行函數(shù):搜索關(guān)鍵函數(shù):system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open() (1) popen和proc_open(): 1 2 3 |
popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' );
>
|
所在路徑就會(huì)出現(xiàn)一個(gè)1.txt 里面的內(nèi)容為命令執(zhí)行后的結(jié)果 (2) 反引號(hào)命令執(zhí)行: 雙引號(hào)時(shí),可以直接解析變量,造成代碼執(zhí)行漏洞,過(guò)狗繞過(guò)。 c.變量覆蓋漏洞1.函數(shù)使用不當(dāng):int extract( array &$var_array , int $extract_type = EXTR_OVERWRITE , string $prefix = null )
void parse_str( string $str , array &$arr )
bool import_request_variables( string $type , string $prefix )
2.$$變量覆蓋:

d.邏輯漏洞需要思考的問(wèn)題: 1.等于與存在判斷繞過(guò):(1) in_array(): 比較之前會(huì)自動(dòng)轉(zhuǎn)換類型 

(2)is_numeric():當(dāng)傳入?yún)?shù)為hex時(shí) 直接通過(guò)并返回true 并且MYSQL可以直接使用hex編碼代替字符串明文 可以二次注入 并且可能造成XSS漏洞 (3)雙等于==和三等于===: 2.賬戶體系中的越權(quán)問(wèn)題:(1) 未exit/return/die: 1 2 3 4 5 6 7 | <>
if(file_exists('install.lock)){
header('Location:xxx.com');
//exit();
}
echo 'test';
>
|
test 依舊會(huì)被輸出,替換成安裝流程,PHP依舊會(huì)進(jìn)行。 (2) 支付漏洞: 可能導(dǎo)致漏洞函數(shù): str_replace() 
1 2 3 4 5 6 7 | <>
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo '$a $b ';
$c = str_replace($a,'',$b);
echo trim($c);
>
|

e.會(huì)話認(rèn)證漏洞f.二次漏洞1.類型:

2.技巧:(1) 鉆GPC等轉(zhuǎn)義的空子: (2)字符串問(wèn)題:
|