SQL注入漏洞
- 什么是SQL注入漏洞?
- 一、SQL注入
- 1、常見SQL注入
- 2、錯誤回顯導致SQL注入
- 3、盲注(Bind Injection)
- 4、Timing Attack
- Timing Attack的使用方法:
- 二、資料庫攻擊技巧
- 1、常見攻擊方式
- 2、命令執行
- 3、攻擊存盤程序
- 4、編碼問題
- 5、SQL Column Truncation
- 三、防御SQL注入
- 1、使用預編譯陳述句防御
- 2、使用存盤程序防御
- 3、使用安全函式防御
- 四、其他注入攻擊
- 其他注入攻擊包括:XML注入、代碼注入、CRLF注入,
- 總結
- 網安小白又又又來瞎咧咧了!!!如有不足,請多指教!!!
什么是SQL注入漏洞?
注入攻擊在OWASP TOP10蟬聯了2013、2017兩年的榜首,足以看出注入攻擊在資訊安全行業的地位
注入攻擊的兩大關鍵的條件:
(1)、用戶可以控制輸入;
(2)、原本要執行的代碼拼接了用戶輸入的資料,
一、SQL注入
1、常見SQL注入
以下為一個典型的sql注入的例子
var shipCity;
shipCity = Request.form("shipCity");
var sql = "select * from city where shipCity = '" + shipCity + "'";
變數shipCity的值由用戶提交,例如用戶輸入“Beijing”,則SQL會執行:
select * from city where shipCity = 'Beijing'
但如果用戶輸入Beijing’; drop table city --
那么SQL陳述句將執行:
select * from city where shipCity = 'Beijing'; drop table city --'
通過這個例子可以看出,查完資料后,有執行了一個drop表的操作,而這個操作,是用戶構造惡意資料的結果,這也就是存在SQL注入,
2、錯誤回顯導致SQL注入
在SQL注入的程序中,如果Web服務器開啟了錯誤回顯,則會為攻擊者提供了極大的便利,比如攻擊者在引數中輸入一個’,引起執行查詢陳述句的語法錯誤,服務器會直接回傳錯誤資訊,攻擊者會通過錯誤資訊來判斷出該服務器資料庫的型別、欄位等,通過這些資訊,攻擊者會推斷出這條查詢陳述句的偽代碼,通過多次嘗試,完成SQL注入,
3、盲注(Bind Injection)
對應上一點的Web開啟錯誤回顯,盲注指的就是在錯誤回顯關閉的情況下通過構造簡單的條件陳述句并根據回傳頁面是否發生變化,來判斷SQL注入是否成功,
如果在目標URL后插入and 1=1若可以正常回傳目標頁面,則SQL陳述句的“and”被執行,那么可以判斷出引數“id”存在SQL注入,
4、Timing Attack
此注入方法與2011年3月一位外國小伙兒密切相關(因為這小伙在MySQL的官網上找到了漏洞,np),Timing Attack也是盲注的一種特殊技巧,
Timing Attack的使用方法:
在MySQL中,有一個BENCHMARK()函式,用于測驗函式的性能,有兩個引數BENCHMARK(count, expt)指運算式expt被執行count次,
Timing Attack是利用此函式將同一函式執行若干次,使得結果回傳時間比平時長,通過查看運行時間的變化來判斷注入陳述句是否執行成功,是一種邊信道攻擊,
| 資料庫 | 函式 |
|---|---|
| MySQL | BENCHMARK(count, expt) or sleep(5) |
| PostgreSQL | PG_SLEEP(5) or GENERATE_SERIES(1, 10000) |
| 導SQL Server | WAITFOR DELAY ‘0:0:5’ |
二、資料庫攻擊技巧
1、常見攻擊方式
(1)、通過SQL注入猜測資料庫的對應版本:
#版本對應若為4,return true
“URL” and substring(@@version,1,1) = 4
(2)、通過union select 分別確認表名admin是否存在,列名password是否存在
id = 5 union all select 1,2,3 from admin
id = 5 union all select 1,2,password from admin
(3)、通過判斷字符范圍,可以猜測出username和password具體的值
id = 5 and ascii(substring((select concat(username,0x3a,password) from users limit 0,1),1,1))>96
id = 5 and ascii(substring((select concat(username,0x3a,password) from users limit 0,1),1,1))>97
#以此類推,直到找出具體值,可使用sqlmap.py代替此程序
2、命令執行
在MySQL中,除了可以通過匯入webshell間接地執行命令外,還可以利用“用戶自定義函式”的技巧,即UDF(User-Defined Functions)來執行命令
3、攻擊存盤程序
4、編碼問題
5、SQL Column Truncation
三、防御SQL注入
通過分析多種攻擊的技巧,從防御的角度來看,要想做好防御需要做兩件事:
(1)、找到所有的SQL注入
(2)、修補這些漏洞
1、使用預編譯陳述句防御
使用預編譯陳述句進行防御是防御SQL注入的最佳方式,就是使用預編譯陳述句,系結變數,
使用方法: 通過將變數用“?”表示,這樣攻擊者將無法改變SQL的結構,
2、使用存盤程序防御
使用方法: 通過避免在存盤程序內使用動態的SQL陳述句,來防御注入攻擊,如果避免不了就使用嚴格的輸入過濾或者編碼函式來處理用戶的輸入資料,
3、使用安全函式防御
四、其他注入攻擊
其他注入攻擊包括:XML注入、代碼注入、CRLF注入,
總結
注入攻擊是違背了“資料與代碼分離原則”導致的結果,有兩個條件:一是用戶可以控制資料的輸入;二是代碼拼湊了用戶輸入的資料,把資料當做代碼執行了,
理論上注入攻擊可以徹底避免!!
網安小白又又又來瞎咧咧了!!!如有不足,請多指教!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291285.html
標籤:其他
