·xss文件上传漏洞

时间:2024-03-18 22:41:29

·xss文件上传漏洞

本质:对上传的文件不加限制的漏洞,例如上传PHP文件。

面对一定程度上的防护,我们应该如何绕过。

一·,一句话木马:

<?php

Eval($.post{})>

::$DATA ([‘pass’]);

?>

再url栏对pass进行赋值,可实现类似cmd命令的操作。

Eval():将括号内的语句当作PHP语句进行执行。

二,工具:webs hell,可以通过它传递任意php代码,让其去执行,并且是可视化操作。

三,靶场:upload-labs(注意要使用老版本的PHP study,不然无法运行)。

  • 绕过方法
  1. 若过滤.php,可以将其改为.ph51上传(我们可以通过尝试 php3、php5、php*这种后缀名尝试,PHP5 文件实际上就是.PHP 文件,只不过代码由 PHP5 引擎解析。PHP5 是一种 PHP 版本间的区分,该后缀名并不常见,另外还有.PHP2、.PHP3 和.PHP4 文件。而当前最新的 PHP 版本为 PHP7)。
  2. 存在 js 前端判断,通过删除前端代码中的 checkfile(),使前端无法对上传的文件进行判断。
  • 先上传一个符合要求后缀的文件,使用抓包软件进行抓包,发送成功后将文件名改为.php,再放包。
  • 开代理进行抓包,看过滤位置在前端还是后端。
  • 在前端过滤的话,更改文件后缀让其运行。
  • 将文件后缀改为原后缀,重发,让其运行。
  • 复制链接,将其添加到webs hell上,得到shell。
  1. 如果服务端代码是通过 Content-Type (白名单)的值来判断文件的类型,那么就存在被绕过的可能,因为可以将其修改为可以通过的类型。

4,超文本入口:.htaccess,可以重新定义规则,例如:

:AddType application/x-httpd-php .jpg

这个指令代表着.jpg 文件会当做.php进行执行,但检测时,会被识别为jpg文件。

5,用 5.php. .绕过

代码运行最后得到的后缀为"." 不在黑名单中 然而又用原来的 5.php. .来拼接路径 由于 windows在文件命名中会删除.和空格 所以最终得到的是 5.php 因此绕过了黑名单限制。

补充知识:php 在 window 的时候如果文件名+"::$DATA"会把::$DATA 之后的数据当成文件流处理, 不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。所以我们上传的文件绕过了检测,会被执行。

6,大小写绕过

 $file_ext = strtolower($file_ext); //转换为小写 这个函数会将文件后缀名转化为小写 如果没有这类型的函数进行黑名单的检测,我们可以考虑使用大小写绕过的方式进行文件上传。 例如 pHP、PHP、PHp。

7、空格绕过 $file_ext = trim($file_ext); //首尾去空 会将文件后缀名前后的空格去除 在没有这种函数的情况 下,我们可以使用在后缀名后面加空格的方法绕过黑名单检测。

8、加点绕过

$file_name = deldot($file_name);//删除文件名末尾的点 在没有这类型函数的情况下,我们可以在文件名后加.绕过黑名单。

9、::$DATA 绕过

补充知识:php 在 window 的时候如果文件名+"::$DATA"会把::$DATA 之后的数据当成文件流处理, 不会检测后缀名,且保持"::$DATA"之前的文件名名可以改成 1.php::$DAT

10、综合型绕过,具体得根据代码是如何过滤的来设定

用 10.php. .绕过代码运行最后得到的后缀为"." 不在黑名单中 然而又用原来的 10.php. .来保存文件,因此绕过了黑名单限制。

11、双写绕过

阅读代码 关键代码如下

$file_name = trim($_FILES['upload_file']['name']);

$file_name = str_ireplace($deny_ext,"", $file_name);

$temp_file = $_FILES['upload_file']['tmp_name'];

$img_path = UPLOAD_PATH.'/'.$file_name;

if (move_uploaded_file($temp_file, $img_path)) {

$is_upload = true;

}

发现依旧是用上传的文件名来拼接路径并保存文件 没有对文件重命名,只是用了 str_ireplace()函数

来检测(此函数无视大小写) 如果文件名含有黑名单里面的字符串 就替换为空

但是只替换一次 并没有进行正则匹配或者是循环匹配敏感字符 因此只要双写 php 即可 因为是从

左往右读的 所以替换为空后 还是 php。pphphp、phphpp 都可以尝试

12、get 型 00 截断

需要 php 版本<5.3.4,并且 magic_quotes_gpc 关闭。

上传 zoe.php 用 BP 抓包修改参数,把 upload/后面加上 zoe.php%00(即图二),下面的

filename=”zoe.php”改为 zoe.png