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自带的一个因式分解命令
发现题目显示的结果与我们在linux执行factor一样 那么猜测这里存在命令执行
发现我们执行命令是可以的 读一下/etc/passwd
也是有回显的 说明我们命令是执行成功的 但是输出结果过滤掉了除冒号和数字以外的符号
这里注意一下要将我们路径中的斜杠需要url编码一下 防止与url中的反斜杠产生歧义
所以我只要使其输出全部为数字 就能bypass了
这里用到了od命令
payload:114514;od%20-t%20d1%20%2Fflag
od -t d1的命令解释:
输出了每个字节按十进制输出
注意前面的是序号
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
信息收集
这个题目做的很懵逼
访问index.php 有个文件包含
payload的是:GET /nssctf/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/flag.txt HTTP/1.1
最终在请求包中达到的效果为:
1 | GET /nssctf/1 HTTP/1.1 |
看大佬WP是Apache HTTP Server 请求走私漏洞 CVE-2023-25690 参考:https://xz.aliyun.com/t/12345
还有CRLF注入 参考https://www.cnblogs.com/mysticbinary/p/12560080.html
问了一下GPT 感觉说的很到位
比如我们可以bp抓包一下 就可以看到请求体内容结尾都是\r\n
结尾的
在HTTP当中HTTP的Header和Body之间就是用两个crlf进行分隔的,如果能控制HTTP消息头中的字符,就能注入一些恶意的换行
比如chatGPT在其中恶意添加crlf
(\r\n
) 再加入一个恶意制造的请求体 导致解析出问题
回到题目 读 /usr/local/apache2/conf/httpd.conf
看大佬wp是 做了个proxy转发
这也就是为什么payload访问的是localhost 从内部网上的服务器去读flag.txt
MyWeb
源码如下:
1 |
|
类似于一个沙箱逃逸吧 构造特殊的方式来bypass
mode=save 读入 mode=read 读出
主要是: $data = str_replace(']', ", '$value']", $data);
利用这个逃逸
我们不输入任何内容直接读一下
发现只有一个元素1
这里就类似于构造sql注入一样 构造让[]
去闭合再加上注释加换行%0a
相互换来换去 总有一种方式可以
原来形式猜测是[1]
替换后[1,$value]
则我们构造];//%0a<shell>;//%0a[
flask?jwt?(hard)
这道就是第一道的加强版 key没有给我们 所以只能去找
发现提示 有个路由/wor
发现它可以获取我们上次的登陆时间
当时这里就没有思路了
看了WP 访问/wor
让其报错 然后能看到源码中的key
key:hardgam3_C0u1d_u_f1ndM3????
这样获取key的方式还是第一次见 涨知识了
接着就是老套路 session伪造获取flag即可
这里session伪造的时候把后面关于时间的数据去掉,或者加上引号,不然会报错
TimeTrcer
放过自己