欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CTF 实验吧——天下武功唯快不破(node)

程序员文章站 2022-05-15 09:54:23
...

题目

看看响应头

格式:CTF{ }

解题链接

提示

看看响应头,则在浏览器中查看RESPONSE Header

CTF 实验吧——天下武功唯快不破(node)

CTF 实验吧——天下武功唯快不破(node)

在RESPONSE中,有一段注释,发送POST请求,请求体为以key为键

毫无疑问,肯定是响应头的FLAG值

观察响应头的FLAG值,很明显是经过BASE64加密了,通过BASE64解码可以看到

CTF 实验吧——天下武功唯快不破(node)

解码之后隐约可以看到POST_THIS_TO_CHANGE_FLAG,那么将其值,构造成请求体post请求服务器

CTF 实验吧——天下武功唯快不破(node)

在这里发生了改变,大致意思是需要利用代码来夺旗,手工解码再发送给服务器太慢了

很多教程是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()

结果

CTF 实验吧——天下武功唯快不破(node)

遇到的坑

关于Content-typeapplication/x-www-form-urlencoded,是通过wireshark抓包分析HTTP流量得到的,当为application/json服务器得到的是JSON格式的参数,不能正常解析,因为当为application/json根本无法得到旗子

CTF 实验吧——天下武功唯快不破(node)

所以采用application/x-www-form-urlencoded编码方式,抓到的包如下

CTF 实验吧——天下武功唯快不破(node)

就在这里花掉大部分时间花在解决这个问题上,代码很简单,但是却一直得不到旗子,最后抓包冷静分析之后,判断出编码问题

相关标签: 实验吧