安全矩阵

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

SRC技巧|挖不到洞真的是你的问题嘛

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-10-26 10:22:21 | 显示全部楼层 |阅读模式
原文链接:SRC技巧|挖不到洞真的是你的问题嘛

事情是这样,在一次渗透项目中发现了目标 OA 的一个弱口令,登入系统后找到了一处上传点。但在上传木马 GetShell 的时候遇到了大坑,相同的操作、JDK 版本、burpsuite 甚至连 burp 配置都一样我和同事同时测试却是两个截然不同的结果(同事按照我的思路 getshell 了,我还在冷风中摇曳像只傻狗)遂记录下来。
因为是开源 OA 先从源码简单分析下漏洞原理
定位到编辑资料上传头像处
  1. if (this.Fup.HasFile)
  2. {
  3.         FileExtension[] fileEx = new FileExtension[]
  4.         {
  5.                 FileExtension.GIF,
  6.                 FileExtension.JPG,
  7.                 FileExtension.PNG,
  8.                 FileExtension.BMP
  9.         };
  10. if (FileSystemManager.IsAllowedExtension(this.Fup, fileEx))
  11.         {
  12. string userName = sys_UserInfo.UserName;
  13. string text = base.Server.MapPath("~/Files/common/");
  14. string text2 = userName + Path.GetExtension(this.Fup.FileName);
  15.                 text += text2;
  16. this.Fup.PostedFile.SaveAs(text);
  17.                 sys_UserInfo.PerPic = text2;
  18. this.Fup.Dispose();
  19.         }
  20. }
复制代码

判断文件合法性的方法
  1. public static bool IsAllowedExtension(FileUpload fileUpload_0, FileExtension[] fileEx)
  2. {
  3. int contentLength = fileUpload_0.PostedFile.ContentLength;
  4. byte[] buffer = new byte[contentLength];
  5.         fileUpload_0.PostedFile.InputStream.Read(buffer, 0, contentLength);
  6.         MemoryStream memoryStream = new MemoryStream(buffer);
  7.         BinaryReader binaryReader = new BinaryReader(memoryStream);
  8. string text = "";
  9. try
  10.         {
  11.                 text = binaryReader.ReadByte().ToString();
  12.                 text += binaryReader.ReadByte().ToString();
  13.         }
  14. catch
  15.         {
  16.         }
  17.         binaryReader.Close();
  18.         memoryStream.Close();
  19. bool result;
  20. for (int i = 0; i < fileEx.Length; i++)
  21.         {
  22.                 FileExtension fileExtension = fileEx;
  23. if (int.Parse(text) == (int)fileExtension)
  24.                 {
  25.                         result = true;
  26. return result;
  27.                 }
  28.         }
  29.         result = false;
  30. return result;
  31. }
复制代码

其中 FileExtension 为枚举类型,白名单
  1. public enum FileExtension
  2. {
  3. JPG = 255216,
  4. GIF = 7173,
  5. BMP = 6677,
  6. PNG = 13780
  7. }
复制代码


取文件内容前两个字节的十进制依次和 FileExtension 里定义的枚举值作比较相同则上传文件。很经典的问题这里判断文件合法性的操作并没有判断文件后缀,而只看文件头。故我们可以制作上传图片马绕过或给木马加上图片的文件头:木马内容十六进制前两个字节添加任意一个枚举值。如 JPG 255216 换为十六进制就是FF D8,GIF 7173 转换为十六进制就是47 49
copy normal.jpg/b + shell.aspx/a shell.jpg
我一般习惯生成正常图片后缀的图片马,再使用 burp 抓包把图片后缀改为脚本后缀,免得遇到前端验证等的一些情况(别和我讲什么禁用 JS)
坑点就在改包的过程!下图是原始的包的文件名和文件内容的 HEX 形式

然后在 RAW 包选中 jpg,修改为 aspx 再次查看

可以看到图片文件头的几个字节全都变为了ef bf bd(破案万岁),原来的白名单文件头没了故上传 GetShell 不成功。
最后通过和同事控制变量法最终得出结论:
我不适合挖洞电脑字符集可能有问题。
关于这个 UTF-8 字符可以看这篇文章你应该记住的一个 UTF-8 字符「EF BF BD」
解决方法是直接在原始包的 HEX 选中指定字节进行编辑

所以条条道路通罗马,求知欲和细心是最重要的。


回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-22 22:20 , Processed in 0.033425 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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