青岑CTF Web 入门 EZMD5系列 详解(write up)

青岑CTF Web 入门 EZMD5系列 详解(write up)

EZMD5

代码审计

include "flag.php";
highlight_file(__FILE__);

包含了flag.php文件并展示源代码

if (isset($_GET['QC'])) {
$qc = (string)$_GET['QC'];
$hp = md5($qc);

要求get传参QC并且设置了一个变量保存这个QC的字符串格式

其后有设置一个变量$hp为其的md5值


if ($hp == $admin_hash) {
echo "<br>Welcome, admin!<br>";
echo $flag;
} else {
echo "<br>Login failed.";
}

最后对比$admin_hash$hp这两个函数且是松散比较(==)

相等则返回flag的值

这里观察到最开始的变量像是一个科学计数法的表示。而且当使用 ==比较两个字符串时,如果它们看起来像科学计数法表示的数字,PHP 会尝试将它们转换为数字进行比较
  • '0e830400451993494058024219903391'会被当作科学计数法:0 × 10^830400451993494058024219903391,其计算结果为 0。
  • 同理,如果 md5($qc)的结果也是一个以 0e开头、后面全是数字的字符串,它也会被转换为数字 0。

所以只需要找到一个MD5值也为0e开头且后面是数字的字符串

有以下几个:QNKCDZO   240610708   aabg7XSs  s878926199a

最终payload:?QC=QNKCDZO

拓展

若这里是强比较(===)的话,那就不可以了

强比较规则:

  • 值是否相等
  • 类型是否相同
  • 对于字符串,会逐字符精确比较

此时就只能进行md5碰撞攻击,也就是知道了md5值求原来的那个字符串,基本上就只能写脚本了(可以让ai帮你写)

php中的逻辑运算符及其优先级,短路求值

逻辑与 (AND)

  • 运算符&&and
  • 说明:当两个操作数都为 true​ 时,结果才为 true。

逻辑或 (OR)

  • 运算符||or
  • 说明:当至少一个操作数为 true​ 时,结果就为 true。

逻辑非 (NOT)

  • 运算符!
  • 说明:对布尔值取反。

逻辑异或 (XOR)

  • 运算符xor
  • 说明:当两个操作数一真一假时,结果才为 true(两者相同则 false)。

优先级与短路求值

  • 优先级(从高到低)!> &&> ||> and> xor> or
  • 短路求值
    • 对于 &&:如果第一个操作数为 false,则不会计算第二个操作数(因为结果已确定)。
    • 对于 ||:如果第一个操作数为 true,则不会计算第二个操作数。

php中的位运算符

位与 &(Bitwise AND)

  • 作用:对两个数字的每一个二进制位进行 AND 操作。
  • 规则:两位都为1时,结果位才为1。

位或 |(Bitwise OR)

  • 作用:对两个数字的每一个二进制位进行 OR 操作。
  • 规则:两位中至少一个为1时,结果位就为1。

特殊场景:在布尔值上使用 &|

当操作数是布尔值(或可转换为布尔的值)时,&|先将它们转换为整数true-> 1, false-> 0),进行位运算,再将结果转换回布尔值。这有时会导致与 &&||不同的结果。

EZMD5_1

代码审计

if (isset($_GET['a']) && isset($_GET['b'])) {
$a = $_GET['a'];
$b = $_GET['b'];

判断是否get传入了a和b并定义变量保存

if ($a != $b && md5($a) == md5($b)) {
echo "<br>Welcome, admin!<br>";
echo $flag;

这里要求$a不能等于$b,但是它俩的ma5值弱相等(==)

这里很容易想到数组绕过,任何数组的md5值都为Null

这里具体的比较可以去看我的“青岑EZPHP”的博客,总结了几乎所有的情况(这个在第一题的讲解里面)

payload

?a[]=1&b[]=2    

这里的数组定义是url上的定义方法,这方面内容也在我那个博客里提及(这个在第二题)

EZMD5_2

代码审计

其他的代码沿用前几个题的,就不多解释了

if (substr($md5_a, 0, 2) === '0e' || substr($md5_b, 0, 2) === '0e') {
echo "<br>0e not allowed!";

这是比上一个题多的要求,意思是不能俩变量的值都不能以“0e”开头

但是对数组绕过没有影响

payload

?a[]=1&b[]=2

拓展

URL上数组的定义方法

1. 基本语法:方括号 []

这是最常用的方法,在参数名后添加 []来告诉 PHP 这是一个数组。

// URL: page.php?colors[]=red&colors[]=green&colors[]=blue // PHP 中获取: $colors = $_GET['colors']; // 数组: ['red', 'green', 'blue'] // 或者明确指定索引(数字): // URL: page.php?colors[0]=red&colors[1]=green&colors[2]=blue
2. 关联数组(指定键名)

可以在方括号内指定字符串键名来创建关联数组。

// URL: page.php?user[name]=John&user[age]=25&user[city]=Beijing // PHP 中获取: $user = $_GET['user']; // 数组: ['name' => 'John', 'age' => '25', 'city' => 'Beijing'] // 多维数组: // URL: page.php?product[0][name]=Phone&product[0][price]=999&product[1][name]=Case $product = $_GET['product']; // 二维数组: [0 => ['name'=>'Phone','price'=>'999'], 1 => ['name'=>'Case']]
3.URL 编码注意事项

当键名或值包含特殊字符时,需要 URL 编码

// 原始:page.php?filters[sort by]=date&filters[price range]=100-200 // 实际 URL 需要编码: // page.php?filters[sort%20by]=date&filters[price%20range]=100-200 // PHP 会自动解码: $filters = $_GET['filters']; // ['sort by' => 'date', 'price range' => '100-200']

以下是必须编码的字符

EZMD5_3

依旧类似前面的,不过==变成了===

还是不影响数组绕过(第一种方法)

数组绕过yyDs

第二种方法:需要找两个不同的字符串但MD5值却相等的

EZMD5_4

代码审计

if (isset($_GET['QC'])) {

$qc = (string)$_GET['QC'];

if(substr(md5($qc),-6,6) ==='d54e23'

核心要求是截取$qc的值从-6位置,截取6位,必须是d54e23

只能暴力破解了,让ai写代码,最后求出payload

EZMD5_5

这道题与前面的异曲同工,只是由MD5变成了sha1

继续数组绕过即可

payload      ?a[]=&b[]=2

EZMD5_6

依旧与前面的题一样,依旧数组绕过

payload      ?a[]=&b[]=2

Read more

Android WebRTC SDK 入门指南:从零搭建实时音视频通信应用

快速体验 在开始今天关于 Android WebRTC SDK 入门指南:从零搭建实时音视频通信应用 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 Android WebRTC SDK 入门指南:从零搭建实时音视频通信应用 实时音视频通信已经成为现代移动应用的核心功能之一,从视频会议到在线教育,再到社交互动,都离不开这项技术。

从前端到DevOps_各类开发者AI工作流工具

从前端到 DevOps:一篇看懂各类开发者最该配备的 AI 工作流工具 三个月实践总结:从怀疑到依赖,AI 工具如何改变了我的开发方式 写在前面 三个月前,我在周末通宵赶项目的时候突然意识到一个问题:我写了十年代码,却仍然在用最原始的方式工作——手动写样式、反复调试 API、在各种文档之间来回切换。那天凌晨三点,我盯着屏幕上重复的代码,想着肯定有更好的办法。 这个念头让我开始系统性地研究 AI 辅助开发工具。作为一个从 jQuery 时代走过来的前端开发者,我起初对 AI 编程助手是抱有怀疑的——它们真的能理解我的代码逻辑吗?会不会只是生成一堆看似正确但实际不可用的代码? 但三个月的实践让我彻底改变了看法。现在我的日常工作流已经离不开这些工具,开发效率提升了至少 40%,更重要的是,我终于可以把精力集中在真正重要的架构设计和业务逻辑上,而不是陷入重复性劳动。 这篇文章不是工具清单的简单罗列。我会以一个前端开发者的视角,分享我在实际工作中使用各类 AI 工具的经验,包括踩过的坑、总结的技巧,以及针对不同技术栈开发者的推荐。无论你是前端、后端、DevOps

手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享

0x1 前言 哈咯,师傅们!最近在学习js逆向相关的知识点,跟着网上的师傅的课程已经很多相关文章探索学习,今天想着写一篇js逆向断点调试&js逆向前端加密对抗相关的文章出来,给师傅们分享下,有不正确的地方,希望大佬勿喷。 这篇文章主要是给没有学习过js逆向的师傅学习的,分享一些js逆向基础知识,js实战断点调试技巧以及后面分享js逆向靶场搭建以及js逆向前端加密对抗,拿微信小程序常用的AES、RSA和明文Sign 签名校验绕过几个方面给师傅们分享下操作技巧。 最后面给师傅们分享一个前段时间搞的一个企业src的商城优惠卷并发漏洞,也是拿到了一千块的赏金,漏洞都很详细的给师傅们分享了这个案例,师傅们看完我上面的js断点调试和js前端加解密靶场打法等,可以去尝试玩下,要是有地方写的有问题,大佬勿喷! 0x2 如何找到加密算法 这里我直接拿Google浏览器控制面板来给师傅们演示下这个流程,主要是通过F12调试控制js前端代码 其中里面的作用域,调用堆栈,XHR断点这三个功能需要了解认识下 一、作用域(Scope) 作用域是指变量、函数和对象在代码中可访问

前端直连大模型:实战指南与最佳实践

前端直连大模型:实战指南与最佳实践

引言:前端开发者的AI新纪元 随着ChatGPT等大模型的爆发式增长,AI能力正以前所未有的速度渗透到Web应用的每个角落。作为前端开发者,我们不再只是数据展示的"搬运工",而是可以直接与AI对话、构建智能应用的"魔术师"。本文将带你深入探索前端调用大模型的完整技术栈,从基础原理到高级实践,助你在AI时代抢占技术先机。 一、前端调用大模型的四种核心方式 1. 直接API调用 - 最直接的交互方式 // 使用Fetch API直接调用OpenAI const callOpenAI = async (prompt) => { const response = await fetch('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { 'Content-Type&