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

目录

      • 8.11 竞争条件攻击
      • 8.12 竞争条件代码分析
      • 8.13 文件上传修复建议


8.11 竞争条件攻击

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

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


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

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

图102 利用竞争条件上传WebShell

8.12 竞争条件代码分析

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



if ($_FILES["file"]["error"] > 0)
{
    echo "Return Code: " . $_FILES["file"]["error"] . "
"
; } else { echo "Upload: " . $_FILES["file"]["name"] . "
"
; echo "Type: " . $_FILES["file"]["type"] . "
"
; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"
; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
"
; 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”。



你可能感兴趣的:(Web渗透测试,web安全,安全,文件上传,安全漏洞,网络安全)