PHP代碼審計入門
博客轉載 --代碼審計入門
代碼審計--準備
1,先放一張大圖,php代碼審計的幾個方向,也是容易出問題的地方,沒事的時候可以多看看。
2,代碼審計也就是拿到某網站的源碼,進行審計,從而發現漏洞,但是我們審計的時候並不一定要一行一行的去看吧,這樣未免也太浪費時間了,所以我們需要工具進行幫助我們。當屬 "Seay源代碼審計系統2.1" 優先選擇(靜態分析,關鍵字查找定位代碼不錯,但是誤報很高)。
我們在做代碼審計的時候,個人建議先要把審計的某CMS隨便點點,先熟悉一下功能。代碼審計前先進行黑盒測試是個不錯的選擇,知道哪裏有問題,然後再去找出問題的代碼。
要關註變量和函數,
1.可以控制的變量【一切輸入都是有害的 】 2.變量到達有利用價值的函數[危險函數] 【一切進入函數的變量是有害的】 ------來源t00ls代碼審計--漏洞
一,漏洞類型
1.sql註入
2.文件操作[上傳/寫入/讀取/刪除]
3.文件包含
4.命令執行
5.xss
6.cookie欺騙
7.邏輯漏洞
........等等 我們平常再進行黑盒測試時,上面的每種漏洞都有相對應的挖掘技巧,這裏代碼審計也是有技巧的。我們進行黑盒測試getshell的時候,往往是上面的sql註入,文件操作(上傳),文件包含,命令執行相對容易getshell的。xss的話危害也很大,可以泄露內網的信息,如果的是存儲型xss的話,就可以打管理員的cookie,然後進行下一步的攻擊。邏輯漏洞是相對麻煩的,危害是很要命的,邏輯漏洞也分為很多種,其中一元買東西是很出彩的,這裏通過修改訂單進行偽造支付金額。 所以我們要認識清楚漏洞原理,積累cms常出漏洞,積累找這種漏洞的技巧。 二,漏洞分析 下面我們就進行分析一下各種漏洞形成的原因吧 1,首先我們要做好準備工作,審計環境:windows環境(Apache+MySQL+php),可以使用集成的,wampserver,phpstudy其他 2,準備好了就直接上手分析嗎?其實有更不錯的選擇,那就是----黑盒+白盒。黑盒很重要!黑盒很重要!黑盒很重要!這是重要的事情。我們在黑盒測試的時候,可以花費點時間,因為用的時間越多,我們對所要分析的CMS的功能更熟悉,代碼審計的時候也就容易分析,比如看到搜索框,當然要看下有沒有註入或者是能不能彈出來框框,以及留言板有沒有xss。交互的數據很重要! 這裏有個小技巧,本地測試的時候要把輸入點打印出來。
反射型xss審計的時候基本的思路都一樣,通過尋找可控沒有過濾(或者可以繞過)的參數,通過echo等輸出函數直接輸出。尋找的一般思路就是尋找輸出函數,再去根據函數尋找變量。一般的輸出函數有這些:print , print_r , echo , printf , sprintf , die , var_dump ,var_export。
測試代碼如下:
<?php echo $_GET[‘xssf‘]; ?>
http://127.0.0.1/test/xssf.php?xssf=<script>alert(/orange/);</script>
我們可以用滲透平臺 DVWA
分析如下:首先看下源碼
<?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) { // Feedback for end user echo ‘<pre>Hello ‘ . $_GET[ ‘name‘ ] . ‘</pre>‘; } ?>
這裏我們可以清楚的看到 if 裏面的php函數array_key_exists
,現在不懂沒關系,百度一下你就知道。
array_key_exists(key,array)
key--鍵值
arrray--規定數組
輸入的值也就是GET得到的值是以數組的形式,然後判斷GET得到的name是不是空,如果滿足 if 語句,這裏就會進行 if 括號裏面的
echo ‘<pre>Hello ‘ . $_GET[ ‘name‘ ] . ‘</pre>‘;
我們可以清楚的看到,這裏直接輸出傳的name參數,並沒有任何的過濾與檢查,存在明顯的XSS漏洞。
medium中等難度下的代碼
<?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ ‘name‘ ] != NULL ) { // Get input $name = str_replace( ‘<script>‘, ‘‘, $_GET[ ‘name‘ ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } ?>
可以看到有一點上low的代碼是不一樣的,那就是進行了一次過濾,
用的str_replace()函數,這個函數的功能是:以其他字符替換字符串中的一些字符(區分大小寫)。
這裏的作用是替換<script>,也就是把<script>替換成空格,然後再進行輸出。
這裏對輸入進行了過濾,基於黑名單的思想,使用str_replace函數將輸入中的<script>刪除,這種防護機制是可以被輕松繞過的。
雙寫繞過:輸入<sc<script>ript>alert(/xss/)</script>,成功彈框。
大小寫混淆繞過:輸入<ScRipt>alert(/xss/)</script>,成功彈框
High等級也是基於黑名單思想,進行過濾。但是我們可以通過其他標簽來進行XSS。
$name = preg_replace( ‘/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i‘, ‘‘, $_GET[ ‘name‘ ] );
。。。後續學習內容再補充(學業繁忙)
PHP代碼審計入門