浅谈文件上传引发的安全问题

  • A+
所属分类:dmsec
摘要

code:我们通过上面 明显看到了 从获取的文件名 直接在 html 页面输出

我之前遇到过很多大型网站会把文件的路径存放于数据库里 方便取出
特别会员头像为主
code:
<?php


0x00 前言

之前在乌云里看到了,XSS的文章 其中有一个就是利用文件上传 来触发XSS 我有感就想出了文件上传可以 一系列安全问题 代码写的比较粗糙各位看官们不要介意!!! 

0X01 文件名触发XSS

code:

<?php  $error =$_FILES["file"]["error"]; if ($error > 0)   {   echo "Error: " .$error. "<br />";   }   $filename = $_FILES["file"]["name"];  ?> <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>XSS</title> </head> <body>     <?php echo $filename;?> </body> </html> 

我们通过上面 明显看到了 从获取的文件名 直接在 html 页面输出
浅谈文件上传引发的安全问题
浅谈文件上传引发的安全问题

0X02 文件名上传之SQL注入

我之前遇到过很多大型网站会把文件的路径存放于数据库里 方便取出
特别会员头像为主
code:
<?php

$error = $_FILES["file"]["error"];  if($error >0){      echo "error".$error."<br/>"; }  $string = array('jpg','png','gif','jpeg'); $filename = $_FILES["file"]["name"]; $upname =  substr(strstr($filename,'.'),1,3);  if(!in_array($upname, $string)){      echo "只允许上传类型为jpg,png,gif,jpeg"; }     $sql = "insert into arelite ('id','img') values (".$filename.')';   echo  $sql;  ?> 

你们可能看到我 利用了 白名单 验证 文件名
$upname = substr(strstr($filename,’.’),1,3);
这一句话 有很严重的逻辑问题 只截图 文件名的第一个 ‘.’ 的后缀 如果我们上传的文件名 为
1.jpg.xxxx 呢? 那不是成功绕过验证?
$sql = “insert into arelite (‘id’,’img’) values (“.$filename.’)’;
并且这个sql 语句并没有进行任何过滤 $filename 这个参数是我们可以控制的文件名
比如 我们这样呢? 1.jpg.txt’ and 1=1 呢?
先测试把!23333333
浅谈文件上传引发的安全问题

0X03 文件名上传之绕过waf

文件上传的时的HTTP 头信息

POST /upload/sql/sql.php HTTP/1.1 Host: 127.0.0.1 Content-Length: 269 Cache-Control: max-age=0 Origin: http://127.0.0.1 Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryAyuhHNGtnQN85bLZ User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://127.0.0.1/upload/sql/sql.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close  ------WebKitFormBoundaryAyuhHNGtnQN85bLZ Content-Disposition: form-data; name="file"; filename="s.jpg.aspx) and 1=1--" Content-Type: application/octet-stream  <%@ Page Language="C#" ValidateRequest="false" %> </html>  ------WebKitFormBoundaryAyuhHNGtnQN85bLZ-- 

POST 请求的 HTTP 头信息

POST /upload/waf/waf.php HTTP/1.1 Host: 127.0.0.1 Content-Length: 8 Cache-Control: max-age=0 Origin: http://127.0.0.1 Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://127.0.0.1/upload/waf/waf.php Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close  text=123 

我相信有的看官们已经注意到了
Content-Type:的属性不一样
我们在来看一段代码
code:

<?php  if(empty($_POST)){     exit();  }  $name = $_POST['name'];  $sql = 'select * from admin where name ='.$name;  echo $sql ; //假如这个注入点 有waf拦截  ?> 

我们构造一个上传点
code:

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>xss</title> </head> <body>     <form action="./waf.php" method="post" enctype="multipart/form-data">      <input type="file" class="file1" name="file" />      <input type="text" name="name" value="and 1=1">      <button type="submit" class="but1">上传</button> </form> </body> </html> 

这样某些情况下可以绕过一些waf
浅谈文件上传引发的安全问题

当然 对于一些过滤XSS 我们应该也说不定可以利用此方法

0X04 后言

在这个互联网安全日益强大的世界中 作为一个合格的白帽子不要把眼光
永远那么局限在一个小世界里,有时候需要开阔自己眼界 方能突破瓶颈

0X05 版权

本文乃作者原创 未经允许禁止转载

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: