CTF:PHP MD5绕过和序列化漏洞

作者:高玉涵

博客:blog.csdn.net/cg_i

时间:2021.6.25 9:51

题目复现Docker环境:

https://github.com/glzjin/buusec_2019_code_review_1

生命因为有限所以宝贵;因为有限,所以才要不懈努力。

——名侦探柯南

源码

第一关:MD5绕过漏洞

CTF就是一个“套娃”游戏。首先我们把注意力集中到if(md5($_POST[‘md51’]) == md5($_POST[‘md52’]))…这行语句,也就是逻辑&&运算符前半部分,它获取用户提交的值,分别存放在名为md51和md52,经MD5函数加密后做相等比较。而语句&&运算符后半部分$_POST[‘md51’] != $_POST[‘md52’]要求提交的值不相同(不能简单提交两个同样的值,从而产生两个相同的MD5值)当同时满足这两个条件整行语句为真,进入到unserialize($_POST[‘obj’]);这部份(获取flag的关键,让我们暂时忽略它)如何突破这前后互斥无解的语句。

如果你看过我写的《PHP MD5函数0E绕过漏洞》一文,就不难看出这里存在MD5绕过漏洞,我们只需要找到这样两个值,它们生成以0e 开头且后面全部为数字的MD5值。有没有两个这样的值呢?不仅有且还有很多!这里只给出解题需要的两个值:

md51:QNKCDZO
        MD5:0e830400451993494058024219903391

md52: 240610708
        MD5: 0e462097431906509019562988736854

这两个值经MD5加密后,在“==”运算符结果都是0,在“!=”运算付结果都为真。整行语句为真,成功突破!

第二关:反序列化漏洞

我们终于来到本关。但你不要高兴的太早,骄傲是只拦路虎,常挡在成功的道路中间。离拿到flag还远着呢!开始解题之前,让我们回顾代码起始定义的BUU类。类里定义了名为_destruct()函数,观察得知if($this->correct === $this->input)…为真时可拿到flag(注意这里用到的是全等运算符)。

PHP的魔法函数(析构函数)

PHP中有一些函数可以在脚本的任何地方执行,且不需要声明就可以调用,但是存在触发条件__destruct()就属于这类魔法函数,当对象被销毁时自动触发。

由于序列化不会传递函数中定义的操作,只传值,但是魔法函数是可以自动执行的,当类中定义了魔法函数时,且对象中存在触发条件,我们就有机可乘。而这个触发条件就是unserialize($_POST[‘obj’]);这行语句。我们通过构造“序列化字符串”随后在对像销毁时触发__destruct()函数。

那这个字符串应该是什么样子的呢?

$this->correct = base64_encode(uniqid());怎样才能让$input和它一模一样呢?uniqid()是不是也存在类式绕过的漏洞?我劝你善良并确定的告诉你没有。其实“===”已经出卖了它,世上根本不存在有一模一样的人(不知道克隆人会不会是个例外),有的话那一定是一个“引用”。

通关:Python代码

import requestsif __name__ == '__main__':'''BUU CODE REVIEW 1MD5绕过和序列化漏洞buusec_2019_code_review_1-masterhttps://github.com/glzjin/buusec_2019_code_review_1'''payload = {'pleasepost': '2','md52': 'QNKCDZO','md51': '240610708','obj': 'O:3:"BUU":2:{s:7:"correct";s:0:"";s:5:"input";R:2;}'}r = requests.post("http://11605b67-a0a7-4c22-9478-501ff712c10a.node3.buuoj.cn/?pleaseget=1", data=payload)print(r.text)

成功拿到flag。

CTF:PHP MD5绕过和序列化漏洞相关推荐

  1. 总结ctf中 MD5 绕过的一些思路

    总结ctf中 MD5 绕过的一些思路 1. 常规的0e绕过 2. 数组绕过 3. 强类型绕过 4. \$a==md5($a) 5. md5 与SQL注入 \$a !== $b && m ...

  2. ctf中MD5绕过详细总结及例题[BJDCTF2020]Easy MD5

    一.首先是MD5()函数的作用? MD5()函数的作用是计算字符串的MD5散列. 返回值:如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE. 二.PHP == 弱类型比较绕过? 代码: ...

  3. 【CTF bugku 备份是个好习惯】关于.bak备份文件,md5绕过

    知识点 常用的备份文件后缀有 .bak, .swp bak是备份文件的扩展名,现在很多软件都会创建备份文件,bak文件是各类软件产生的备份文件.打开bak文件的方法有简单,只需要知道它的生成软件,然后 ...

  4. php mysql 绕过_PHP中md5绕过

    一.md5($password,true)的SQL注入问题 这里要提到一下MySQL中的数值比较问题. 1.当数字和字符串比较时,若字符串的数字部分(需要从头开始)和数字是相同的,那么则返回的是tru ...

  5. [转载] python格式化字符串漏洞_从两道CTF实例看python格式化字符串漏洞

    参考链接: Python str.format()中的漏洞 >>> name = 'Hu3sky' >>> s = Template('My name is $na ...

  6. Apache Shiro 1.6.0 发布!修复绕过授权高危漏洞

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 冷冷zz 来源 | https://www.o ...

  7. 【CTF题】使用文件包含漏洞读取网页代码

    [CTF题]使用文件包含漏洞读取网页代码 按照我的理解文件包含漏洞是指网页后端php(或其他)代码中使用了include等文件包含语句,而且所包含的文件由变量控制,恰恰此变量又能通过GET或POST等 ...

  8. CTF——Web——MD5漏洞

    md5($ss,ture/false)漏洞: ture :为16位,false:为32位 第一种 $_GET['a'] != $_GET['b'] && MD5($_GET['a']) ...

  9. MD5加密漏洞(MD5绕过方式-0e绕过/数组绕过/MD5碰撞/MD5SQL注入)

    MD5是一种散列函数,是哈希算法的一种,可以将任意长度的输入,通过散列算法变换成128位的散列值 MD5加密有4种绕过方式 0e绕过 数组绕过 MD5碰撞 MD5SQL注入 0e绕过 0e开头的字符串 ...

最新文章

  1. REPAIR修复mysql报错is marked as crashed and should be
  2. 成功解决NameError: name ‘norm‘ is not defined
  3. matlab图像去毛刺_信号去毛刺,去零漂
  4. JBoss的简单配置
  5. React开发(244):dva概念8router
  6. Apollo自动驾驶入门课程第②讲 — 高精地图
  7. scrapy使用代理报错keyerror: proxy_爬虫Scrapy框架-Crawlspider链接提取器与规则解析器...
  8. YY一下IT业的未来
  9. 三个关键词,看懂AI未来趋势丨不仅仅是高薪
  10. QTreeWidget使用
  11. 计算机的ie丢失,告诉你win7内的IE给卸载了怎么找回
  12. Python 菜单中的分割线
  13. CocosCreator Shader学习(三):放大镜缩小镜效果
  14. python爬虫:抓取道指成分股数据
  15. 食品饮料行业商业供应链智能系统解决方案:智慧供应链平台助力企业搭乘数字化快车乘风破浪
  16. 关于HTML中a标签的重大安全性漏洞!!!
  17. 使用切换器导致一台电脑分辨率被降低的解决方法
  18. 计算机用户被禁用,administrator账户被停用怎么办【图文教程】
  19. PyCharm 中 import 导包呈现灰色,已解决
  20. 从Android模拟器sdcard中导出文件

热门文章

  1. SSM 框架的学习(一):系统架构介绍
  2. 【计算机系统】缓冲区溢出攻击实验
  3. vscode+django 搭建自己的个人网站(一) ——环境搭建与配置
  4. 致4个月后自己的一封信
  5. FileSaver.js的简单使用
  6. Android VelocityTracker使用总结
  7. html input placeholder,HTML Input Text placeholder用法及代码示例
  8. jquery validate 校验
  9. C语言编程中关于头文件使用问题
  10. 分享 8k-16k-单通道-16bit WAV音频 样本数据