Web安全原理剖析(二十五)——竞争条件攻击及文件上传修复


8.11 竞争条件攻击

  一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含WebShell脚本,如果包含则删除该文件。这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击。

  攻击者先上传一个WebShell脚本2.php,2.php的内容是生成一个新的WebShell脚本shell.php,2.PHP的代码如下所示。

<?php
$file = fopen("shell.php","w");
fputs($file,"<?php phpinfo();?>");
fclose($file);
?>

  当2.php上传成功后,客户端立即访问2.php,则会在服务端当前目录下自动生成shell.php,这时攻击者就利用时间差完成了WebShell的上传,如图102所示。

图102 利用竞争条件上传WebShell

8.12 竞争条件代码分析

  程序获取文件$_FIKES[“file”][“name”]的代码如下所示,先判断upload目录下是否存在相同文件,如果不存在,则直接上传文件,在判断文件是否为WebShell时,还有删除WebShell时,都是需要时间来执行的,如果我们能在删除文件前就访问该WebShell,那么会创建一个新的WebShell,从而绕过改代码限制。

<?php

if ($_FILES["file"]["error"] > 0)
{
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("upload/" . $_FILES["file"]["name"]))
    {
        echo $_FILES["file"]["name"] . " already exists. ";
    }
    else
    {
    move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);
    echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
    //为了说明,这里直接让程序sleep 10s。
    //sleep("10");
    //unlink("upload/" . $_FILES["file"]["name"]);
    }
}
?>


8.13 文件上传修复建议

  针对文件上传的修复,笔者给出以下两点建议。

  • 通过白名单的方式判断文件后缀是否合法。

  • 对上传后的文件进行重命名,例如rand(10,99).date(“YmdHis”).“jpg”。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Phanton03167

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值