CTF 实验吧——天下武功唯快不破(node)
程序员文章站
2022-05-15 09:54:23
...
题目
看看响应头
格式:CTF{ }
提示
看看响应头,则在浏览器中查看RESPONSE Header
在RESPONSE中,有一段注释,发送POST请求,请求体为以key为键
毫无疑问,肯定是响应头的FLAG值
观察响应头的FLAG值,很明显是经过BASE64加密了,通过BASE64解码可以看到
解码之后隐约可以看到POST_THIS_TO_CHANGE_FLAG,那么将其值,构造成请求体post请求服务器
在这里发生了改变,大致意思是需要利用代码来夺旗,手工解码再发送给服务器太慢了
很多教程是python,但是我用node来实现脚本
思路
首先引入axios
来实现http请求,得到headers
中的flag,并将其解码之后以键值对的形式再发送至服务器,最后得到服务器会返回的旗
说明
-
axios
默认编码格式是application/json
,但是这个题目要求的是以键值对的形式发送,那么需要修改编码为application/x-www-form-urlencoded
,其中application/x-www-form-urlencoded
:窗体数据被编码为名称/值对。这是标准的编码格式。application/json
:数据是json
格式 - node中
axios
要使用application/x-www-form-urlencoded
编码方式编码,需要引入querystring
模块
代码
const axios = require('axios')
const querystring = require('querystring')
async function getFlag() {
let res = await axios.get('http://ctf5.shiyanbar.com/web/10/10.php')
const flag = new Buffer.from(res.headers.flag, 'base64')
.toString()
.split(':')[1]
res = await axios({
url: 'http://ctf5.shiyanbar.com/web/10/10.php',
method: 'post',
data: querystring.stringify({ key: flag }),
headers: {
'Content-type': 'application/x-www-form-urlencoded'
}
})
console.log(res.data)
}
getFlag()
结果
遇到的坑
关于Content-type
为application/x-www-form-urlencoded
,是通过wireshark
抓包分析HTTP流量得到的,当为application/json
服务器得到的是JSON格式的参数,不能正常解析,因为当为application/json
根本无法得到旗子
所以采用application/x-www-form-urlencoded
编码方式,抓到的包如下
就在这里花掉大部分时间花在解决这个问题上,代码很简单,但是却一直得不到旗子,最后抓包冷静分析之后,判断出编码问题