网站地图    收藏   

主页 > 后端 > 网站安全 >

某CMS逻辑处理不当导致任意文件上传 - 网站安全

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 某CMS文件上传处理流程不当,导致用户可以控制文件名,从而上传任意文件。首先看其上传页面:htmlheadtitle图片上传/titlemeta http-equiv=Content-Type content=text/html; charset=gb2312sc......

某CMS文件上传处理流程不当,导致用户可以控制文件名,从而上传任意文件。
 首先看其上传页面:
<html>
<head>
<title>图片上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<script language="JavaScript">
 function check(){
  if(document.forms[0].file.value=="")
   {
    alert("请选择图片路径!");
 document.forms[0].file.focus();
 return false;
   }
   return true;
 }
</script>
<style type="text/css">
<!--
body,td,th {
 font-family: Arial, Helvetica, sans-serif;
 font-size: 14px;
}
a:link {
 text-decoration: none;
}
a:visited {
 text-decoration: none;
}
a:hover {
 text-decoration: none;
}
a:active {
 text-decoration: none;
}
body {
 margin-left: 0px;
 margin-top: 0px;
 margin-right: 0px;
 margin-bottom: 0px;
}
-->
</style></head>

<body>
<table width="296" height="38" border="0" align="center" cellpadding="0" cellspacing="0" class="t12">
  <form action="upload_ok.asp" method="post" enctype="multipart/form-data">
  <tr>
      <td align="center"><br>
        <strong>图片路径:</strong>
        <input type="file" name="file">
        <br>
        <br>
        <input type="submit" name="Submit" value=" 上 传 " onClick="return check();">
        <input name="textField" type="hidden" id="textField" value="<%=Trim(request("textField"))%>">
        <input name="filename" type="hidden" id="filename" value="<%=Trim(Request("imgname"))%>">
        <input name="action" type="hidden" id="action" value="<%=Trim(Request("action"))%>">
      <input name="imgtype" type="hidden" id="imgtype" value="<%=Request("imgtype")%>"> </td>
  </tr>
 </form>
</table>
</body>
</html>

传递给upload_ok.asp处理,看upload_ok.asp源码:
on error goto 0 '关闭on error resume next
Dim desFolder:desFolder=server.mappath("../pic")
Dim rs,filename,ext,imgname,imgname2,Y,M,D,Shuoming
ext = "jpg"
if Trim(ourRequest.Form("filename"))="" then
Y=Year(Now)
M=Month(Now)
D=Day(Now)
H=Hour(Now)
M=Minute(Now)
S=Second(Now)

imgname=Y*1000000000+M*10000000+D*100000+H*10000+M*1000+S*100+1
Set rs=server.CreateObject("ADODB.Recordset")
 rs.open"select top 1 * from pic where left(imgname,8)='"&left(imgname,8)&"' order by imgname desc",conn,1,1
 if Not (rs.Eof And rs.Bof) Then
  imgname2=CCur(rs("imgname"))+1
 Else
  imgname2=imgname
 End If
 filename=imgname2&".jpg"
Else
 filename=Trim(ourRequest.Form("filename"))
End If
Call ourRequest.File(0).SaveAs(desFolder, filename)

假如文件名为空,则以与日期时间相关+.jpg后缀来命名该文件,如果文件名不为空,则以该文件名命名这个文件。
再来看一下执行上传页面后的源文件:
<table width="296" height="38" border="0" align="center" cellpadding="0" cellspacing="0" class="t12">
  <form action="upload_ok.asp" method="post" enctype="multipart/form-data">
  <tr>
      <td align="center"><br>
        <strong>图片路径:</strong>
        <input type="file" name="file">
        <br>
        <br>
        <input type="submit" name="Submit" value=" 上 传 " onClick="return check();">
        <input name="textField" type="hidden" id="textField" value="bigpics">
        <input name="filename" type="hidden" id="filename" value="">
        <input name="action" type="hidden" id="action" value="add">
      <input name="imgtype" type="hidden" id="imgtype" value="bigpics"> </td>
  </tr>
 </form>
</table>

filename变量始终为空,所以默认所有文件都以日期时间+.jpg后缀处理。
漏洞证明:
我们将上传页面源文件另存为html文件,改form action="http://XXXX.XXXX/upload_ok.asp"
改filename变量的value="one.asp",打开本地上传页面,将一句话木马保存为.jpg格式后以本地页面上传,木马就被上传到了Pic目录下,文件名为one.asp.

 

 

修复方案:
修改上传页面用户验证;
修改上传文件文件名处理流程;
修改文件上传目录执行权限;

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论