前言
2021年了,现在渗透的越来越难了,刚打的shell,过一会就没了,现在的流量设备,安全设备一个比一个流弊,payload一过去就面临着封禁,为了对抗设备,一些大佬们总结出很多绕过这种基于签名的*WAF 或 IDS* 的手法,为什么叫基于签名的?因为这种设备也是检查数据包中一些特征字符,比如什么and 1=1 什么的,但是肯定不会这么简单的,除了几个黑名单的固定的特征字符,很多都是那种通过正则去匹配特征字符的,这也是造成绕过可能性的原因。
常规手法
1.直接通过真实ip访问
这是一种对待云waf最有效的办法,只要找到做cdn的之前的真实ip,那么直接通过ip访问,则会使云waf完全失效,web应用服务器失去云保护。
1.1怎么找到真实ip?
手法挺多的,我比较常用的,就是直接把网站的titile给取下来放到一些搜索引擎搜索,比如在fofa中搜索网站titile,一般都能找到,钟馗之眼也不错,当然手法很多,找比较实用的就行。
1.2 通过ip去访问一些网站,可能提示web页面找不到?
究其原因是,有些网站在路由上直接使用的域名为硬路由,这时候需要修改host 解析文件,把相关域名和真实ip 给对应上填上,再用域名去访问。
linux host文件路径
代码语言:javascript复制/etc/hosts
windows host文件路径
代码语言:javascript复制C:WINDOWSsystem32driversetc
2.切换协议
通过切换http到https,或者https切换到http,如果web站点没有进行强制https访问,那么http也能访问到其站点,如果waf错误配置,也能起到一点效果(方法比较特殊),还可以通过增加www,或者删除www前坠有时也管用。
3.通过IPv6 访问
有许多入侵检测系统也只监控 IPv4 流量,没有对IPv6 进行监控。
访问格式:http://[ipv6地址]:80/index.html
ipv6为:2001:470:c:1818::2
访问地址:http://[2001:470:c:1818::2]:80/index.html
4.对http包头进行修改
方法之一就是添加以下标头:
- X-forwarded-for
- X-remote-IP
- X-originating-IP
- x-remote-addr
- x-client-ip
例如:
X-Originating-IP: 127.0.0.1
在一些做了访客流量负载的web架构很常见,他并不是把web服务器映射出去,而是把外面的访问流量通过一台流量转发机器转发到内网web应用服务器,这种形式的话,在转发进来的数据包中就会出现X-forwarded-for 等字段,标示着是哪个ip访问的web服务。
如果包存在:
- Content-Type: text/html
那么可以尝试做以下修改:
- Content-Type: #直接删除类型值
- Content-Type: text/htmlzzzzzzzzz #错误的类型值
- Content-Type: application/octet-stream #其他类型值
有时候将 MIME 类型设置为 multipart/form 数据然后对请求进行错误处理也有奇效。
- Content-Type: multipart/form-data ; boundary=0000
- Content-Type: mUltiPart/ForM-dATa; boundary=0000
- Content-Type: multipart/form-datax; boundary=0000
- Content-Type: multipart/form-data, boundary=0000
- Content-Type: multipart/form-data boundary=0000
- Content-Type: multipart/whatever; boundary=0000
- Content-Type: multipart/; boundary=0000
对HTTP方法进行更改:
把get 改成post ,post改成get,或者直接改成put
有时候错误方法也能成功访问
请求可以通过“GETS”而不是“GET”发送,并且在许多情况下仍会按预期运行。
特别是在 PHP 中,根据配置,cookie 值可以被视为参数
代码语言:javascript复制/cmd/a.php
cookie: cmd1=;cat /etc/passwd
还有的是就是把http协议 1.1 改成1.0 ,因为大部分服务器也支持1.0版本。
5 对参数操作
参数名称可以通过多种方式进行操作,具体服务器上运行的服务器端语言,还有取决于服务器的特性,这里讲一下php和asp的绕过。
1.通过硬编码值造成绕过
PHP 中的 ** **符号可用于实现此目的,而 ASP 中的 **%** 符号将实现类似的结果
在 ASP 中,可以将无效的 URL 编码添加到参数名称中(请注意,编码必须无效才能正常工作)
例子:
代码语言:javascript复制/cmd/a.php?%value=payload
/cmd/a.php?%}9value=payload
在 PHP 中,加号可以达到同样的效果:
代码语言:javascript复制/cmd/a.php? value=payload
2. 多个参数(HTTP参数污染)
在php中,如果遇到多个参数,那么是从右到左来取参数值
代码语言:javascript复制/cmd/a.php?value=1111111111111111111111111111&value=payload
又比如
代码语言:javascript复制/cmd/a.php?value=payload&value=payload
又比如
代码语言:javascript复制/cmd/a.php?page=cat /etc/passswd&page=
又比如
代码语言:javascript复制/cmd/a.php? page=cat&page=/etc/passswd&page=/passwd
在保证结果正确的情况下,想怎么玩就怎么玩
3.利用服务器特性
比如windows 的特性可以在文件名之后加_等符号,linux 加‘
6.通过控制字符
这些控制字符包括
- (CR)
- (LF)
- (CRLF)