web滲透者習慣採用黑盒或灰盒的方面來檢測一款web應用是否存在漏洞,這種檢測方法能夠屏蔽很多漏洞,特別是程序邏輯中的漏洞。但若是能配合白盒的源碼審計(也能夠叫漏洞挖掘),效果將會更好,固然人力成本也會增長,其中,對於源碼審計工做將交給誰作,是比較爭議的話題,是開發、測試仍是安全人員呢?php
我的以爲,開發若能作一下粗略的源碼自查,而後安全(弱沒有安全人員,就交給白盒測試人員)負責作總體的源碼審查,將是極好的安排。html
除了人力成本,還有一個信任的問題,是否願意將源碼開放給安全人員?這比較敏感,但從技術角度來看,掌握源碼審計的技巧是很是棒的加分點。mysql
本篇文章將介紹兩種開源的PHP源碼審計工具,其中Taint適合開發源碼自查,RIPS適合安全源碼審查。web
1、Taintsql
一、介紹shell
php taint一個用於檢測xss/sqli/shell注入的php擴展模塊,做者博客 。apache
原理,檢查某些關鍵函數(是否直接使用(沒有通過過濾或轉義處理)了來自$_GET,$_POST,$_COOKIE的數據,如使用則給出提示。vim
可用於php源碼審計,對快速定位漏洞有幫助安全
二、安裝網絡
第一步:下載安裝taint
wget http://pecl.php.net/get/taint-1.2.2.tgz (下載最新的taint)
tar zxvf taint-1.2.2.tgz
cd taint-1.2.2
phpize(若是找不到該命令,須要apt-getinstall php5-dev)
./configure
make
make install
第二步:修改php.ini配置文件,使其支持taint模塊
vim /etc/php5/apache2/php.ini
增長
extension=/usr/lib/php5/20090626+lfs/taint.so
taint.enable=1
display_errors = On
error_reporting = E_ALL & ~E_DEPRECATED
apache2ctl restart
注意:只能在開發環境開啓該擴展
第三步:測試該模塊是否開啓
vim phpinfo.php
<?php
phpinfo();
?>
如上圖所示,則表示成功開啓該擴展
三、測試(以DVWA 爲主要測試對象)
實例1:sql注入漏洞
$user = $_GET['username'];
$pass = $_GET['password'];
$pass = md5($pass);
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result =mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );
運行頁面,警告信息以下所示
Warning: mysql_query(): SQL statement contains data that might be tainted in /var/www/dvwa/vulnerabilities/brute/source/low.php on line 11
若是PHP源碼使用如下函數,則不會發出警告
mysql_real_escape_string (不轉義%與_)
stripslashes
is_numeric
實例2:命令執行漏洞
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
運行頁面,警告信息以下所示
Warning: shell_exec(): CMD statement contains data that might be tainted in /var/www/dvwa/vulnerabilities/exec/source/low.php on line 15
實例3:文件包含漏洞(常伴隨着目錄遍歷漏洞)
<?php
$file=$_GET['file'];
include($file);
?>
運行頁面,警告信息以下所示
Warning: include(): File path contains data that might be tainted in /var/www/dvwa/vulnerabilities/fi/index.php on line 35
實例4:xss漏洞
<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . $_GET['name'];
echo '</pre>';
}
?>
運行頁面,警告信息以下所示
實例5:代碼執行eval
<?php
$cmd=$_GET['cmd'];
eval("$cmd;");
?>
實例6:文件讀取操做
<?php
print "<h2>Number 3: file() functions: </h2>";
$path=$_GET['path'];
$contents=file($path);
foreach ($contents as $line_num => $line){
echo "Line #<b>{$line_num}</b> : ".htmlspecialchars($line). "<br>\n";
}
?>
2、RIPS
Taint能夠在運行時提醒開發,未過濾參數帶來的危害。而集中性的PHP源碼安全審計工做仍是交給RIPS比較友好。 咱們將上面的實例代碼使用該工具檢查,報告以下所示
上圖顯示了該工具找到了7種安全漏洞,效果不錯。
PHP源碼審計是個很成熟的問題了,網絡上有很多詳細介紹如何作源碼審計的資料,也開源了很多源碼審計工具,感謝這些信息分享的人。