之前看了seay寫的PHP代碼審計的書,全部瀏覽了一遍,作為一個代碼審計小白,希望向一些和我一樣的小白的人提供一下我的收獲,以及一個整體的框架和常見漏洞函數。這也算是這本書的一個學習筆記吧,可以結合我捋順的思路來看這本書。: )
學習代碼審計的目標是能夠獨立完成對一個CMS的代碼安全監測。其通用的思路有:
include
文件夾下的common_fun.php
,或者有類似關鍵字的文件。config
關鍵字的文件,找到mysql.class.php文件的connect()函數,查看在數據庫連接時是否出現漏洞。index.php
,了解程序運作時調用了哪些函數和文件 以index.php文件作為標線,一層一層去擴展閱讀所包含的文件,了解其功能,之后進入其功能文件夾的首頁文件,進行擴展閱讀。..
,/
,\
檢查傳入的參數,做出限制,停止程序往下執行(1) 本地文件包含:
include()/include_once()
,require()/require_once()
尋找可控變量 (2) 遠程文件包含:
allow_url_include = on
(3) 文件包含截斷:
搜索關鍵函數:
file_get_contents()
,highlight_file()
,fopen()
,read file()
,fread()
,fgetss()
, fgets()
,parse_ini_file()
,show_source()
,file()
等
搜索關鍵函數:
move_uploaded_file()
接著看調用這個函數的代碼是否存在為限制上傳格式或者可以繞過。
(1) 未過濾或本地過濾:服務器端未過濾,直接上傳PHP格式的文件即可利用。
(2) 黑名單擴展名過濾:
.asp
,.cdx
, .asa
,.cer
等。不被允許的文件格式.php
,但是我們可以上傳文件名為1.php
(注意后面有一個空格)
(3) 文件頭 content-type
驗證繞過:
getimagesize()
函數:驗證文件頭只要為GIF89a,就會返回真。$_FILES["file"]["type"]
的值 就是人為限制content-type為可控變量。(4) 防范:
in_array()
或 利用三等于===
對比擴展名。md5(time() + rand(1,1000))
。搜索關鍵函數:
unlink()
利用回溯變量的方式 session_destroy()
,可以刪除文件,現已基本被修復。Metinfo的任意文件刪除漏洞:
$action = delete
即可刪除.sql
的文件,如果文件不是sql
直接刪除提交的文件名
target.com/recovery.php?&action=delete&filename=../../index.php
搜索關鍵函數:eval()
, assert()
, preg_replace()
, call_user_func()
, call_user_func_array()
, array_map()
(1) preg_replace()
函數:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
當$pattern處存在e修飾符時,$replacement 會被當做php代碼執行。
(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)
:
第一個參數為回調函數,第二個參數是回調函數的參數
(3)eval()
和assert()
:
當assert()的參數為字符串時 可執行PHP代碼
【區分】:
eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】
assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】
動態函數后門:
#!php
<?php
$_GET['a']($_GET['b']);
?>
搜索關鍵函數:system()
, exec()
, shell_exec()
, passthru()
,pcntl_exec()
, popen()
,proc_open()
(1) popen
和proc_open()
:
#!php
<?php
popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' );
?>
所在路徑就會出現一個1.txt 里面的內容為命令執行后的結果
(2) 反引號命令執行:
echo whoami
; 直接就可以執行命令
雙引號和單引號的區別:
#!php
$a = 1
echo " $a " output:1
echo ' $a ' output:$a
雙引號時,可以直接解析變量,造成代碼執行漏洞,過狗繞過。
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 )
需要思考的問題:
(1) in_array()
: 比較之前會自動轉換類型
(2)is_numeric()
:當傳入參數為hex時 直接通過并返回true 并且MYSQL可以直接使用hex編碼代替字符串明文 可以二次注入 并且可能造成XSS漏洞
(3)雙等于==
和三等于===
:
in_array()
是一樣的問題。(1) 未exit
/return
/die
:
#!php
<?php
if(file_exists('install.lock)){
header("Location:xxx.com");
//exit();
}
echo "test";
?>
test 依舊會被輸出,替換成安裝流程,PHP依舊會進行。
(2) 支付漏洞:
重復發包利用時間差:
#!php
<?php
if (check_money($price)){
//Do something
//花費幾秒
$money = $money - $price;
}
?>
可能導致漏洞函數: str_replace()
#!php
<?php
$a = addslashes($_GET['a']);
$b = addslashes($_GET['b']);
echo "$a<br>$b<br>";
$c = str_replace($a,'',$b);
echo trim($c);
?>
COOKIE驗證:沒有使用SESSION驗證,將信息直接保存在COOKIE中
審計代碼時,查看登錄處代碼
==>
SQL注入 / XSS(1) 鉆GPC等轉義的空子:
$_SERVER
變量:PHP5以后,$_SERVER取到的header不再受GPC影響,就算開啟特殊字符也不會被轉義,存在注入編碼問題轉換:
%df '
單引號自動被轉義成(%5c),同時%df
與%5c
連在一起組合成運
字單引號依然在,成功閉合。【php與mysql交互過程中發生的編碼轉換問題】mb_convert_encoding()
:
#!php
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<?php
$sql = "WHERE id='".urldecode("-1%df%5c' == ")."'";
print_r(mb_convert_encoding($sql,"UTF-8","GBK"));
?>
(2)字符串問題:
字符串截斷:
%00空字符截斷:【PHP版本小于5.3】
#!php
<?php
include($_GET['file'].'.php');
//1.php?file=2.txt%00
//2.txt里面是 <?php phpinfo()?>
?>
iconv函數字符編碼轉換截斷:【對PHP版本有要求】
#!php
chr(128)—chr(255)可以截斷字符
<?php
$a = '1'.chr(130).'2’;
echo $a."<br>"; //1?2
echo iconv("UTF-8", "GBK", $a); //1
?>
php:// 輸入輸出流:
#!php
<?php
include($_GET[‘file']);
?>
1.php?file=php://filter/convert.base64-encode(內容被base64編碼)/resource=example.txt(遠程文件)
php代碼解析標簽:
<script language="php">…</script>
<?…?>
:php3.0.4版本后可用<%…%>
:asp標簽,需要asp_tags=on,默認是off正則表達式:
報錯注入:
windows findfirstfile
利用:若要搜索12345.txt文件,可使用1<<
來代替或者12<<
,不可以單獨使用一個"<"
或">"
,因為單獨一個只是代表了一個字符,兩個代表多個字符。
自己走上安全這條路既是興趣也是偶然,選擇白盒完全是因為喜歡php,畢竟是初識代碼審計,seay的書確實幫了我不少,抱作者大腿(我是萌妹紙),希望這篇文章能夠幫助像我一樣小白的人,花了兩天總結的,如果有什么缺陷也等著大家指出。
不會開發的談審計都是耍流氓!:)