题目环境

练习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类的练习相关推荐

  1. 封装好的C++ md5类

    博客转载自:http://blog.csdn.net/lindexi_gd/article/details/47005093 在网上看到很多md5类,不过封好的很少,我就在网上看到一篇把他写的封装 头 ...

  2. java md5类_java的md5加密类

    MD5算法是将数据进行不可逆加密的算法有较好的安全性,在国内如寿信的安全支付平台就采用此算法. 源代码如下 /********************************************* ...

  3. C++ MD5类源文件

    发表时间:2007-8-7 13:22:00 /**************************************************************************** ...

  4. php代码审计ctf隐藏了目录,CTF中PHP代码审计小tips-7

    阅读次数 MiniProject_PHP_Code_audit-7 Writeup 整体逻辑: xctf中的一道题目 考点: 接收参数中不能出现某一字符,file_get_contents()使用可以 ...

  5. 一天一道ctf 第25天(md5强碰撞)

    注意到URL中的img链接不寻常,对TXpVek5UTTFNbVUzTURabE5qYz0base64解码两次,Hex解码一次,得到555.png 那我们对index也同样Hex编码一次,base64 ...

  6. CTF .git php代码审计 [Buy a lottery!]

    Buy a lottery! 一个猜七色球游戏,玩一次20,对2个球赢5,3个球赢20,4个球赢300,7个球直接有了买flag的钱,这概率基本不可能,只要能中,明天就去买彩票... 先以为可能存在逻 ...

  7. java产生字符函数_java生成字符串md5函数类(javaSE)

    //实现生成MD5值 import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.B ...

  8. C# 使用MD5加密工具类(MD5CryptoServiceProvider)

    提示:开放环境在Windows,使用Winform. 文章目录 前言 一.MD5是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 因为有安全隐患,所以都会考虑加密密码或者其它的信息,所以今 ...

  9. java md5 decode_Java MD5加密类

    1 /*************************************************2 md5 类实现了RSA Data Security, Inc.在提交给IETF3 的RFC1 ...

最新文章

  1. mac下快速搭建php开发环境,鸟枪换大炮,Mac下快速搭建PHP开发环境mamp的使用
  2. 笔记-计算机网络基础-计算机网络分类
  3. Linux如何在系统启动时自动加载模块
  4. Kubernetes三周年,这仅仅是伟大征途的开始
  5. runtime—新手必学
  6. linux iso作为安装源,linux下使用iso文件做为yum安装源
  7. php如何写代码禁用广告,不再显示广告案例(php操作cookie)
  8. python计算密集型提速_揭秘Numpy“高效使用哲学”,数值计算再提速10倍!
  9. 插件开发之360 DroidPlugin源码分析(二)Hook机制
  10. Spring学习篇01-Spring容器相关基本概念
  11. 云计算平台能够提供计算服务器,云计算平台提供了什么服务器
  12. JavaScript 习题及面试题 3
  13. 神经网络主要有哪些特点,神经网络模型的优缺点
  14. 08cms中error_08cms_licens 故障
  15. 合并两个有序链表(Java)
  16. PS怎么调整字体的行间距
  17. I met my soulmate. She didn't.
  18. java快速开发平台fastunit专访
  19. git-bash 的安装配置及其基本使用
  20. 利用Python使基金定投收益最大

热门文章

  1. 从视频中提取音频Python
  2. XML和注解(Annotation)
  3. python中文字符截取乱码
  4. 管道、管程、管态的区别
  5. 机器学习:非负矩阵分解(NMF)
  6. 【转】Vmware 8.0注册码 序列号 key 注册方法
  7. Android中获取GPS搜索到的卫星颗数、并获取每颗卫星的信噪比
  8. 小程序(一)后端项目搭建
  9. C#零基础运动控制教程--运动控制卡低速高速运动实验
  10. Linux基本工具(上)