| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> php代码审计-文件上传 -> 正文阅读 |
|
[PHP知识库]php代码审计-文件上传 |
文件上传漏洞在现代的web网站中,文件上传功是一种常见的功能。比如一些博客网站,允许用户上传,图片,视频,头像,等许多其他类型的文件。但是向用户接受的文件越多,所面临的信息安全风险也就越大。如果web网站存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将可执行上传到服务器中,最后获取到网站的权限。 一个漏洞百出的文件上传代码<?php $file=$_FILES['tx']; if(is_uploaded_file($file["tmp_name"])) { if(move_uploaded_file($file["tmp_name"],"file/".$file['name'])) {echo "成功";} else {echo "失败";} } else { echo "上传失败"; } 这段代码提供了文件上传的功能,但是他很危险没有任何安全防护,被上传的文件也按原名保存在目录里。 用if函数判断是否有文件上传,有的话以原名复制到file的目录下。 js前端检测的文件上传代码<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script type="text/javascript"> function wenjscgl(sc){ var wenjian= sc.value; var hz = wenjian.toLowerCase().substr(wenjian.lastIndexOf(".")); if(hz!=".jpg") { alert("请选择jpg格式的照片上传"); sc.outerHTML=sc.outerHTML; } } </script> <form action="dck.php" method="POST" enctype="multipart/form-data"> 上传文件 <input type='file' name="tx" id="file" οnchange="wenjscgl(this)"> <input type="submit" name="tj" value="提交"> </form> <?php $file=$_FILES['tx']; if(isset($_POST['tj'])) if(is_uploaded_file($file["tmp_name"])) { if(move_uploaded_file($file["tmp_name"],"file/".$file['name'])) {echo "成功";} else {echo "失败";} } else { echo "请选择文件上传"; }?> </body> </html> 这是一段html+javascript+php的代码,javascript负责前端检测,拒绝不是.jpg的文件上传,javascript代码为获取文件上传的后缀并对后缀名进行判断如果不是jpg弹窗,是jpg就执行后面的php语句。php语句 判断是否有提交文件,有文件上传就用move_uploaded_file函数用本名上传至file目录下。 js检测绕过由于上面的代码只做了前端的过滤,并没有在后端用php过滤,所以我们只要绕过前端就可以上传jpg格式的文件了。这里使用burpsuite来实施绕过。 把要上传的文件先改成jpg格式,通过前端验证以后用burp抓包再修改回可执行的格式。 可以看到上传成功。 文件后缀绕过我们在网站上提交文件时,有些web网站会通过文件后缀过滤的方法来阻止恶意文件上传的事件。那么有过滤就有绕过 文件后缀源代码分析 header('Content-type:text/html;charset=utf-8'); $file=$_FILES['tx']; if(isset($_POST['tj'])){ if(is_uploaded_file($file["tmp_name"])) { $qwe=pathinfo($_FILES["tx"]["name"]); $kzm=$qwe['extension']; if(strtolower($kzm)=='php'){ echo "<script>alert('不允许的文件上传')</script>"; }else{ move_uploaded_file($_FILES['tx']['tmp_name'],"file/".$_FILES['tx']['name']); echo "<script>alert('文件上传成功')</script>"; } } else { echo "请选择文件上传"; }}?> 老规矩上来先分析一下源码,用$_FILES获取提交的文件,传入变量$file中,接着用if控制获取到提交才执行下面的语句,再用if判断提交中是否有文件。用pathinfo截取文件的后缀名,用strtolower函数将获取的后缀名转为小写。判断$kzm字段中也就是我们上传的文件后缀名是否是.php,如果是则弹出前端代码不“允许的文件上传”,反之 move_uploaded_file函数以原文件名上传至f同级目录file中。 需要注意的是虽然警告语句是用前端代码弹出的,但是我们对文件的判定是后端php执行的,所以上文提到的前端过滤代码在这里并不适用. 文件后缀绕过分析文件后缀绕过的姿势也有非常多。 上面代码使用黑名单只过滤了.php文件的上传。 1,例如在httpd.conf中, 如果配置有如下代码,则能够解析php和phtm|文件。 2,apache不仅会解析.php的后缀名还会解析如php1,php2,php3之类的后缀。我们可以上传这样的文件绕过。 文件类型绕过通过文件类型过滤,如果服务端是通过content-type的值来判断文件类型而不是通过后缀名。 文件类型源代码分析<?php header('Content-type:text/html;charset=utf-8'); $file=$_FILES['tx']; if(is_uploaded_file($file['tmp_name'])){ $qwe = $_FILES["tx"]["type"]; if ($qwe == 'application/octet-stream') { echo "<script>alert('不允许的文件上传')</script>"; } else { move_uploaded_file($_FILES['tx']['tmp_name'], "file/" . $_FILES['tx']['name']); echo "<script>alert('文件上传成功')</script>"; } } ?> 代码中判定是否有文件提交,有文件提交就用qwe变量获取文件的content-type然后判断content-type值是否为application/octet-stream,application/octet-stream是php文件的类型。接着把文件上传至服务器file目录下。 文件类型绕过content-type值虽然看不见,但是我们使用burpsuite是可以修改的。使用burpsuite抓取文件上传数据包。 修改content-type值为jpeg的类型 image/jpeg 上传成功,其实可以修改成任意的字符串因为只过滤了php类型的,并没有对上传的类型做其他限制,只要不是php类型的就可以了。 |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 15:05:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |