1、輸入驗(yàn)證和輸出顯示
大多數(shù)漏洞的形成原因主要都是未對輸入數(shù)據(jù)進(jìn)行安全驗(yàn)證或?qū)敵鰯?shù)據(jù)未經(jīng)過安全處
理,比較嚴(yán)格的數(shù)據(jù)驗(yàn)證方式為:
對數(shù)據(jù)進(jìn)行精確匹配
接受白名單的數(shù)據(jù)
拒絕黑名單的數(shù)據(jù)
對匹配黑名單的數(shù)據(jù)進(jìn)行編碼
在 PHP 中可由用戶輸入的變量列表如下,我們應(yīng)該對這些輸入變量進(jìn)行檢查:
$_SERVER
$_GET
$_POST
$_COOKIE
$_REQUEST
$_FILES
$_ENV
$_HTTP_COOKIE_VARS
$_HTTP_ENV_VARS
$_HTTP_GET_VARS
$_HTTP_POST_FILES
$_HTTP_POST_VARS
$_HTTP_SERVER_VARS
2、命令注入(Command Injection)
PHP 中可以使用下列 5 個函數(shù)來執(zhí)行外部的應(yīng)用程序或函數(shù)
system、exec、passthru、shell_exec、(與 shell_exec 功能相同)
使用方式
string system(string command, int &return_var)
command 要執(zhí)行的命令
return_var 存放執(zhí)行命令的執(zhí)行后的狀態(tài)值
string exec (string command, array &output, int &return_var)
command 要執(zhí)行的命令
output 獲得執(zhí)行命令輸出的每一行字符串
return_var 存放執(zhí)行命令后的狀態(tài)值
void passthru (string command, int &return_var)
command 要執(zhí)行的命令
return_var 存放執(zhí)行命令后的狀態(tài)值
案例
將下面代碼放在服務(wù)器,我們在瀏覽器訪問
//ex1
<?php
$ip = $_GET["ip"];
if (isset($ip))
{
echo "<pre>";
system("ping ".$ip);
echo "</pre>";
}
?>
可以看到執(zhí)行了ping命令
由于它沒有對 ip 參數(shù)進(jìn)行任何驗(yàn)證或過濾,惡意用戶可以通過在 URL 中添加特殊字符來執(zhí)行任意命令
3、eval 注入(Eval Injection)
eval 函數(shù)將輸入的字符串參數(shù)當(dāng)作 PHP 程序代碼來執(zhí)行
將下面代碼放在服務(wù)器,我們在瀏覽器訪問
//ex2
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
當(dāng)我們把傳遞的參數(shù)值改為phpinfo的時(shí)候,漏洞就產(chǎn)生了
防范方法
1、盡量不要執(zhí)行外部命令
2、使用自定義函數(shù)或函數(shù)庫來替代外部命令的功能
3、使用 escapeshellarg 函數(shù)來處理命令參數(shù)
4、使用 safe_mode_exec_dir 指定可執(zhí)行文件的路徑
esacpeshellarg 函數(shù)會將任何引起參數(shù)或命令結(jié)束的字符轉(zhuǎn)義,單引號“’”,替換成“\’”,雙引號““”,替
換成“””,分號“;”替換成“;”
用 safe_mode_exec_dir 指定可執(zhí)行文件的路徑,可以把會使用的命令提前放入此路徑內(nèi)
4、跨網(wǎng)站腳本攻擊(Cross Site Scripting, XSS)
反射型跨站常常出現(xiàn)在用戶提交的變量接受以后經(jīng)過處理,直接輸出顯示給客戶端;存儲
型跨站常常出現(xiàn)在用戶提交的變量接受過經(jīng)過處理后,存儲在數(shù)據(jù)庫里,然后又從數(shù)據(jù)庫中讀取
到此信息輸出到客戶端。輸出函數(shù)經(jīng)常使用:echo、print、printf、vprintf、<%=$test%>
這里用pikachu的存儲型代碼進(jìn)行分析
這段代碼它沒有對用戶輸入的留言進(jìn)行任何驗(yàn)證或過濾,因此可能會受到存儲型跨站腳本攻擊(Stored XSS Attack)的威脅。存儲型跨站腳本攻擊是一種常見的網(wǎng)絡(luò)攻擊方式,攻擊者通過在網(wǎng)頁中插入惡意腳本,來竊取用戶信息或破壞網(wǎng)頁內(nèi)容1
5、SQL 注入攻擊(SQL injection)
SQL 注入攻擊(SQL Injection),是攻擊者在表單中提交精心構(gòu)造的 sql 語句,改動原來的 sql 語句,如
果 web 程序沒有對提交的數(shù)據(jù)經(jīng)過檢查,那么就會造成 sql 注入攻擊。
1、攻擊者訪問有 SQL 注入漏洞的站點(diǎn),尋找注入點(diǎn)
2、攻擊者構(gòu)造注入語句,注入語句和程序中的 SQL 語句結(jié)合生成新的 sql 語句
3、新的 sql 語句被提交到數(shù)據(jù)庫中執(zhí)行 處理
4、數(shù)據(jù)庫執(zhí)行了新的 SQL 語句,引發(fā) SQL 注入攻擊
SQL 注入因?yàn)橐僮鲾?shù)據(jù)庫,所以一般會查找SQL 語句關(guān)鍵字:
insert、delete、update、 select
查看傳遞的變量參數(shù)是否用戶可控制,有無做過安全處理,可以使用參數(shù)化查詢防范
6、跨網(wǎng)站請求偽造攻擊(Cross Site Request Forgeries, CSRF)
跨站請求偽造攻擊,是攻擊者偽造一個惡意請求鏈接,通過各種方式讓正常用戶訪問后,
會以用戶的身份執(zhí)行這些惡意的請求。我們應(yīng)該對比較重要的程序模塊,比如修改用戶密碼,添 加用戶的功能進(jìn)行審查,檢查有無使用一次性令牌防御
csrf 攻擊。
7、Session 會話劫持(Session Hijacking)
會話劫持是指攻擊者利用各種手段來獲取目標(biāo)用戶的 session id。一旦獲取到 session id,那么攻擊者可以利用目標(biāo)用戶的身份來登錄網(wǎng)站,獲取目標(biāo)用戶的操作權(quán)限。
服務(wù)端和客戶端之間是通過 session(會話)來連接溝通。當(dāng)客戶端的瀏覽器連接到服務(wù)器后,服務(wù)器就會建立一個該用戶的session。
每個用戶的 session 都是獨(dú)立的,并且由服務(wù)器來維護(hù)。 每個用戶的 session是由一個獨(dú)特的字符串來識別,成為session id。用戶發(fā)出請求時(shí),所發(fā)送的 http 表頭內(nèi)包含 session id 的值。
服務(wù)器使用 http 表頭內(nèi)的session id 來識別時(shí)哪個用戶提交的請求。
session 保存的是每個用戶的個人數(shù)據(jù),一般的 web 應(yīng)用程序會使用session 來保存通過驗(yàn)證的用戶 賬號和密碼。在轉(zhuǎn)換不同的網(wǎng)頁時(shí),如果需要驗(yàn)證用戶身份,就是用 session內(nèi)所保存的賬號和密碼來比較。
session 的生命周期從用戶連上服務(wù)器后開始,在用戶關(guān)掉瀏覽器或是注銷時(shí)用戶session_destroy 函數(shù)刪除 session 數(shù)據(jù)時(shí)結(jié)束。如果用戶在 20 分鐘內(nèi)沒有使用計(jì)算機(jī)的動作,session也會自動結(jié)束。
8、Session 固定攻擊(Session Fixation)
如果當(dāng)權(quán)限級別改變時(shí)(例如核實(shí)用戶名和密碼后,普通用戶提升到管理員),我們就應(yīng)該
修改即將重新生成的會話 ID,否則程序會面臨會話固定攻擊的風(fēng)險(xiǎn)。
9、HTTP 響應(yīng)拆分攻擊(HTTP Response Splitting)
HTTP 響應(yīng)拆分是由于攻擊者經(jīng)過精心設(shè)計(jì)利用電子郵件或者鏈接,讓目標(biāo)用戶利用一個請求產(chǎn)生兩個響應(yīng),前一個響應(yīng)是服務(wù)器的響應(yīng),而后一個則是攻擊者設(shè)計(jì)的響應(yīng)。此攻擊之所以會發(fā)生,是因?yàn)?WEB程序?qū)⑹褂谜叩臄?shù)據(jù)置于 HTTP 響應(yīng)表頭中,這些使用者的數(shù)據(jù)是有攻擊者精心設(shè)計(jì)的。
可能遭受 HTTP 請求響應(yīng)拆分的函數(shù)包括以下幾個:
header(); setcookie(); session_id(); setrawcookie();
注意
PHP 的高版本會禁止 HTTP 表頭中出現(xiàn)換行字符,這類可以直接跳過本測試文章來源:http://www.zghlxwxcb.cn/news/detail-641263.html
10、文件上傳漏洞(File Upload Attack)
PHP 文件上傳通常會使用 move_uploaded_file,也可以找到文件上傳的程序進(jìn)行具體分析文章來源地址http://www.zghlxwxcb.cn/news/detail-641263.html
防范方式:
使用白名單方式檢測文件后綴
上傳之后按時(shí)間能算法生成文件名稱
上傳目錄腳本文件不可執(zhí)行
注意%00截?cái)?
11、目錄穿越漏洞(Directory Traversal)
12、遠(yuǎn)程文件包含攻擊(Remote Inclusion)
13、動態(tài)函數(shù)注入攻擊(Dynamic Variable Evaluation)
14、URL 攻擊(URL attack)
15、表單提交欺騙攻擊(Spoofed Form Submissions)
16、HTTP 請求欺騙攻擊(Spoofed HTTP Requests)
到了這里,關(guān)于php代碼審計(jì),php漏洞詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!