1. 程式人生 > >PHP程式碼審計入門

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。互動的資料很重要! 這裡有個小技巧, 本地測試的時候要把輸入點打印出來。
將使用者的輸入資料進行var_dump,重要的是對最終的sql語句進行var_dump,這和給你省去很多力氣!我們只要var_dump($sql)然後再可以去黑盒測試,[比如搜尋框,使用者登入,檔案上傳名稱等等]。   3,現在可以進行漏洞分析了,下面會寫到比較常見的漏洞型別以及審計不同漏洞的技巧。   XSS漏洞 XSS又叫CSS (Cross Site Script) ,跨站指令碼攻擊。它指的是惡意攻擊者往web頁面裡插入惡意html程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html程式碼會被執行,從而達到惡意使用者的特殊目的。 xss分為儲存型的xss和反射型xss, 基於DOM的跨站指令碼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>

xss

我們可以用滲透平臺 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' ] ); 


。。。後續學習內容再補充(學業繁忙)