代码审计MD5

MD5漏洞基于

总体就是值不相同,但是MD5的值要相等


<?php
error_reporting(0);//error_reporting() 函数规定你给应该报告何种 PHP 错误。
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {//预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
//:1. username和password的值不能相同
//
//2. username和password的MD5值相同
// 从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制实例。

if ($_GET['username'] == $_GET['password'])//两值不相同
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))//MD5的值要相同
die('Flag: ' . $flag);
else
print 'Invalid password';
}
//http://123.206.87.240:9009/18.php?username&password
// 5AA765D61D8327DE
//5f4dcc3b5aa765d61d8327deb882cf99
//5F4DCC3B5AA765D61D8327DEB882CF99
//5aa765d61d8

// 824EC59323936251
// 14c4b06b824ec593239362517f538b29
//14C4B06B824EC593239362517F538B29
// 824ec59323936251
//view-source:http://123.206.87.240:9009/18.php?username[]=1&password[]=2
//且不相等必须
//php中=号是代表一个运算式子,默认返回值undefined,转换过后就是1,即true,而第二个式子才是判断符号,而a的确不等于2,所以返回值false,不执行
//PHP中&&与&的区别:
//1、运算符性质的区别
//&&在PHP中是一个逻辑操作符,也叫条件操作符。
//&是逻辑语言,逻辑上表示两者属于缺一不可的关系,还可以表示一个人和另外一个人之意,与and同义。如A&B,表示A与B,A和B,A×B。
//2、作用上的区别
//&&就是判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假,具有短路性质。
//&是将两个二进制的数逐位相与,结果是相与之后的结果。



//POST GET ,是提交表单的两种方式,GET传值就用$_GET获取,POST提交表单就用$_POST
//post与get的区别是一个在地址栏显示参数,另一个不显示
//
//举个例子,如果你登录的时候用get方式,那么你的值就会在地址栏上显示,这样就无安全性可言
//而你在搜索或者有页码的时候 用post把参数在地址栏上隐藏起来,这样就毫无意义
//
//而用$_GET可以获得浏览器地址栏上的参数的值(?问号后面的一串字符),比如www.baidu.com/s?wd=123,那么你用$_GET,就可以获取参数(你可以理解为事件,动作,或者参数,该值在传递表单时与input的name一致)为wd的值123,多个参数用&符连接,比如?an=0&si=5理解为an参数的值为0与si参数的值为5。
//
//所以你的代码$_GET[out]可以这样理解,用$_GET得的值为login 去获得浏览器地址栏out这个参数的值,因为他的地址是?out=login,所以获
//题目地址http://123.206.87.240:9009/18.php



//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哪来的这么多奇葩问题,强类型的安全性自然而然,一切都是确定的,弱类型带来了太多的可能性。脚本写起来虽然方便,却最好只在本地使用而不要放在易受攻击的地方。
//
//摘自https://www.cnblogs.com/weiyinfu/p/6821812.html
posted @ 2019-12-19 19:27  adsry  阅读(439)  评论(0)    收藏  举报