只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力!
【请进行合法的渗透测试,有关内容只是用作个人复习。
】
bypass:咱们根据Google翻译的解释来看,是绕过的意思,且绕过是一个动作,那既然是动作,就会根据不同的障碍物的阻拦做出不同的绕过行为,这对应到我们今天的学习中也是如此。
WAF 【Web Application Firewall
】web应用程序防火墙:是通过执行一系列针对HTTP/HTTPS
的安全策略来专门为Web应用提供保护的一款产品。其核心策略,基本都是有正则匹配所实现的。
WAF有着软硬之分:
软WAF当中也包含安装在服务器上的应用程序
如:安全狗,D盾等
既然要学习如何绕过WAF,那干脆就安装一个安全狗到服务器上,进行实际的绕过测试。
下载安全狗,放入虚拟机中安装。
注:在安装的时候,需要将phpstudy的运行模式调节为【系统服务】,不然等下安装好了,安全狗并不会正常工作
。
访问本地的网站,测试安全狗有没有正常工作。
这里测试输入了 and 1=1
之后跳出了安全狗的拦截界面,说明功能正常。
接下来开始讲具体的几种绕过方式。
因为安全和客户体验都是需要平衡的,特别是对于WAF而言。当这个网站用了WAF之后,因为我的用户名是and,然后我就被拉黑了,随便写一点什么就被拉黑,这样的使用体验是糟糕的,所以WAF一般都是通用的,并不是单独定制的,既然是通用的,那么他在拦截上会比较谨慎,所以WAF的正则一般是搭配式的。
这里先去掉and 后面的1=1 发现网站恢复正常。
单独写入1=1也不拦截,网站正常。
如上面那样, and 我不拦你,1=1我不拦你,但是and 1=1,我就判断你在恶意测试了,我就要开始拦截了。
我们这里先介绍第一种绕过方法:【替换
】
替换 and 或者 1=1
1=1拦截 -1=-1拦不拦截呢 测试一下
这里能看到 只是对1=1进行了拦截,-1=-1并没有拦截
测试-1=-2 页面发生了变化,确定当前是存在SQL注入的。
在测试一下and的替换方式,在数据库中and可用&这个符号来代替,这个叫做逻辑运算符。(还有|^等等符号)
放入进去测试之后发现,好像&并没有达到我们想要的效果。这里其实是因为,在URL传参中&有着链接的意思,如果这里写入&后台并不会以and的方式去理解,所以我们得将&进行一次URL编码然后测试。
这样就正常的执行了条件。那我们继续进行后面的测试语句,这里最多就能证明存在SQL注入,得获得数据才能做实,所以往下进行。
继续测试union select
输入union select
不出意外的被拦截了,这里还想像前面那样去做替换嘛?这样是行不通的,因为union select
并没有什么能被代替的选择。
这里介绍第二种绕过方式:【内联注释
】
内联注释是MySQL为了保持与其他数据兼容,将MySQL中特有的语句放在/*!..*/中,这些语句在不兼容的数据库中不执行,而在MySQL自身却能识别,执行。
【/*!50001*/表示数据库版本>=5.00.01时中间的语句才能被执行】
/**/ 注释 (不被执行,只做显示)
/*!*/ 内联注释 (可被执行)
第一条是注释,对于后面的语句数据库根本就不看,所以没有用;但是第二条mysql是看了的,因为条件为False,所以没有数据返回;第三条,条件为True,返回了查询到的数据。
发现这样写还是被拦截了,那既然50001版本会拦截,其他版本会拦截嘛?我们用burp进行一下跑包测试,看看有没有漏网之鱼。
这里能看到2679的数据包大小,是被拦截的回显,看看其他数据大小的内容是啥
这里能看到10044这个版本是没有问题的,拿去试试
10044的版本号确实有用,接着往下进行
这里能看到显错点是2。
发现输入完之后,又被拦截了,在和刚刚一样,还是和刚刚一样,测试一下他是拦截的什么数据
这里能看到 到from是没有被拦截的。
这里用刚刚的内联注释还是被拦截了,那我们这里就得在用其他方法了
第三种绕过方式:【特殊字符
】
这里在引入一个老知识,%0a,是换行的意思
我们如果做这样一个搭配会达到什么效果
– qwe/*%0a
– qwe为注释的意思也就是我在后面写什么也不会被执行
写在注释里面的内容也不会被拦截,那-- qwe/*%0a,的意思是-- qwe注释掉后面的语句,但是在看到%0a时,语句换到了新的一行,不在刚刚那执行了,属于新的语句。
这样就绕过了对from的拦截
在显错点输入password,就可能看到显示的数据。
【不用-- qwe也可以用#号来代替】
第四种方式:【中间件特性
】
select == s%e%l%e%c%t
这俩在iis中是等价的,但是对于正则来说就当然不不一样了。
在比如apache的一种特性,会引发参数污染的漏洞,叫hpp
当传入两个相同的参数时,默认只看第二个,看上面这个截图,/*&id=2#*/因为在注释里面所以waf他不管,但是apache却是会解析第二个参数。(记得将#号替换为%23)
第五种方式:【白名单
】
还有就是对身份白名单的校验,比如发现你的ip为127.0.0.1时不拦截,这个的设置方式,可采用head注入所使用的方法,添加X_FORWARDED_FOR字段,来改变自己本身的IP值。【渗透测试基础-HEAD注入】
本次介绍的最后一个方式:【缓冲区绕过
】
还是那个核心,安全和良好的体验是对立面。当waf接收到一个非常大的数据包时,他虽然不确定这个数据包就完完全全的安全,但是它也不敢贸贸然的将这个数据包丢弃,因为他在前部分的数据里面并没有检测到危险,所以它还是会放过去。
这里的操作也很简单,还是以本地做测试,数据包中放入大量的无用数据,在最后放入我们的SQL语句即可
这里能看到当前是正常页面
传入测试语句之后被拦截,接下来我们插入大量的无用数据
这里就直接输出了数据。
本次的几种绕过方式
bypass下将讲解有关一句话木马上传之后,如何才能绕过安全产品的检测,而不被删除的小技巧。
《最好的防御,是明白其怎么实施的攻击》