尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

文件上传基础

文件上传基础 一、文件上传1. 什么是文件上传文件上传就是用户把自己电脑上的文件发送给服务器服务器接收这个文件。例如网站有选择文件 → 上传整个过程本地文件 →浏览器 →HTTP请求 →服务器 →PHP处理 →保存文件2. PHP 如何接收上传文件PHP 使用预定义变量$_FILES例如前端input typefile namefilePHP$_FILES[file]3.$_FILES中有什么例如$_FILES[file]里面常见的数据$_FILES[file][name] $_FILES[file][type] $_FILES[file][tmp_name] $_FILES[file][error] $_FILES[file][size]分别表示name用户上传时的文件名type文件的MIME类型信息tmp_namePHP暂时保存上传文件的位置error上传过程中产生的错误代码size文件大小其中最重要的是$_FILES[file][tmp_name]。它表示服务器暂时保存这个上传文件的位置。二、文件上传是怎么保存的PHP 常使用move_uploaded_file()函数将上传的临时文件移动到指定的目录中从而将上传的文件保存下来。例如move_uploaded_file( $_FILES[file][tmp_name], uploads/test.jpg );这个函数有两个参数第一个参数上传文件当前的临时位置第二个参数文件最终保存的位置执行过程用户上传 test.jpg ↓ PHP接收 ↓ 临时保存 ↓ $_FILES[file][tmp_name] ↓ move_uploaded_file() ↓ uploads/test.jpg三、什么是文件上传漏洞正常的网站不会什么文件都接受。例如只允许.jpg .png .gif并且还应该检查文件大小文件类型、文件内容、文件扩展名、保存位置、文件名如果程序对这些检查存在问题就可能产生文件上传漏洞。所以文件上传漏洞的核心不是网站有上传功能。而是用户能够上传服务器本来不应该接受或处理的文件。也就是说如果服务器端代码未对客户端上传的文件进行严格的验证和过滤就容易造成可以上传任意文件的情况包括上传脚本 文件产生的危害恶意用户可以利用上传的恶意脚本文件控制整个文件甚至控制整服务器这个恶意脚本文件又被称为webshell可将webshell称为一直网页的后门webshell脚本具有非常强大的功能如查看服务器中的目录文件执行系统命令等。JavaScript检测绕过常用于用户选择文件上传的场景如果上传的文件的后缀不被允许则会弹窗告知。此时上传文件的数据包并没有发送到服务器端只是在客户端浏览器中使用JavaScript对数据包进行检测。上传了非jpg的格式绕过客户端JavaScript检测的方式1使用浏览器插件删除检测文件后缀的JavaScript代码然后上传文件即可绕过。2先把需要上传的文件的后缀改成允许上传的格式即可绕过JavaScript的检测然后抓包再把后缀名改成可执行文件的后缀即刻上传成功。客户端上传文件的HTML部分代码函数作用先将文件名转换为小写再通过substr函数获取文件名的最后一个点号后面的后缀。如果不是.jpg则弹框提示。服务端处理上传文件的代码如果上传文件没错在通过file_exists函数判断在upload目录下文件是否存在不存在就通过move_uploaded_file函数将文件保存到upload。此代码并没有对文件后缀做任何判断所以只需绕过前端JavaScript的校验就可以上传webshell。文件后缀/黑名单绕过原理虽然服务器代码中限制了某些后缀的文件上传但是有些版本的apache允许解析其他文件的后缀。例如在httpd.conf中如果配置了 Addtype application/x-httpd-php .php .phtml则能解析php和.phtml文件。网站管理员可以在配置文件中添加任意扩展名从而让网站去解析配置这些扩展名是因为这些扩展名曾经使用过在某些情况下需要对这些文件进行解析因此可以这样绕过。通常有phtml、phps、php3、php5、pht等apache是从右向左解析文件后缀的如果最右侧的扩展 名不可识别就继续往左解析直到遇到可以接卸的文件后缀为止。因此如果上传的文件名类似1.php.xxxxx由于xxxxx后缀不能被解析所以继续向左解析从而触发后门。第五行定义一个数组数组中的元素就是被列入黑名单的扩展名第八行截取扩展名第13行检测后缀名是否在黑名单中。在这里上传文件后对文件重命名了文件Content-Type绕过如果服务器端的代码时通过Content-Type的值来判断文件的类型就存在被绕过的可能因为Content-Type的值时通过客户端传递的可以修改当上传一个php文件时在Burp中将Content-Type修改为image/jpeg就可以绕过。竞争条件攻击由于网站上传文件的逻辑是先允许上传任意文件然后检查上传文件中是否包含webshell脚本如果包含则删除该文件。但是文件上传成功和删除文件这两个操作之间会存在一个时间差。攻击者可以利用这个时间差来完成竞争条件的上传漏洞攻击。思路先上传一个webshell脚本这个脚本的内容是生成一个新的webshell脚本。然后客户端立即访问上传的脚本就会在服务端自动生成webshell。?php fputs(fopen(../shell.php,w),?php eval($_POST[a]) ?); ?fopen(../shell.php,w)打开创建上层目录下shell.phpw代表写入模式如果文件不存在就新建存在就覆盖。fputs(文件句柄,内容)把一句话木马代码写入shell.php文件。写入的木马?php eval($_POST[a]) ?eval()执行 POST 参数a传过来的 PHP 代码用来屏蔽报错。攻击者使用蚁剑 / 菜刀连接shell.php参数密码为a获取网站权限。黑名单绕过文件上传漏洞修复建议通过白名单的方式判断文件后缀名是否合法对上传的文件进行重命名。
返回列表