[强网杯2020] web
太难了,除了强网先锋的题都做不出来,强网先锋部分简单题都不会
web分类的题一个也不会,菜逼的眼神
主动
命令注入,或者说直接就是命令执行吧,啥过滤都不给的,非常的主动啊
国赛结束写wp,输出很低,web都被神仙们日穿了,每个题都几百解,太牛逼了
没保留题目源码,就凑合着写吧
用pntcl库开线程,子进程里面有命令执行,call_user_func_array($_GET['a'], array($_GET['b']), false, true);
父进程调用了pntcl_wait后调用pcntl_wifexited,子进程如果异常退出,父进程就会展示phpinfo,flag就在phpinfo里面,正则匹配$_GET[‘a’]不能有exec和pntcl之类的字段
使用call_user_func_array调用一个三个参数的函数,一开始fuzz能接受三个参数的函数fuzz了半天,最后意识到可以直接调用一个call_user_func,用call_user_func再去调用pntcl库的函数,不受正则影响,
师傅说子进程调用一个pntcl_wait就可以让父进程的pcntl_wifexited判断出问题,理论上感觉是子进程被挂起父进程wait结束发现子进程未正常退出吧?
在phpinfo中获取flag
js题,很有意思,学习了
const express = require('express');
const bodyParser = require('body-parser');
const cookieSession = require('cookie-session');
const fs = require('fs');
const crypto = require('crypto');
const keys = require('./key.js').keys;
function md5(s) {
return crypto.createHash('md5')
.update(s)
.digest('hex');
}
function saferEval(str) {
if (str.replace(/(?:Math(?:\.\w+)?)|[()+\-*/&|^%<>=,?:]|(?:\d+\.?\d*(?:e\d+)?)| /g, '')) {
return null;
}
return eval(str);
} // 2020.4/WORKER1 淦,上次的库太垃圾,我自己写了一个
const template = fs.readFileSync('./index.html').toString();
function render(results) {
return template.replace('{{results}}', results.join('<br/>'));
}
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieSession({
name: 'PHPSESSION', // 2020.3/WORKER2 嘿嘿,给👴爪⑧
keys
}));
Object.freeze(Object);
Object.freeze(Math);
app.post('/', function (req, res) {
let result = '';
const results = req.session.results || [];
const { e, first, second } = req.body;
if (first && second && first.length === second.length && first!==second && md5(first+keys[0]) === md5(second+keys[0])) {
if (req.body.e) {
try {
result = saferEval(e) || 'Wrong Wrong Wrong!!!';
} catch (e) {
console.log(e);
result = 'Wrong Wrong Wrong!!!';
}
results.unshift(`${req.body.e}=${result}`);
}
} else {
results.unshift('Not verified!');
}
if (results.length > 13) {
results.pop();
}
req.session.results = results;
res.send(render(req.session.results));
});
// 2019.10/WORKER1 老板娘说她要看到我们的源代码,用行数计算KPI
app.get('/source', function (req, res) {
res.set('Content-Type', 'text/javascript;charset=utf-8');
res.send(fs.readFileSync('./index.js'));
});
app.get('/', function (req, res) {
res.set('Content-Type', 'text/html;charset=utf-8');
req.session.admin = req.session.admin || 0;
res.send(render(req.session.results = req.session.results || []))
});
app.listen(80, '0.0.0.0', () => {
console.log('Start listening')
});
有两层限制,第一层是first && second && first.length === second.length && first!==second && md5(first+keys[0]) === md5(second+keys[0])
,需要提交两个长度一致但不全等的数据拼接一个key之后算出的md5完全相等。
国赛国赛,复现复现
打开界面顺着给的链接走,会进read路由并且获取参数url=https://www.baidu.com
可以猜出来打一个ssrf,不过具体怎么打倒是没有思路,不过首先还是先用file协议读一下文件吧,然后输入file就直接回显WAF,果然没有这么简单啊
根据路由类型再访问一下index.php之类的路径,发现不存在index.php文件,大概可以猜出来是个python题或者js题之类的,不过还是不知道咋搞啊