PHP相关问题练习

server/2025/1/12 12:20:23/

题目:

 <?php
highlight_file(__FILE__);
error_reporting(0);
$val1 = @$_GET['val1'];
$val2 = @$_GET['val2'];
$val3 = @$_GET['val3'];
$val4 = @$_GET['val4'];
$val5 = (string)@$_POST['val5'];
$val6 = (string)@$_POST['val6'];
$val7 = (string)@$_POST['val7'];
if( $val1 == $val2 ){die('val1 OR val2 no no no');
}
if( md5($val1) != md5($val2) ){die('step 1 fail');
}
if( $val3 == $val4 ){die('val3 OR val4 no no no');
}
if ( md5($val3) !== md5($val4)){die('step 2 fail');
}
if( $val5 == $val6 || $val5 == $val7 || $val6 == $val7 ){die('val5 OR val6 OR val7 no no no');
}
if (md5($val5) !== md5($val6) || md5($val6) !== md5($val7) || md5($val5) !== md5($val7)){die('step 3 fail');
}if(!($_POST['a']) and !($_POST['b']))
{echo "come on!";die();
}
$a = $_POST['a'];
$b = $_POST['b'];
$m = $_GET['m'];
$n = $_GET['n'];if (!(ctype_alnum($a)) || (strlen($a) > 5)  || !(ctype_alnum($b)) || (strlen($b) > 6))
{echo "a OR b fail!";die();
}if ((strlen($m) > 1) || (strlen($n) > 1))
{echo "m OR n fail";die();
}$val8 = md5($a);
$val9 = strtr(md5($b), $m, $n);echo PHP_EOL;
echo "<p>val8 : $val8</p>";
echo PHP_EOL;
echo "<p>val9 : $val9</p>";
echo PHP_EOL;
if (($val8 == $val9) && !($a === $b) && (strlen($b) === 5))
{echo "nice,good job,give you flag:";echo file_get_contents('/var/www/html/flag.php');
} step 3 fail

题目类型:WEB

题目名称:easy-hash

目的和要求:

        1.了解hash碰撞

        2.了解three way md5 collision

        3.了解绕过md5校验

解题步骤:

        1.打开浏览器,访问目标主机,查看源码

        2.审计代码,判断需要的绕过

        3.前四个md5效验直接使用赋值数组就可以绕过

        4.后面是一个三向md5判断,使用https://natmchugh.blogspot.com/2014/11/three-way-md5-collision.html里面的方法,三张图片的md5相等

代码解释:

 <?php
highlight_file(__FILE__);
error_reporting(0);
$val1 = @$_GET['val1'];   //通过GET接收参数
$val2 = @$_GET['val2'];
$val3 = @$_GET['val3'];
$val4 = @$_GET['val4'];
$val5 = (string)@$_POST['val5'];  //通过POST接收参数
$val6 = (string)@$_POST['val6'];
$val7 = (string)@$_POST['val7'];
if( $val1 == $val2 ){  //弱比较判断die('val1 OR val2 no no no');
}
if( md5($val1) != md5($val2) ){  //判断是否相等,若判断die('step 1 fail');
}
if( $val3 == $val4 ){  //若比较判断die('val3 OR val4 no no no');
}
if ( md5($val3) !== md5($val4)){  //弱比较判断die('step 2 fail');
}
if( $val5 == $val6 || $val5 == $val7 || $val6 == $val7 ){  //三项md5判断,die('val5 OR val6 OR val7 no no no');
}
if (md5($val5) !== md5($val6) || md5($val6) !== md5($val7) || md5($val5) !== md5($val7)){die('step 3 fail');
}if(!($_POST['a']) and !($_POST['b']))  //判断a和b的值是否为空
{echo "come on!";die();
}
$a = $_POST['a'];
$b = $_POST['b'];
$m = $_GET['m'];
$n = $_GET['n'];if (!(ctype_alnum($a)) || (strlen($a) > 5)  || !(ctype_alnum($b)) || (strlen($b) > 6))  //ctype_alnum判断变量是否都是数字和字符,这里判断是否都不是数字和字符。大于5也会进入if条件
{echo "a OR b fail!";die();
}if ((strlen($m) > 1) || (strlen($n) > 1))  //m和n的长度需要大于1就会进入if,所以可以等于1或者更小
{echo "m OR n fail";die();
}$val8 = md5($a);  //对$a进行md5加密
$val9 = strtr(md5($b), $m, $n);  //对变量b进行md5加密,然后strtr对加密后$m的值对应的加密后$b中的内容,会被替换为$necho PHP_EOL;
echo "<p>val8 : $val8</p>";
echo PHP_EOL;
echo "<p>val9 : $val9</p>";
echo PHP_EOL;
if (($val8 == $val9) && !($a === $b) && (strlen($b) === 5))  //这条件是若比较val8和val9前两位都是0e,且a===b是true,a不等与b,所以有一个!,然后b的长度限制为了5 
{echo "nice,good job,give you flag:";echo file_get_contents('/var/www/html/flag.php');
} step 3 fail

1.绕过第一个http://xxx/?val1[]=1&val2[]=2&val3[]=3&val4[]=5&m=b&n=0 //使$b加密后的b替换为0

2.绕过第二个要用三个图片中的二进制字节

3.使用md5碰撞出加密后两个值相等的md5加密前的5个字符,其中$b在md5加密后使用strtr函数进行了替换,b被替换为了0,所以$b在碰撞的时候只需要第二个字符为e就可以了,脚本如下

$a的碰撞脚本
import hashlib
import re
import string
list=string.digits+string.ascii_letters
for a in list:for b in list:for c in list:for d in list:for e in list:str1=a+b+c+d+evalue=hashlib.md5(str(str1).encode()).hexdigest()result=re.search(r"^[0][e][0-9]+$",value)if result:print(str1+'-----',result)
结果如下:
byGcY------ <re.Match object; span=(0, 32), match='0e591948146966052067035298880982'>$b的碰撞脚本
import hashlib
import re
import string
list=string.digits+string.ascii_letters
for a in list:for b in list:for c in list:for d in list:for e in list:str1=a+b+c+d+evalue=hashlib.md5(str(str1).encode()).hexdigest()result=re.search(r"^\w[e][0-9]+$",value)if result:print(str1+'------',result)
结果如下:
1RKnJ------ <re.Match object; span=(0, 32), match='be629474301316105422602603643091'>

最终的payload为:

import request
import re
url='http://xxxx/?val1[]=1&val2[]=2&val3[]=3&val4[]=4&m=b&n=0'
#因为是val5-7是POST传参,所以要顶一个data存放要传入的数据,然后用post方法传入
with open('./upload/three_md5_1.jpg','rb') as f:val5=f.read()  //val5就是读取所有的图片中二进制的内容
with open('./upload/three_md5_2.jpg','rb') as f:val6=f.read()
with open('.upload/three_md5_3.jpg','rb') as f:val6=f.read()
data={'val5':val5,  #这里的val5是对应了with中的val5'val6':val6,'val7':val7,'a':'byGcY','b':'1RKnJ'
}
result=request.post(url=url,data=data)
flag=re.search(r'(flag{.*})',r.text)  #点是除了空字符以外所有,*是多次匹配,多个,这里用了一个捕获组
if flag:print(flag.group(1)) //括号里面是一个捕获组,这里可以不用不用捕获组会获取完整的字符串


http://www.ppmy.cn/server/157259.html

相关文章

ue5玩家角色添加武器。切换武器位置,手上武器放到背上。演示一下人体插槽和武器的连接。仅仅演示,实际项目不是这么用的

把第一人称资源包导进来 这就是我们枪的骨骼网格体 我们找到这个骨骼 右手添加插槽 取个名字 因为武器上也有动画&#xff0c;所有武器单独写个蓝图类 新建一个蓝图类 BP_Weapon 把枪的蓝图拖到人的静态网格体下&#xff0c;成为一个部分 选中BP_Weapon的父类套接字…

鸿蒙开发(29)弹性布局 (Flex)

概述 弹性布局&#xff08;Flex&#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴方…

【HTML+CSS+JS+VUE】web前端教程-4-标签之段落、换行、水平线

标签之段落 段落是通过<p>标签定义的换行 如果您希望在不生产一个新段落的情况下进行换行(新行),请使用<br><br />元素是一个空的HTML元素 <p>这个

【Excel笔记_2】单元格跳转求累加

需求&#xff1a; 计算当前空格等于某一列1-12的和&#xff0c;下一个空格是13-24的和&#xff0c;每次间隔12 如果起始位置是 A1&#xff0c;并且希望每次计算 12 行的和&#xff0c;每个单元格依次计算不同的 12 行的和&#xff0c;可以使用以下公式&#xff1a; 在 B1 单元…

2025年伊始:回顾 ChatGPT 引发的 AI 变革以及未来展望

&#x1f4e2;&#x1f4e2;&#x1f4e2; 大家好&#xff0c;我是云楼Yunlord&#xff0c;CSDN博客之星人工智能领域前三名&#xff0c;多年人工智能学习工作经验&#xff0c;一位兴趣稀奇古怪的【人工智能领域博主】&#xff01;&#xff01;&#xff01;&#x1f61c;&#…

地市级医院人工智能应用路线图2025:机遇、挑战与战略路径(基本版附四阶段流程)

一、引言 1.1 研究背景与意义 地市级医院作为我国医疗体系的关键组成部分,承担着为广大民众提供基础与专科医疗服务的重任。伴随人口老龄化加剧、慢性病患病率上升以及民众健康需求持续增长,地市级医院面临着前所未有的医疗服务压力。据相关数据显示,近十年我国地市级医院的…

概率论常用的分布公式

01 常见离散型分布及其概率分布、期望和方差公式 伯努利分布 概率分布&#xff1a;期望&#xff1a; E(X)p方差&#xff1a;D(X)p(1−p) 二项分布 概率分布&#xff1a;期望&#xff1a;E(X)np方差&#xff1a; D(X)np(1−p) 表示方法&#xff1a;X∼B(n,p) 泊松分布 概率分布…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…