0%

[CISCN2020 华东北赛区]web wp

国赛结束写wp,输出很低,web都被神仙们日穿了,每个题都几百解,太牛逼了
没保留题目源码,就凑合着写吧

easyphp

用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

littlegame

阅读全文 »

[NPUCTF2020]验证🐎

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完全相等。

阅读全文 »

[CISCN2019 华东南赛区]Web4

国赛国赛,复现复现

题解

打开界面顺着给的链接走,会进read路由并且获取参数url=https://www.baidu.com
可以猜出来打一个ssrf,不过具体怎么打倒是没有思路,不过首先还是先用file协议读一下文件吧,然后输入file就直接回显WAF,果然没有这么简单啊

根据路由类型再访问一下index.php之类的路径,发现不存在index.php文件,大概可以猜出来是个python题或者js题之类的,不过还是不知道咋搞啊

阅读全文 »

[CISCN2019 华北赛区 Day1 Web5]CyberPunk

buu上的老题,文件包含加二次注入,还是个update注入,幸好没过滤不然做不出来了

文件包含

index.php中有注释提示?file参数,猜就是文件包含,直接读源码,翻一下一共能找到index.php,config.php,change.php,delete.php,search.php,confirm.php六个文件,全部用filter读下来,很简单对吧

update注入

阅读全文 »

[HarekazeCTF2019]Easy Notes

PHP题,感觉好久没见了,buu上也不说明一下这个题给不给源码,导致我盲测了一个多小时受不了了看wp告诉我是有源码的,然后去GitHub翻源码做。。。害人

卑微盲测

随便登录一下,发现add,delete,view,export几个基本功能,flag功能获取flag但是要求我是admin,登录名改成admin显然无效,不知道是想让我怎么攻击,很令人在意的就是访问时是?page=add这种形式,妥妥的文件包含,开始用filter读源码,被重定向回去,然后访问add.php,报404,那就估计是有一个次级目录专门放包含的文件,尝试跳目录包含自己,不行,简单的跳目录也不行,最后试了试page=/add都不行。放弃包含,估计是已经写死了所有能包含的内容了,后来看源码的确如此。

文件包含不行也有其他的攻击点,这个note添加进去之后会分配一个随机id,还能回显,这种东西可能会通过数据库维护文件系统,note的标题可能存在二次注入,打了一波过去,无果。。。然后查看note的时候get又会多提交一个参数id,也是一波注入,再打一轮,无果。。。心态爆炸

阅读全文 »