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 版权
本文乃作者原创 未经允许禁止转载
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论