0x01 前言
最近在打项目的时候,站点日常日不下来,于是只能打打供应商迂回一下来进行渗透了
刚好又发现了一些CMS,又刚好搞到了源码,接着又刚好感觉自己好像没有从来审过.net的源码
自己也没有发过.new审计的文章,于是就写写顺便给自己入入门咯
0x02 技能要求
这一点很重要, 决定了能不能看懂这一篇简单的文章
- 提前准备一个,下雨知道躲雨,不会乱捡地上的东西吃,大小便知道自理,会玩智能手机的大脑
- 学过任意一门编程语言,知道curd与mvc这种东西
- 拥有一台现代化的电子设备,例如:电脑
- 搞到.net的源码,不然审空气么
0x03 环境准备
工欲善其事,必先利其器
这里我个人喜欢使用dnSpy这个软件来审计.net的源码
软件github: https://github.com/dnSpy/dnSpy
个人下载的版本: https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-net-win64.zip0x04 案例一
0x04.1 信息收集
知己知彼,才能百战百胜,所以说想要后期简单一些,前期准备工作就要全一些了
例如我们现在访问一下目标,随便找个接口,看看最基础的路由是怎么样的
知道了这些以后,就可以通过这些信息找到对应的模块代码进行阅读了抓取的完整路由:
http://xxx.com/proxy/ipadv3/s.aspx?WorkerCode=111&WorkerPass=123&LRCode=&m=Login
从路由与命名可以看的出来
m = 方法
WorkerCode,WorkerPass与LRCode都是参数
0x04.2 路由分析
从这里以后就可以开始正式审计了,源码的话,自己想办法搞吧,现在先看看源码的目录结构
一般来说是先看一下 Web.config 里面通常保存着各种配置文件,例如:数据库账号密码等
我就不截图了,因为里面只有数据库配置没什么有价值的东西,看的出来还是很清晰的
根据前面抓取到的路由,我们可以找找文件./ym/ipadv3/s.aspx,调用的方法m=Login
通过下图可以看的出来,代码在 Inherits="AspDIY.Net.Proxy.Web.ipadv3.s" 中
这种情况如果文件很多的话,想快速定位那么可以通过搜索类名的方法来快速定位
搜索: AspDIY
通过下图知道了./ym/ipadv3/s.aspx的实际业务代码
在./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll中
而./ym/proxy/bin/保存的就是全部业务的dll
知道这些以后,接下来的事情就是打开dnSpy然后引入./ym/proxy/bin/下的文件,进行代码审计即可
0x04.3 漏洞挖掘
0x04.3.1 sql注入
然后就可以开审了
http://xxx.com/proxy/ipadv3/s.aspx?WorkerCode=111&WorkerPass=123&LRCode=&m=Login
对应源码 ./ym/ipadv3/s.aspx
然后对应 ./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll
所以现在查看这个dll即可
打开 ./ym/proxy/bin/AspDIY.Net.Proxy.Web.dll
继续看 AspDIY.Net.Proxy.Web.ipadv3
下面的 s 类
里面的 m = Login
查看具体业务
string text = RequestHelper.GetString("WorkerCode").PadLeft(6, '0');
主要跟一下这个参数
发现被 Services.Login(text, @string); 调用,继续跟下去
打开: ./ym/proxy/bin/AspDIY.Net.Proxy.Core.dll
命名空间: AspDIY.Net.Proxy.Core.Ipadv3
类: Services
方法: Login
参数: No
发现 No(工号)这个参数被 clsWorkerBaseData.CheckLogin(No, Pass, 0); 调用,继续跟下去
打开: ./ym/proxy/bin/BusinessData.dll
命名空间: Business.BusinessData
类: clsWorkerBaseData
方法: CheckLogin
参数: Code
可以看到 Code只是被Trim处理了,而Trim就是删除左右两边的空格,所以等于没做过滤
打开: ./ym/proxy/bin/BusinessData.dll
命名空间: Business.BusinessData
类: clsWorkerBaseData
方法: MW2PJG1ix
参数: A_1
通过下图可以知道 A_1 = Code = No = WorkerCode = 登录的工号
然后终于带入了sql查询整体是没过滤的
其中我们发现
string sqlStr =("cwBlAGwAZQBjAHQAIABXAG8AcgBrAGUAcgBDAG8AZABlACwAIABQAGEAcwBzACAALABDAGEAcgBkAGkAZAAgAGYAcgBvAG0AIABZAF8AVwBvAHIAawBlAHIAIAB3AGgAZQByAGUAIABXAG8AcgBrAGUAcgBDAG8AZABlAD0AJwA=") + A_1 + ("JwAgAGEAbgBkACAASQBzAFUAcwBlAGQAPQAxAA==");
像是base64,解密一下
select WorkerCode, Pass ,Cardid from Y_Worker where WorkerCode=' + A_1 + ' and IsUsed=1
到这里整个漏洞挖掘就结束了,可以发现,登录处没过滤导致有注入
最后面我们在测试一下,看看是否真的是注入
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
0x05 案例二
0x05.1 信息收集
老样子访问一下目标,随便找个接口,看看最基础的路由是怎么样的
抓取的完整路由: http://test.com/login.aspx?Action=Login
从路由与命名可以看的出来
这一个比较的传统一些
Action = 方法
username,password,commit都属于参数
有了这个初步的消息以后,就可以通过源码来进行代码审计的阅读了
0x05.2 路由分析
源码的话,自己想办法搞吧
老样子先看看目录结构吧,然后通过前面实战抓的路由去查找一下具体文件
./ym2/login.aspx?Action=Login
通过下图可以看的出来,代码在 Inherits="Aspnet.Webform.Rmeeting.login" 中
这种情况如果文件很多的话,想快速定位那么可以通过搜索类名的方法来快速定位
搜索: Aspnet.Webform.Rmeeting
通过下图知道了./ym2/login.aspx的实际业务代码在./ym2/bin/Aspnet.Webform.Rmeeting.dll中
而./ym2/bin/保存的就是全部业务的dll
0x05.2.1 Login路由分析
知道这些以后,接下来的事情就是打开dnSpy然后引入./ym2/bin/下的文件,进行代码审计即可
那么让我们试试查找一下 http://test.com/login.aspx?Action=Login 的具体业务在哪里
这样可以简单直观的把路由快速理清楚
http://test.com/login.aspx?Action=Login 对应 ./ym2/login.aspx
./ym2/login.aspx 调用了 Inherits="Aspnet.Webform.Rmeeting.login"
Aspnet.Webform.Rmeeting.dll 在 ./ym2/bin/ 中
所以这里我通过dnSpy软件,引入./ym2/bin/的所有dll,慢慢分析Aspnet.Webform.Rmeeting.dll
查找 Aspnet.Webform.Rmeeting 的 login类
在通过login类查找在Action=Login
进行登录操作,后面的就不必在看了,在这里就已经找到路由了
也已经可以完全理解这个系统的路由走向了
0x05.3 漏洞挖掘
在挖掘中,发现大量的接口都是强制要登录的,只有少部分是不需要登录的
例如: ./ym2/Handler/AppMeeting.ashx
这个文件就需要登录,大部分的文件都是如下图
0x05.3.1 任意文件上传
前面说过大部分都是需要登录的接口,但是刚好,这个接口就是不需要登录的那个,并且有漏洞...
源码路径: ./ym2/Handler/FileTransferHandler.ashx
参数: Action
Action表示进入那个方法,ClipUpload与AttachmentUpload都是调用的一个类方法,就是参数不同而已
所以随便找一个方法跟进去看看
换成真实路径:http://test.com/Handler/FileTransferHandler.ashx?Action=ClipUpload
但是怎么构造有没有漏洞还不知道,所以继续跟下去
接下来就是查找这个FileTransferHelper对应的dll,然后查找到对应的HandleMethod方法进行审计了
如果你直接通过搜索你会发现dll你会发现没有FileTransferHelper.dll
这个时候不要慌,换成dnSpy软件来进行搜索即可
通过dnSpy软件的搜索功能,成功找到了 FileTransferHelper
源码路径: ./ym2/bin/Aspnet.Webform.Rmeeting.dll
这样就可以查看代码逻辑了
从下图看的出来,只要请求为POST/PUT即可进入 FileTransferHelper.UploadFile()
继续跟进 UploadFile() 方法
现在路径也知道了,怎么构造也可以,也知道了没有过滤了,那么接下来就是很简单的,构造数据包了
POST /Handler/FileTransferHandler.ashx?Action=ClipUpload HTTP/1.1
Host: test.com
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySBJd6SVtIrIWGGP5
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: ASP.NET_SessionId=lap5sx00tc4deuoq2jul1fbv; Language=zh-CN
Connection: close
Content-Length: 189
------WebKitFormBoundarySBJd6SVtIrIWGGP5
Content-Disposition: form-data; name="files[]"; filename="456.ashx"
Content-Type: image/png
<%@ Language="C#" Class="Handler1" %>
public class Handler1 : System.Web.IHttpHandler,System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest(System.Web.HttpContext Context)
{
Context.Response.ContentType = "text/plain";
Context.Response.Write("Hello World");
}
public bool IsReusable
{
get
{
return false;
}
}
}
------WebKitFormBoundarySBJd6SVtIrIWGGP5--
然后访问: http://test.com/Resources/image/33246xxxxxxxxxxxxx3374a.ashx
查看效果
0x06 总结
总的来说,.net的代码都比较的清晰明了,有点编程基础的话哪怕没正式学过.net也可以通过变量名,方法名,很快很好的审计出漏洞,对比其它语言例如java简单太多了