ASP.NET代码审计基础

暗月博客 2019年11月21日21:26:46评论2,155 views字数 4551阅读15分10秒阅读模式
摘要

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

0x01 前言
给自己的博客打个小广告,233 Blog:http://www.sco4x0.com
随着各种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的话,那么就方便很多了
而更多的是会遇到编译成了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,构造语句:

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

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

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

<%@ 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;         }     } }

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

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

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

    信息安全之VIEWSTATE
    在asp.net应用中,查看源码会经常看到这样一段东西:
    ViewState 是客户端的状态管理机制, 通过一个 ID __VIEWSTATE 存储在一个隐藏的区域中.看起来像是一个加密过的字符串。其实就是一段Base64编码的字符串,更多内容,请见:传送门 内容太多,实在搬不动了

不写了 。。。 以后的其他再写吧。
0x05 开始审计asp.net应用
其实漏洞点都大同小异,不同的也许就语法的差异了,至于漏洞是如何产生的,也许就不用再详细多说了。
sql注入
处理字符串不当,或者是防御规则脆弱,导致非法用户数据入库
比如大哥的

逐浪CMS通用型SQL注入4+5
逐浪CMS通用型SQL注入3(bypass)

除了常见的拼接字符串之外,还有这种

 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; }

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

    xss
    待补充,实在没找到案例
    csrf
    待补充,实在没找到案例
    身份伪造
    看名字就知道是什么了。。
    见大哥的:ROYCMS身份伪造进入后台
    文件上传
    截断,大小写,js验证,其余待补充。实在找不到案例。
    文件下载|文件查看|文件删除|文件包含
    例如这类:wooyun-2010-081196
    在接收到文件参数的时候,并没有对其进行过多的检测,太过相信请求的数据。
    截断技巧如%00之类的
    看deepsoon cms中的一个案例

string filePath;  string fileName;  protected void Page_Load(object sender, EventArgs e)         {      filePath = Request.QueryString["filePath"];      fileName = Request.QueryString["fileName"];      DeepSoonHelp dh = new DeepSoonHelp();      if (!IsPostBack && dh.notHasSQLInsertCode(filePath) && dh.notHasSQLInsertCode(fileName) )       {           string fileAtServer = Server.MapPath("../"+filePath+fileName).ToString();          if(File.Exists(fileAtServer))         {                  string fileContent = "";                  fileContent = File.ReadAllText(fileAtServer);                   this.labelFileFullPath.Text = filePath + fileName;                  this.textFileContent.Text = fileContent;          }          else         {              this.labelSaveInfor.Text = "文件不存在";              Page.ClientScript.RegisterStartupScript(GetType(), "errorInfor", "");          }      } }

    文件名filename和文件路径filepath都是querystring获取到,然后用一个方法过滤了一下,其实没什么用,因为那个方法是过滤sql注入的,在这里没什么影响,判断了一下这个文件是不是存在,如果存在的话就直接读取文件并显示在文本框中,那么就可以进行构造了

         其余的求补充。

    平行权限(越权)
    越权的出现是因为程序员在做增查删改的时候,没有详细验证请求数据
    越权的更多姿势和方法,参考越权之王的paper吧:我的越权之道
    案例:ROYCMS普通权限严重的越权操作
    逻辑漏洞
    这类漏洞最麻烦。 多出现于找回密码啊,各种认证啊,验证码重用啊。等等
    deepsoon cms的一个案例:

          在后台页面中,都继承于类:PageBase,其中可以看到:

If(base.strUser.ToString().Trim() == “”){         Respone.Redirect(“/admin/deepSoonLogin.aspx”) }

在PageBase中取基类strUser的值是否为空,那么直接找PageBase的基类ValidateBase 在ValidDateBase中有一个基类成员strUser ,看怎么取值的

/* if (Session["strUser"] != null)     return Session["strUser"].ToString(); else     return ""; */ if (Request.Cookies["strUser4Deepsoon"] != null){     HttpCookie userCookie = Request.Cookies["strUser4Deepsoon"];     return HttpUtility.UrlDecode(HttpUtility.UrlDecode(userCookie.Value, Encoding.GetEncoding("UTF-8"))); } else     return "";获取cookie strUser4Deepsoon,判断其值是否为空,如果不为空就返回该值,那么在PageBase中的判断是如果不为空就不跳转到登陆页面,而且这里没有判断strUser的值是否正确,所以不论strUser是什么值都能访问,在访问后台页面的时候截包,添加strUser4Deepsoon这个cookie值,然后就直接访问后台任意页面

其他mark内容

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

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

搬运工 不谢 没有很好排版 也没太多时间 想看原版到

http://blackbap.org/forum.php?mod=viewthread&tid=7226

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
暗月博客
  • 本文由 发表于 2019年11月21日21:26:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   ASP.NET代码审计基础http://cn-sec.com/archives/72173.html

发表评论

匿名网友 填写信息