PHP中MD5函数漏洞
题目描述
一个网页,不妨设URL为http://haha.com,打开之后是这样的
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b']) {
if (md5($_GET['a']) === md5($_GET['b'])) {
echo ('Flag: '.$flag);
}else {
echo 'Wrong.';
}
}
}
根据这段代码,可以看出;
- 使用GET方式提交参数,可以直接在URL里面改,不用写POST请求
- GET里面必须包含a,b两个参数
- a!=b,这里的不等是严格的value上的不等,而不是
!==引用上的不等 - a和b的md5必须相等
- 这段代码是无论如何都要返回的,如果答案错误,先返回wrong,再返回这段代码。
如果提交http://haha.com?a=3&b=2,返回wrong
如果提交http://haha.com?a=3&b=3,跟没带参数一样,因为没有进入到那层判断中去
问,怎么提交才能得到flag
预备知识
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的payload有
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
同时MD5不能处理数组,若有以下判断则可用数组绕过
if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2
题解
URL可以传递数组参数,形式是http://haha.com?x[]=1&x[]=2&x[]=3,这样就提交了一个x[]={1,2,3}的数组。
在PHP中,MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])=md5(b[])=null,这样就得到答案了。
http://butian.secbox.cn/flag.php?a[]=1&b[]=2
返回结果
Flag: flag{1bc29b36f623ba82aaf6724fd3b16718}
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b']) {
if (md5($_GET['a']) === md5($_GET['b'])) {
echo ('Flag: '.$flag);
}else {
echo 'Wrong.';
}
}
}
我说
一开始我还以为要找到两个md5相同的字符串,百度一番不曾找到。只找到一个fastcoll.exe文件碰撞器,内容都是二进制的,不是字符串。
直接搜索PHP、MD5,就发现原来这题跟密码学半毛钱关系没有,只是简简单单的PHP语言漏洞。
于是余有叹焉,PHP是地球上最垃圾的语言,一方面养活着一大群抱残守缺的程序员,另一方面也养活着一批PHP安全方面的专家。程序员这不是自娱自乐吗?用Java哪来的这么多奇葩问题,强类型的安全性自然而然,一切都是确定的,弱类型带来了太多的可能性。脚本写起来虽然方便,却最好只在本地使用而不要放在易受攻击的地方。
参考资料
PHP中MD5函数漏洞的更多相关文章
- php代码审计 strcmp和MD5函数漏洞
通过get得到三个值,v1,v2,v3. if第一层判断,v1和v2得到的值不一样,但是对它们进行md5加密后的值得相等. if第二层判断,v3得到的值得和$flag的值相等,满足这两个条件输出fla ...
- PHP中md5()函数绕过
PHP md5()函数的简单绕过方法,该篇作为学习笔记简单记录一下. 例题 例题链接: http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php ...
- java中MD5函数
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5U ...
- php漏洞 md5函数漏洞
0x01: 背景:php在处理哈希值时,用!=和==来比较的时候,如果哈希字符串以0E开头的时候,哈希值会默认为0,所以两个不同的字符串经过md5加密成哈希值,如果哈希值开头是0E的话,会默认成相等. ...
- PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数
XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function ...
- javascript中使用md5函数
javascript中使用md5函数 这对于js来讲本来是没有的,现在可以自己定义一个md5的函数,达到加密效果. var hexcase = 0; function hex_md5(a) { if ...
- PHP 函数漏洞总结
1.MD5 compare漏洞 PHP在处理哈希字符串时,会利用"!="或"=="来对哈希值进行比较,它把每一个以"0E"开头的哈希值都解释 ...
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
NET MVC全局异常处理(一) 目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...
- Web安全测试中常见逻辑漏洞解析(实战篇)
Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...
随机推荐
- IDoc 基础知识
Application Link Enabling ALE主要为了分布式业务系统而设计的.它可以使业务流程中的每个步骤分布在不同的SAP系统上,系统间可以通过IDoc交互数据.IDoc可以认为是个信封 ...
- win10 uwp 如何拖动一个TextBlock的文字到另一个TextBlock
我在堆栈网看到有人问 如何拖动一个TextBlock的文字到另一个TextBlock 于是看到一个大神给出的方法,下面我就来和大家说下如何拖动 一开始我们需要一个界面,就放两个TextBlock 一个 ...
- Git 工作流的正确打开方式
前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候.这才注意到git 工作流并不是那么简单.比如,之前遇到的清理历史.百度到的资料很多,重复性也很多,但实践性操作很少,我很难 ...
- setjmp和longjmp用法
本文转自:http://blog.csdn.net/wuhong40/article/details/6155838,感谢原文作者. 前不久在阅读Quake3源代码的时候,看到一个陌生的函数:setj ...
- Oracle12C如何启动PDB数据库
在启动PDB类型的数据库之前需要用管理员账号[即:sys 或者system管理员账户登录进去CDB数据库,以下命令是在PLSQL登录进去CDB数据库的dos命令行执行的] alter pluggab ...
- LINUX 笔记-cal 命令
显示当前月份日历 命令:cal 显示指定月份的日历 命令:cal 9 2012 显示2016年日历 命令:cal 2016
- maven搭建MVC项目具体步骤
一.目标 在这篇文章中,我将要向您展示如何使用spring Frameworks 和 Maven build创建您的第一个J2ee 应用程序. 二.信息 Maven是一个Java项目的构建工具(或者自 ...
- swift 之设计模式 适配器
大学的时候,有一个<近世代数>的教授,他上课从来不看课本,并且也不按课本来讲解课程,但是他讲的东西比书本深刻形象(幽默,口才杠杠的),有层次感,除了授业,他还经常给我讲一些为人处世,做学问 ...
- C语言程序内存布局
C语言程序内存布局 如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/44457453 作者:super_bert@csdn 一 ...
- hdu 1011 Starship Troopers(树形DP入门)
Starship Troopers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...