背景为一次授权对某银行的攻防演练测试,进行记录
目标Waf
很多,站还少,只找到了一个感觉能搞的项目管理系统
测试了一下,没有枚举、top500+常规弱口令跑了一下也没有弱口令 只能试试看能不能找测试站或者源码了 提取了一波指纹,在fofa上看到有19个
非常幸运,找到一个站点有.git泄露
查看到一部分目录,虽然不全乎,但是找到了一个组件webuploader
,它是有上传漏洞的
但是很可惜,目标站点把这个接口删除了,应该是做过了安全测试
。
先想法子拿到完整的代码
,方便进行审计
,查看发现目标站点把很多接口都删了,为了提高效率先生成一个所有接口目录结构的URI,然后用HEAD 方法
探测,同步代码。
拿到完整的代码后就准备进行审计了,当然web狗肯定优先找上传
啦,发现了一个管理后台疑似存在一个能利用的上传接口
,接下来就想法子进管理后台。
先熟悉路由,找权限鉴定
的接口。
接着跟这个”notcheck”
有不少,根据代码构造请求发现未授权漏洞
用内置的用户做字典,并生成针对性口令字典(zhangsan对应口令为zs123,Zs123.这种)去爆破
。
发现了一个大哥的弱口令拿到普通用户权限
有权限了接着测试一波需要鉴权
的接口,发现了一个信息泄露
,直接返回所有用户口令md5。
解密后登入
用文件上传拿shell
因为内网设备比较多,所有优先找集权
、监控
这种系统,低线程扫一波这些系统的默认端口,发现一个grafana
用文件读取漏洞打的时候发现400了
同时也得到了信息,grafana在这个nginx
的后面,我们的payload应该被nginx处理后返回400
因为也没扫到别的系统,害怕大范围扫描会掉口子,就想着接着这个点再看看。
因为我们传入payload中的URI路径超过了根目录
,所以nginx返回400。
那我们的思路就是让nginx忽略掉
/../../../../../../../../../../etc/passwd
且传到后端的Grafana上 。
我们先来查看一下nginx的normailized
处理大致流程
1. 解码百分号编码:URL中的百分号编码(如 %20 代表空格)会被转换成相应的字符。
2. 合并斜杠:多个连续的斜杠(如 //)会被合并为一个单独的斜杠
3. 路径合并:移除URL路径中的冗余路径元素,如..和.。例如,/path/to/../file会被标准化为/path/file。
4. 规范化路径:移除任何冗余的元素
5. 尾部斜杠处理:根据配置,可能会添加或删除URL路径的尾部斜杠。
可以看到第三步就G了,那么接着看看有没有什么情况下nginx不经过
normailized
发现如果pxroxy_pass
配置中没有/
结尾的话,请求不会经过normailized。
Nginx还有一个Tipes是处理锚点,如果请求中包含了#
,那么Nginx会无视掉#后
的部分。通过这两个特性,我们就可以构造payload
(/public/plugins/alertlist/#/../../../../../../../../../../etc/passwd)
实现绕过,本地进行实验如下:
请求
/public/plugins/alertlist/../../../../../../../../../../etc/passwd
nginx返回400
,数据包到不了后端
若nginx配置代理如下:
此时访问
/public/plugins/alertlist/#../../../../../../../../../../etc/passwd\
因为nginx会忽略掉#后面的内容,且因为特性不经过normailized
,数据包会传到后端
从而绕过nginx 400限制
当然,如果nginx配置如下:
这种情况下再去访问
/public/plugins/alertlist/#../../../../../../../../../../etc/passwd
Nginx进行标准化处理
后就无法绕过了
相关的应用场景有nginx反代中绕过403的控制台,相关配置如下:
回到项目上,通过文件读取漏洞读取grafana系统内保存的口令信息,分别获取secret_key
、grafana.db
后通过
解密。
获得多个内网数据库口令
后面就是通过数据库的后渗透拿到服务器权限再进行比较常规的横纵向渗透了。