Author:sco4x0's Blog Team:安全盒子(www.secbox.cn

0x01 前言

随着各种cms的出现,代码审计也变得越来越吃香,。Orz
然后看到好多盆友都说asp.net不知道从何下手,自己稍微总结了一点。算是自己学习的一个小笔记,2333
asp.net cms的案例实在太少,而且漏洞点都是大同小异,不要埋怨不详细和没案例,THx
asp.net审计哪家强,膜拜WefGod大哥吧:Wefgod
还有zcgonvh神:zcgonvh
若有错误,请不要吐槽,大家心平气和坐下来,你把刀放下,我们好好聊聊天喝喝茶。

0x02 asp.net审计前奏

asp.net可以用C# ,VB.NET ,Jscript.net等等来开发,但是通常首选都是C#和VB.NET
审计asp.net的时候,首先得弄明白他的结构,他并不像php那么单纯。
一般来说,在asp.net应用中,需要进行观察的文件有:aspx.cs,.cs,.ashx和dll文件
aspx.cs是页面后的代码,aspx负责显示,服务器端的动作就是在aspx.cs定义的
.cs是类文件,公共类神马的就是这个了
.ashx是一般处理程序,主要用于写web handler,可以理解成不会显示的aspx页面,不过效率更高
dll就是编译之后的cs文件

0x03 工欲善其事,必先利其器

如果遇到的asp.net cms源码包是没有编译成dll的话,那么就方便很多了,比如地平线cms
而更多的是会遇到编译成了dll,这样相对地说就麻烦很多了,不过也有方法
一:Reflector
大名鼎鼎的Reflector想必都不陌生了,他可以将·NET程序集中的中间语言反编译成C#或者Visual Basic代码,除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持,比如屌炸天的reflexil
二:ILSpy
自2011年2月份开始,reflector就开始转向收费软件,所以ILSpy也就应运而生了,它反编译出的代码和reflector差不多
三:屌屌哒的Visual Studio
这个就不需要再作什么介绍了。。
若有遗漏求补充。。

0x04 asp.net应用安全

这是一些平台特有的点。若是有错误,大家坐下来好好聊聊,别冻手冻脚。如果不感兴趣,直接往下跳吧

  • ValidateRequest
    在aspx的@ Page中,或许会看到这么一句:validateRequest="true",这时会发现,如果在表单中输入xss payload,就会返回一个错误:检测到潜在危险xxx,这也直接导致了很多asp.net程序猿压根就不知道xss这回事。这个验证貌似很无解,传说中,有方法是可以绕过这个验证的,但是需要利用IE的各种BUG,构造语句:

 

1
<~/XSS/*- */STYLE=xss:e/**/xpression(alert('XSS'))>

但是因为IE修复了,所以也就没成了。如果在开发中,不知道怎么处理xss的话,把validateRequest设置为true比较好

  • 一般处理程序ashx

系统默认创建的ashx文件,一般都是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ WebHandler Language="C#" Class="Handler2" %>
using System;
using System.Web;
public class Handler2 : IHttpHandler {

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = "text/plain";

context.Response.Write("Hello ASP.NET");

}

public bool IsReusable {

get {

return false;

}

}

}

但是如果被黑客知道了地址的话,源码就会直接暴露出来 那么可以这么写:

1
<%@ WebHandler Language="C#" Class="Handler2" CodeBehind="Handle2.cs" %>

将实现的代码放入app_code中,保证代码的隐秘和安全

  • 信息安全之VIEWSTATE
    在asp.net应用中,查看源码会经常看到这样一段东西:

asp.net代码审计基础-安全盒子

  • ViewState 是客户端的状态管理机制, 通过一个 ID __VIEWSTATE 存储在一个隐藏的区域中.看起来像是一个加密过的字符串。其实就是一段Base64编码的字符串,更多内容,请见:传送门 内容太多,实在搬不动了

不写了 。。。 以后的其他再写吧。

0x05 开始审计asp.net应用

其实漏洞点都大同小异,不同的也许就语法的差异了,至于漏洞是如何产生的,也许就不用再详细多说了。

1
2
3
4
5
6
7
8
9
Public static string GetIP(){
string result = HTTpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if(string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if(string.IsNullOrEmpty(result))
result = HttpContext.Current.Request.UserHostAddress;
if(string.IsNullOrEmpty(result))
return "127.0.0.1";
return result;}

至于二次注入神马的,案例确实不好找,但是这种都是属于知识点共通的

其他mark内容

  • ascx后门
    实在佩服wefgod大哥的脑洞。请收下我的胳膊肘和膝盖,传送门
  • viewstate安全实例
    再次跪舔wefgod大哥,传送门

0x06 小结

我也很想写的更详细,但是这些基础知识点大家也许都是听得耳朵都起茧子了。所以做了个大大大概的分类,而且asp.net的案例实在太少,原谅我的视野实在找不到其他的了。
另外,如果有小伙伴有trick,希望大家能一起多多交流,以后学的更多了,会继续完善这篇文章

asp.net代码审计基础-安全盒子扫 “安全盒子” 二维码 ,关注最新安全资讯!