记录一次ewomail测试

ewomail存在默认密码问题

某些站点可能未修改

admin/ewimail123

1614163331614

然后看了下路由,很有意思,这路由写的颇有几分spring的感觉

1614163792014

后台注入

第一处

由于有没有前台,只能看后台的注入

首先看一下数据库的连接参数

采用PDO连接,并且未禁止多语句查询

1614163427302

存在注入,且是root权限时可直接获取系统权限

基础函数方法分析

接受参数的方法为ipost或者iany或者iget

其中ipost如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function ipost($key=''){
if($key){
$static = istatic();
if(isset($static[$key])){
$data = $static[$key];
}else{
$data = $_POST[$key];
}

}else{
$data = $_POST;
}
return iFilter($data);
}

iFilter方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
function iFilter($var)
{
if(is_array($var)){
foreach($var as $key=>$v){
$var[$key] = iFilter($v);
}
}else{
$var = trim(htmlspecialchars($var));
$var = str_replace(array('\n', '\r'), array(chr(10), chr(13)), addslashes($var));
}
return $var;

}

可以看到,对参数值进行转义,那么就存在一个键key的问题,这类问题,多出于insertupdate

全局搜索,数据库update方法

可以看到,第二个参数完全可控时存在key注入

where完全可控的时候,同样存在注入问题

1614163893779

找到下面这处

数组没问题,where的传参存在问题

1614164293685

查看其路由

1614164448997

复现

1614164641653

第二处

数据库删除语句

1
2
3
4
5
public function delete($tablename,$where){
$tablename = table($tablename);
$sql = "DELETE FROM $tablename WHERE $where";
return $this->execute($sql);
}

可以看到不对数组进行处理

查看调用方法

存在多处调用,且id为整形,不受过滤方法的影响

1614164874195

跟进getOne方法

发现对id进行了强转

1614164917353

但是delete语句的id并未强转

所以存在注入

不测试了

第三处

1614165081681

可以发现是拼接在order by后面的,也不需要单引号,可以完成注入

直接目标站测试

1614165142576

数据库也不是root,没法子通过数据库获取shell

其他

搜索一下其他

  • 文件包含
  • 代码执行函数
  • 命令执行函数
  • 模板操作
  • 文件上传
  • …..

所有的搜完,发现只有一处调用file_put_contents,还是写一个log文件,告辞

多少连个任意文件删除都不行

1614165456867

反序列化->文件删除

后续看了一下,整个代码的流程

通过入口文件index.php,加载run.php

1614165535964

在程序开始之前回显包含模板的操作库

1614165600236

然后Smarty.class.php会自动加载bootstrap.php

1614165666503

1614165692217

最后通过Autoloader.php加载所有类

发现从数据库中获取的数据被反序列化

1614165812589

查找利用链

可惜的断路

1614165960959

跟进yy_pop_parser_stack

挺可惜的是个fwritefile_put_contents的话直接就写shell

注:需要yyTraceFILE是一个打开的资源

1614166029377

后续搜了__toString__get__set__call,都没什么可以RCE

换个入口之后

1614166204808

跟进之后可以任意文件删除

1614166275540

但是实际测试的时候出现问题,smart_Template_cached的值设置不上

1614168435569

换成另外一个upload,尝试通过触发__get获取参数值,均失败

查找,发现没有$cached在类中的定义,就是个固定得

遂放弃吧

失败的poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
class Smarty_Internal_CacheResource_File{

}

class Smarty_Template_Cached{
public $handler;
public $lock_id;
public $is_locked = 1;
public function __construct(){
$this->handler = new Smarty_Internal_CacheResource_File();
$this->lock_id = "test.txt"; //待删除的文件
$this->is_locked = 1;
}
}

class Upload{
protected $config;
public function __construct(){
$this->config['handler'] = new Smarty_Internal_CacheResource_File();
$this->config['lock_id'] = "test.txt"; //待删除的文件
$this->config['is_locked'] = 1;
}
}
class Smarty{
public $cache_locking = true;
}



class Smarty_Internal_Template{
protected $smarty;
private $cached;
public function __construct(){
$this->smarty = new Smarty();
$this->cached = new Upload();
}
}

$a = new Smarty_Internal_Template();
echo base64_encode(serialize($a));