前言

最近一直在看DDCTF,有两道题看得脑壳疼,一题打遍各处都不知道该打哪里了,一题似乎要找POP链,难度太高了,只剩一天多了,看主办方放不放hint吧,我就先整点其他的东西,且当划水休憩了2333。

在之前的volgactf上第一次看到Nodejs的session伪造,觉得跟flask有点相似又有点不同,鉴于没有接触过,而且最近看到有文章了进行了研究,毕竟是个没有多少了解的知识点,所以就学习一哈,再整理总结一下。


环境搭建

按照node就不提了,整一个文件夹,注意不要有中文,然后进入:

npm init
npm install crc
npm install express
npm install express-session
npm install session-file-store

然后在文件夹根目录新建两个脚本,文件夹构造如下:

  • node_modules
  • sessions
  • exp.js
  • index.js
  • package.json
  • package-lock.json

源码分析、测试脚本和伪造脚本见参考文章,我这里就不提了,我只简略讲一下基本的原理和利用方式。

express/session-file-store的session机制

跟PHP的session机制类似,后端会在cookie中设置这么一个字符串:

connect.sid=s%3A_2siNd07lCEGNvn6yxOlhSFa9C8i8p68.T71VavO4yRXNmPQqcOtnU8mq4T68A1S6MLxsGwXWPTA

其中分为两部分,前一半_2siNd07lCEGNvn6yxOlhSFa9C8i8p68拼接上session文件后缀.json即为session文件的文件名(类比PHP的session_id),后一半则是为了防止篡改的session签名(这么看起来比PHP安全一点),session的数据以json的形式存放在文件中:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"views":3,"__lastAccess":1555414820955}

所以我们想要伪造session就需要两个条件:

  • 文件读取和文件写入

其中文件读取用于获取session和secret key,文件写入用于伪造session。因为对session文件名不加过滤的原因,所以我们可以目录穿越来将任意一个json文件作为我们的session文件。

session伪造

开启index.js,我们可以在根目录新建一个Twings.json,然后修改它的views数据为2333,访问web拿到cookie:

connect.sid=s%3AZRWxkZ_YnFJVxnu2VLsmExw8dB-5VQpI.n7g20vCqJXgp8oynXxWpmtDx1hwWLCX0mChALVLuZpg

在伪造脚本中填入../Twings和secret key,运行得到伪造的cookie:

connect.sid=s%3A..%2FTwings.39KjN3NBcdgX8ypFt44YToAa1PQ6JlrcO1ugfHwWPyA

修改cookie,即可看到session伪造成功:

<p>views: 2334</p>

作者水平有限,如有错误请指出Orz

参考文章:

https://xz.aliyun.com/t/4676

https://kappactf.ru/volgactf-gallery-en/