SQL注入(SQL Injection)案例和防御方案


sql注入(SQL Injection):就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

SQL注入攻擊的主要危害包括:
非法讀取、篡改、添加、刪除數據庫中的數據;
數據庫信息泄漏:數據庫中存放的用戶的隱私信息的泄露,攻擊者盜取用戶的各類敏感信息,獲取利益。
網頁篡改:通過修改數據庫來修改網頁上的內容。
數據庫被惡意操作:數據庫服務器被攻擊,數據庫的系統管理員帳戶被竄改,攻擊者私自添加或刪除賬號
網站被掛馬,傳播惡意軟件:修改數據庫一些字段的值,嵌入網馬鏈接,進行掛馬攻擊;
服務器被遠程控制,被安裝后門。經由數據庫服務器提供的操作系統支持,讓黑客得以修改或控制操作系統。
破壞硬盤數據,癱瘓全系統。

SQL注入的產生原因通常表現在以下幾方面:
1. 不當的類型處理;
2. 不安全的數據庫配置;
3. 不合理的查詢集處理;
4. 不當的錯誤處理;
5. 轉義字符處理不合適;
6. 多個提交處理不當。

SQL注入攻擊案例:
查看文章的注入案例:
查看某篇文章的url參數為:?id=1
則通過注入命令:?id=1 or 1=1,則可以列出整個數據表里面的所有文章。
如果查看用戶是通過user_id來訪問,如:?uid=1
則通過注入命令:?id=1 or 1=1, 則可以把整個用戶表的記錄全部顯示出來
SQL命令如下:
通過?id=1的SQL命令為:select * from article where id=1,此語句查詢到1條結構
通過?id=1 and 1=1的SQL命令為:select * from article where id=1 or 1=1,此語句查詢到整個表的記錄

用戶登錄的注入案例:
登錄表單有user_name字段,查詢語句為:select * from users where nickname='{user_name}'
則可以在user_name文本框填入:(' or 1='1),這樣可以構造出注入的SQL命令:select * from users where user_name='' or 1='1',這樣很容易就進入系統了。

SQL注入猜表:
在登錄頁面的用戶名字段填入:(' or 1=(select count(0) from t_porg_document) or 1='1),可以構造出注入的SQL命令:select * from users where user_name='' or 1=(select count(0) from recharge) or 1='1'
這樣就可以猜測是否recharge表存在.存在則語句正常執行,否則就報錯了。
猜中表名后,就可以對數據表進行增刪改查的操作,如:
在登錄頁面的用戶名字段填入:('; delete from users),可以構造出危險的SQL命令:select * from users where user_name=''; delete from users;
通過加分號,可以構造出任意增刪改查sql語句,整個數據庫就被攻擊者隨意控制了。

對SQL注入的防御方法主要有:
1. 字符串長度驗證,僅接受指定長度范圍內的變量值。sql注入腳本必然會大大增加輸入變量的長度,通過長度限制,比如用戶名長度為 8 到 20 個字符之間,超過就判定為無效值。
2. 對單引號和雙"-"、下划線、百分號等sql注釋符號進行轉義
3. 對接收的參數進行類型格式化,如id參數值獲取后,進行int類型轉換
4. 永遠不要使用動態拼裝SQL,推薦使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。sql注入最主要的攻擊對象就是動態拼裝的SQL,通過參數化查詢可以極大減少SQL注入的風險。
5. 永遠不要使用管理員權限的數據庫連接(sa、root、admin),為每個應用使用單獨的專用的低特權賬戶進行有限的數據庫連接
6. 不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。這樣對方就算獲取到整個表的數據內容,也沒什么價值。
7. 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息輸出到日志而不是在頁面中展示。
8. 做好XSS跨站攻擊的防護,防止攻擊者偽造管理員信息進入系統后台
9. 不管客戶端是否做過數據校驗,在服務端必須要有數據校驗(長度、格式、是否必填等等)

SQL注入檢測工具:
http://blog.jobbole.com/17763/ 10個SQL注入工具
http://netsecurity.51cto.com/art/201412/458837.htm 國產SQL注入漏洞測試工具——SSQLInjection
https://www.oschina.net/search?scope=project&q=sql注入 sql注入工具排行榜

編程語言自帶的過濾方法:
PHP
普通輸入可以用mysql_real_escape_string() / mysqli_real_escape_string()來轉義特殊的輸入字符;
like查詢語句中,如果用戶輸入的值有"_"和"%",則會出現這種情況:用戶本來只是想查詢"abcd_",查詢結果中卻有"abcd_"、"abcde"、"abcdf"等等;用戶要查詢"30%"(注:百分之三十)時也會出現問題。
在PHP腳本中我們可以使用addcslashes()函數來處理以上情況,如下實例:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_


參考文章:

http://blog.csdn.net/stilling2006/article/details/8526458 (SQL注入原理講解,很不錯!)
http://netsecurity.51cto.com/art/201009/226227.htm (SQL注入攻擊三部曲之入門篇)
http://www.runoob.com/mysql/mysql-sql-injection.html (MySQL 及 SQL 注入)
http://www.jb51.net/article/18874.htm (SQL注入中繞過 單引號 限制繼續注入)
http://www.knowsky.com/441536.html (讓SQL注入攻擊危害最小化三大措施)
http://www.cnblogs.com/smilewxt/p/4229810.html (SQL注入的原理以及危害)
http://blog.jobbole.com/105586/ (記一次SQL注入實戰)
https://my.oschina.net/qjedu/blog/1504004 (SQL注入詳解)

 演示文件下載:

 sqlinjectiontest(sql注入演示,php單文件綠色版).zip

版權聲明:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請注明作者及出處。
本文標題:SQL注入(SQL Injection)案例和防御方案
本文鏈接:http://www.cnblogs.com/sochishun/p/6994918.html
本文作者:SoChishun (郵箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
發表日期:2017年6月12日


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM