[CTF] 关于php代码审计的MD5类的练习
题目环境
练习1
PHP代码:
<?phperror_reporting(0);highlight_file("pass-01.php");if(isset($_GET["pass"])){if($_GET["pass"] != hash("md4", $_GET["pass"])){die('fail~~~');}else{echo "success!!!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-02.php'>下一关</a>";}}else{echo "please input the pass";}
?> please input the pass
函数解析:
isset() // 检测变量是否已声明且值不为NULL
代码审计:
pass传入的值和经过md4加密的值相等得到flag
解题:
MD4碰撞得:0e251288019∴ pass=0e251288019
练习2
PHP代码:
<?phperror_reporting(0);highlight_file("pass-02.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = $_GET['user'];$pass = $_GET['pass'];if($user != $pass && md5($user) == md5($pass)){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-03.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
代码审计:
通过get方式获得的user和pass值不相等且两者经过MD5加密后的值相等
解题:
传入数组,默认MD5(数组)返回NULL用数组绕过得:
http://……/?user[]=1&pass[]=2
练习3
PHP代码:
<?phperror_reporting(0);highlight_file("pass-03.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = $_GET['user'];$pass = $_GET['pass'];if(!ctype_alpha($user) && !is_numeric($pass) && md5($user) == md5($pass)){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-04.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
函数解析:
ctype_alpha() // 用于检测所给参数是不是字母
is_numeric() // 用于检测变量是否为数字或字符串
代码审计:
函数前加“ !”表示返回false
user不是字母且pass不是数字和数字字符串
且二者MD5加密后值相等同样用数组绕过得
http://……/?user[]=0&pass[]=a
练习4
PHP代码:
<?phperror_reporting(0);highlight_file("pass-04.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = $_GET['user'];$pass = $_GET['pass'];if($user != $pass && md5($user) == md5(md5($pass))){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-05.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
代码审计:
该题使用了MD5二次加密,条件没有太多的限制,主要要解决的是
md5($user) == md5(md5($pass))
化简得:
$user == md5($pass)
可以写一串php代码:
<?phpecho md5(1);echo "<br>";echo md5(md5(1));
?>
结果是:
c4ca4238a0b923820dcc509a6f75849b
28c8edde3d61a0411511d3b1866f0636
最后答案为:
http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
注意:观察下面两个地址
http://192.168.1.1/pass-04/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
http://192.168.1.1/pass-04/?user=c4ca4238a0b923820dcc509a6f75849b &pass=1
这两个地址传入的user值是不一样的,第二个地址在“&pass=1”前多了个空格,这会导致user会多传一个空格进去,就和md5(md5(1))的的值不一样了
练习5
PHP代码:
<?phperror_reporting(0);highlight_file("pass-05.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = $_GET['user'];$pass = $_GET['pass'];if($user != $pass && md5($user) === md5(md5($pass))){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-06.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
代码审计:
主要难点是:
md5($user) === md5(md5($pass))
与第4题相似,来看一下几个等于号的区别
===比较两个变量的值和类型
==比较两个变量的值,不比较数据类型
最后答案为:
http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
练习6
PHP代码:
<?phperror_reporting(0);highlight_file("pass-06.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = (string)$_GET['user'];$pass = (string)$_GET['pass'];if($user != $pass && md5($user) == md5(md5($pass))){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-07.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
不做过多解释
最后答案为:
http://……/?user=c4ca4238a0b923820dcc509a6f75849b&pass=1
练习7
PHP代码:
<?phperror_reporting(0);highlight_file("pass-07.php");if(isset($_GET['user']) && isset($_GET['pass'])){$user = $_GET['user'];$pass = $_GET['pass'];if($user !== $pass && md5($user) === md5($pass)){echo "success!<br>";echo file_get_contents('flag.txt')."\n";echo "<a href='pass-08.php'>下一关</a>";}else{echo "fail~~~";}}else{echo "please input the user and pass!"."\n";}
?> please input the user and pass!
不做过多解释直接数组绕过
最后答案为:
http://……/?user[]=0&pass[]=1
练习8
PHP代码:
<?phperror_reporting(0);highlight_file("pass-08.php");class auth{public $user;public $pass;public function __destruct(){$this->user = (string)$this->user;if(strlen($this->user) > 3 || strlen($this->pass) >3){echo "level1 is fail~~~";}if($this->user !== $this->pass && $this->user != $this->pass && md5($this->user) === md5($this->pass)){echo "success!<br>"; echo file_get_contents("flag.txt");}else{echo "level2 is fail~~~";}}}unserialize($_POST['auth']);
?>
函数解析:
__destruct() // 析构函数的作用和构造函数正好相反,析构函数只有在对象被垃圾收集器收集前(即对象从内存中删除之前)才会被自动调用。析构函数允许我们在销毁一个对象之前执行一些特定的操作,例如关闭文件、释放结果集等。
strlen() // 返回字符串长度
unserialize() // 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构
解题:
因为最后进行是POST输入后进行反序列化,所以我们要构造一个与本题代码相似的进行序列化
<?phpclass auth{public $user;public $pass;}$a = new auth();$a->user = NAN;$a->pass = NAN;echo serialize($a);?>
输出结果为:
O:4:"auth":2:{s:4:"user";d:NAN;s:4:"pass";d:NAN;}
POST提交方式提交最后答案为:
auth=O:4:"auth":2:{s:4:"user";d:NAN;s:4:"pass";d:NAN;}
知识点:
1、关于NAN和INF
NAN 代表非合法数值
INF 代表无穷大
2、NAN
NAN === (string)NAN // 为假
[CTF] 关于php代码审计的MD5类的练习相关推荐
- 封装好的C++ md5类
博客转载自:http://blog.csdn.net/lindexi_gd/article/details/47005093 在网上看到很多md5类,不过封好的很少,我就在网上看到一篇把他写的封装 头 ...
- java md5类_java的md5加密类
MD5算法是将数据进行不可逆加密的算法有较好的安全性,在国内如寿信的安全支付平台就采用此算法. 源代码如下 /********************************************* ...
- C++ MD5类源文件
发表时间:2007-8-7 13:22:00 /**************************************************************************** ...
- php代码审计ctf隐藏了目录,CTF中PHP代码审计小tips-7
阅读次数 MiniProject_PHP_Code_audit-7 Writeup 整体逻辑: xctf中的一道题目 考点: 接收参数中不能出现某一字符,file_get_contents()使用可以 ...
- 一天一道ctf 第25天(md5强碰撞)
注意到URL中的img链接不寻常,对TXpVek5UTTFNbVUzTURabE5qYz0base64解码两次,Hex解码一次,得到555.png 那我们对index也同样Hex编码一次,base64 ...
- CTF .git php代码审计 [Buy a lottery!]
Buy a lottery! 一个猜七色球游戏,玩一次20,对2个球赢5,3个球赢20,4个球赢300,7个球直接有了买flag的钱,这概率基本不可能,只要能中,明天就去买彩票... 先以为可能存在逻 ...
- java产生字符函数_java生成字符串md5函数类(javaSE)
//实现生成MD5值 import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.B ...
- C# 使用MD5加密工具类(MD5CryptoServiceProvider)
提示:开放环境在Windows,使用Winform. 文章目录 前言 一.MD5是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 因为有安全隐患,所以都会考虑加密密码或者其它的信息,所以今 ...
- java md5 decode_Java MD5加密类
1 /*************************************************2 md5 类实现了RSA Data Security, Inc.在提交给IETF3 的RFC1 ...
最新文章
- mac下快速搭建php开发环境,鸟枪换大炮,Mac下快速搭建PHP开发环境mamp的使用
- 笔记-计算机网络基础-计算机网络分类
- Linux如何在系统启动时自动加载模块
- Kubernetes三周年,这仅仅是伟大征途的开始
- runtime—新手必学
- linux iso作为安装源,linux下使用iso文件做为yum安装源
- php如何写代码禁用广告,不再显示广告案例(php操作cookie)
- python计算密集型提速_揭秘Numpy“高效使用哲学”,数值计算再提速10倍!
- 插件开发之360 DroidPlugin源码分析(二)Hook机制
- Spring学习篇01-Spring容器相关基本概念
- 云计算平台能够提供计算服务器,云计算平台提供了什么服务器
- JavaScript 习题及面试题 3
- 神经网络主要有哪些特点,神经网络模型的优缺点
- 08cms中error_08cms_licens 故障
- 合并两个有序链表(Java)
- PS怎么调整字体的行间距
- I met my soulmate. She didn't.
- java快速开发平台fastunit专访
- git-bash 的安装配置及其基本使用
- 利用Python使基金定投收益最大