一、WEB
1.easyphp
打开连接,发现一段php代码,考察代码审计能力
做这种题得一步一步来,先大概浏览一遍,发现需要通过get传入a,b,c的值,使key1和key2的值均变为1,然后就会打印flag
从第一块开始
第一行if要求(函数用法可以参考链接)
1. a非空 PHP isset() 函数 | 菜鸟教程
2. a的整数值大于6000000 PHP intval() 函数 | 菜鸟教程
3. a的字符长度不能超过3 PHP strlen() 函数 | 菜鸟教程
在看intval函数时发现intval(1e10)的值为10000000000,但是要求字符长度不能超过3,所以在这里尝试1e9
当将a=1e9传参后发现页面底部发生了变化,也就是说a的值可以为1e9
第二行if要求
1. b非空
2. b的md5值的最后6个字符串为8b184b PHP substr() 函数 | 菜鸟教程
这里可以写一个脚本爆破一下
<?php
while(true){
$str = bin2hex(random_bytes(5));
$hash = md5($str);
if(substr($hash,-6) === '8b184b'){
echo $str;
echo '/';
echo $hash;
echo '/';
}
}
?>
运行得到一组值ae4b0747b3---a133827fb9e1e16341a32056d98b184b
将b=ae4b0747b3传参,页面发生变化,下一步就是c的值了
第二块:
首先第一行将传入的参数进行 JSON 解码且要求是数组
第一个if要求
1. c为数组 PHP is_array() 函数 | 菜鸟教程
2. c的m键值为非数字 PHP is_numeric() 函数 | 菜鸟教程
3. c的m键值要大于2022
通过了解is_numeric() 函数发现 123a不算数字,返回为false,在加上逻辑非,返回为true
在进行比较时123a会被转换成123与2022进行比较
那这里尝试传参 c={“m”:"2023a"},页面再次发生变化
第二个if要求:
1. c为数组
2. c的n键值中元素的数目等于2 PHP count() 函数 | 菜鸟教程
3. 并且第一个元素是一个数组类型
后面这段参考文章攻防世界web新手区easyphp题解writeup_$c != 1024"+"intval($c) == 1024-CSDN博客
所以此处传参c={"n":[[0,1],0]},得到flag
payload: 61.147.171.105:56650/?a=1e9&b=ae4b0747b3&c={"m":"2023a","n":[[0,1],0]}
cyberpeace{e574b575bf273066ce7529b0334de337}