攻防世界--easyphp

news/2024/5/20 0:14:41 标签: ctf, php, 代码审计

浅学一下吧~

发开题目是这样的

最烦的就是代码审计,还是看得少 多审计两篇代码就好了(还是因为自己会的不多)

php"> <?php
highlight_file(__FILE__);//将当前文件的源代码进行高亮显示
$key1 = 0;//将变量$key1的值初始化为0
$key2 = 0;//将变量$key2的值初始化为0

$a = $_GET['a'];//通过GET的方法传递的参数变量a和b的值赋给变量$a和$b
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){//判断变量$a的值是否存在且满足条件,$a的整数值大于6000000,且$a的长度小于等于3
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){//判断变量$b的值是否存在且满足条件,将$b进行MD5加密取后6位,并且与字符串'8b184b'进行比较
        $key1 = 1;
        }else{
            die("Emmm...再想想");//如果上面两个条件都满足,将变量$key赋值为1,否则输出“Emmmm..再想想” 并终止程序
        }
    }else{
    die("Emmm...");//如果有一个条件不满足,则输出Emmmm...
}

$c=(array)json_decode(@$_GET['c']);//将通过GET方法传递的参数c进行json解码,并将结果转化为数组
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){//判断变量$c是否为数组且满足条件,$c["m"]不是数值且$c["m"]大于2022
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){//判断$c["n"]是否为数组且满足条件,$c["n"]是一个包含两个元素的数组且$c["n"][0]是一个数组
        $d = array_search("DGGJ", $c["n"]);//在数组$c["n"]中搜索DGGJ(在遍历过程中)
        $d === false?die("no..."):NULL;//如果找不到则输出no..... 并终止程序(在遍历过程中)
        foreach($c["n"] as $key=>$val){//遍历数组$c["n"]的每个元素
            $val==="DGGJ"?die("no......"):NULL;//到这里如果还没有发现DGGJ,就将$key2的值设为1
        }
        $key2 = 1;
    }else{
        die("no hack");//如果遍历上边那两个条件都未满足,则输出no
    }
}else{
    die("no");//如果一个条件满足,另一个条件不满足则输出no
}

if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";//如果$key1 和 $key2  的值都为1,则包含一个名为Hgfks.php的文件并且输出 You re right  输出flag
    echo $flag;
}

?> 

开始做题

php">if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3)

既然他说赋的值必须大于6000000且长度小于等于3

  我们可以看到当1e7的时候 数值就已经比6000000大了,所以1e7以上的柿子都可以 ,当然 长度必须是三位  1e7-1e9 都可以

当我们传参之后,页面也已经给了回显,说我们的传参是正确的

php"><?php
highlight_file(__FILE__);
for($b=1;$b<=100000;$b++){
    if(preg_match('/8b184b/',substr(md5($b),-6,6))){
        echo $b;
        echo "\n";
        echo md5($b);
        echo "\n";
    }
}              

?>

查找小于100000的数并且后6位与8b184b相同的数字,然后我们发现是53724,验证一下

然后拿着去传参

通过了上面两个条件但是下面的条件还没完成呢 所以输出no 证明到这里我们做的是对的

接着往下走然后就是过滤下面一条规则

传入一个参数c (这个参数已经被json解码)

他的条件是 不是数组 且大于2022

于是我们构造传参c=["m":"6666a"]

因为我们要逐级过滤 所以要先判断m,在判判断n

不是数组  我们就用数字加字符在一起绕过  数字只要比2022大就行  字符随便

发现返回 no hack  判定有效 接着往下走

php">if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0]))

n的要求是:判断$c["n"]是否为数组且满足条件,$c["n"]是一个包含两个元素的数组且$c["n"][0]是一个数组

$c["n"]是一个包含两个元素的数组

"n":[[111],0]

c={"m":"6666a","n":[[111],0]}

然后拿着构造好的paylode去传参

然后flag就出来啦!

里面用到的函数

isset($a)  检查变量$a是否被设置
intval($a) 将变量$a转换成整数类型
strlen($a)  来计算$a的字符串长度
substr(md5($b),-6,6) 将$b进行md5加密,从倒数第6位开始取6位(后6位)
(array) 创建一个名为array的数组
json_decode(@$_GET['c'])  将get传入的参数c进行json解码并传入到数组中
!is_numeric判断是否为数值
count($c["n"])  计算$c["n"]中的数组的元素的个数
is_array($c["n"][0])判断$c["n"][0]是否是一个数组
array_search  在数组中搜索某个健值,并返回他的健名
 

经验还是欠缺,看来还得多练习练习!!!


http://www.niftyadmin.cn/n/5269565.html

相关文章

什么是PHP中的PDO事务处理?

在PHP中&#xff0c;PDO&#xff08;PHP Data Objects&#xff09;事务处理是一种数据库操作技术&#xff0c;用于管理数据库连接的事务。事务是一组数据库操作&#xff0c;要么全部成功执行&#xff0c;要么全部失败&#xff0c;保持数据库的一致性和完整性。PDO提供了一种方式…

web前端之若依二次开发经验、使用IDEA启动若依项目、sysConfigController报错提示的解决办法、环境搭建

MENU 前言查看工具版本指令前端创建路由的细节 后端启动后端项目细节 前言 1、官网地址 2、在线文档 3、演示地址 4、代码下载 5、代码下载(前后端分离) 6、野生版的若依开发文档 此文章包括前端和后端&#xff0c;记录开发中遇到的一些问题。 查看工具版本指令 指令用途node …

数据分析为何要学统计学(2)——如何估计总体概率分布

明确总体的概率分布类型及参数是进行数据分析的基础&#xff0c;这项工作称为分布推断与参数估计。在总体分布及其参数不明确的情况下&#xff0c;我们可以利用手头掌握的样本来完成这项工作。具体过程由以下步骤组成。 第一步&#xff0c;样本统计特性直观估计 我们采用Seab…

springCloud项目打包如何把jar放到指定目录下

springCloud项目打包如何把jar发放到指定目录下 maven-antrun-plugin springCloud微服务打包jar&#xff0c;模块过多&#xff1b;我的项目模块结构如下&#xff1a; 我把实体类相关的单独抽离一个模块在service-api下服务单独写在service某块下&#xff0c; 每个模块的jar都…

LeetCode(69)对称二叉树【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 对称二叉树 1.题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,nu…

wordpress打包小程序并能分享转发

使用web-view镶嵌wordpress网站打包小程序并进行分享 第一步&#xff1a; 下载小程序代码修改为自己的要打包的网址&#xff0c;app.json里面的名称改为自己网址的名称 第二步&#xff1a;在页面加入以下代码 是为了给前端小程序传参。学习资料小程序源代码&#xff1a; <sc…

Kubernetes 的用法和解析 -- 2

一.集群常用指令 1.1 基础控制指令 # 查看对应资源: 状态 $ kubectl get <SOURCE_NAME> -n <NAMESPACE> -o wide [rootkube-master ~]# kubectl get pods -n kuboard -o wide# 查看对应资源: 事件信息 $ kubectl describe <SOURCE_NAME> <SOURCE_NAME_R…

C# 从代码入门 Mysql 数据库事务

在业务开发中&#xff0c;使用数据库事务是必不可少的。而开发中往往会使用各种 ORM 执行数据库操作&#xff0c;简化代码复杂度&#xff0c;不过&#xff0c;由于各种 ORM 的封装特性&#xff0c;开发者的使用方式也不一样&#xff0c;开发者想要了解 ORM 对事务做了什么处理是…