[CTF笔记]从变量覆盖到include文件包含漏洞

/ 0评 / 0

0x01 前言

记个笔记,是在最近打CTF新人赛的时候遇到的。其实标题感觉取得有点水了,因为用到的知识蛮多的,标题说得太笼统啦。

0x02 md5碰撞

只给出了提示和代码,那就先看代码,get提交一个id参数,parse_str($id)对传入id的数据进行处理,再判断$a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')的结果是否为真,为真应该就会返回flag吧(逃

再对字符串'QNKCDZO'进行md5()后得到结果0e830400451993494058024219903391,由于结果是0e开头且后面全是数字,再结合题目给出的提示“md5碰撞”,那么利用php的feature就可以知道:需要一个md5后也是0e开头后面全是数字的字符串。如s878926199a或240610708等等

0x03 解题方法

构造payload:?id=a[0]=240610708,这样可以使a[0]的值覆盖为240610708,然后经过md5后得到0e462097431906509019562988736854与md5('QNKCDZO')的结果0e830400451993494058024219903391比较,结果都是0,所以满足条件返回True。

得到一个链接,点击后进入下一个页面

0x04 文件包含与php://filter读取本地文件

先审计代码,get传入file参数的值,substr()函数截取传入的字符串,并判断是否以“php://”开头,满足条件就include($a),提示已经很明显了,要得到flag就必须使用php://协议,而且提示flag就在ffffffffflag.php中,那就只能利用php://filter读取flag文件的内容了,于是构造payload:http://xx.xx.xx.xx/require.php?file=php://filter/read=convert.base64-encode/resource=ffffffffflag.php

得到base64编码的php源码,再base64解码即可得到flag:

0x05 总结

include()等文件包含函数是很危险的函数,尤其是当allow_url_include = "ON"时。

php://伪协议不仅能实现读取本地文件,还可以完成很多其他任务。

php处理hash比较时会把以0e开头的hash值都视为0,会造成严重错误。

0x06 Read More

CTF中文件包含漏洞总结

CTF中常见的一些PHP漏洞总结

代码审计|变量覆盖漏洞

发表回复

您的电子邮箱地址不会被公开。