天天看點

PHP代碼審計入門之路

0x01 前言

雖然市面上的代碼審計的文章已經一大把了,但是還是決定重複造輪子,打算作為一個系列來寫的,近年越來越多的安全研究人員投入到php應用的漏洞挖掘,相對應的代碼安全問題也被大量的暴露出來,身處這個時代,我很高興身邊的白帽子前輩不斷尋求突破并豐富和完善了代碼審計這個概念,學到今日,筆者也想總結自己的一套審計的經驗隻談,希望可以幫助新人更加友好的入門這個領域。

0x02 準備

技術準備:PHP基礎,MySql

使用工具:Visual Studio

伺服器環境:xampp

推薦使用:phpStudy

0x03 腦圖

PHP代碼審計入門之路

腦圖主要總結了sql注入、xss跨站腳本攻擊、csrf、xsrf、檔案操作相關得漏洞、代碼&&指令執行、設計缺陷以及SSRF七種常見漏洞,每種漏洞都有很多種的情況與案例,後面的文章會陸續把這些做成案例分享給大家。這篇首先介紹一下SQL注入漏洞,csrf與xsrf我分為了一種。

0x04 SQL注入入門

注入的主要原因是程式員在寫sql語句的時候沒有根據使用的場景進行過濾導緻的外部可以任意操作執行的sql,另外SQL語句有Select、Insert、Update和Delete四種類型,注入也是對這四種基本操作的拼接産生的。接下來筆者将以Select為例引導新手初步了解SQL注入。Select是資料庫的查詢操作,是以常常出現在一個網站的檢視清單,詳情,搜尋這些地方,缺陷代碼如下

PHP代碼審計入門之路

浏覽器輸入:http://127.0.0.1/test/test.php?id=1

PHP代碼審計入門之路

然後在浏覽器輸入:http://127.0.0.1/test/test.php?id=1'

PHP代碼審計入門之路

在次在浏覽器輸入:http://127.0.0.1/test/test.php?id=1' and '1'='2

PHP代碼審計入門之路

這次可以發現沒有資料輸出了 因為我們執行的語句中  goods_id 不止需要 等于1  并且還需要 string(1) = string(2) 才傳回真  但是  string(1)永遠不可能等于string(2) 是以條件不滿足不傳回資料, 從這裡我們可以知道,我們外部帶入的語句被成功的帶入資料庫并且查詢了,是以可以判斷有sql注入。

Mysql注釋:

從‘-- ’序列到行尾。請注意‘--’的後面有個空格,注釋風格要求第2個破折号後面至少跟一個字元(例如空格、tab、換行符、字元串等等)。

從‘#’字元從行尾。

從/*序列到後面的*/序列。結束序列不一定在同一行中,是以該文法允許注釋跨越多行。

下面的例子顯示了3種風格的注釋:

mysql>SELECT 1+1;    #

mysql>SELECT 1+1;    --

mysql>SELECT 1 /* xxxxxx */ + 1;

擷取表字段數:

PHP代碼審計入門之路

可以看到頁面現在傳回的是 正常的說明這表列數大于1,自己加大直到爆錯

PHP代碼審計入門之路

一直輸到8頁面爆錯了,說明我們這個表的字段數小于8,那麼就是說此表的字段為7

PHP代碼審計入門之路

頁面輸出了1,2,3,4,5,6,7 這些都是輸出點

PHP代碼審計入門之路

分别輸出了目前連接配接的使用者,資料, 伺服器版本

PHP代碼審計入門之路

擷取全部的庫

PHP代碼審計入門之路

擷取test庫的所有表

擷取16進制:

SELECT hex('test');

結果74657374

加上0x+74657374

16進制:0x74657374

http://127.0.0.1/test/test.php?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=0x74657374

table_schema === 庫名16進制編碼

table_name    === 表名16進制編碼

PHP代碼審計入門之路

擷取 tdb_admin 表的所有字段

PHP代碼審計入門之路

擷取 tdb_admin 表資料

0x05 修複方法

$id=@intval($_GET['id']);