easyphp

news2024/11/25 2:53:11

说起来是easy但是,代码审计对于我来说有点小难

唯一觉得好的地方是因为基本上每一步都有回显,可以依照回显一步步注入

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;

$a = $_GET['a'];
$b = $_GET['b'];

if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
    if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
        $key1 = 1;
        }else{
            die("Emmm...再想想");
        }
    }else{
    die("Emmm...");
}

$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
        $d = array_search("DGGJ", $c["n"]);
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;
        }
        $key2 = 1;
    }else{
        die("no hack");
    }
}else{
    die("no");
}

if($key1 && $key2){
    include "Hgfks.php";
    echo "You're right"."\n";
    echo $flag;
}

?>

代码审计1

先忽略变量c,先把a和b执行完

  • 这段代码是一个简单的PHP脚本。它有两个输入参数$a和$b,这些参数应该通过GET请求从URL中获取。

  • 代码检查$a是否被设置,并且它的整数值大于6000000,并且它的长度不超过3个字符。

  • 如果条件满足,代码将检查$b是否被设置,并且其MD5哈希的后6个字符是'8b184b'。如果条件满足,$key1将被赋值为1。

  • 如果任何条件不满足,代码将使用die()函数输出相应的错误消息并终止脚本的执行。

解题步骤1

这里我们采取科学计数法1e3绕过intval和strlen函数

然后使用一段python脚本计算出变量b的MD5值

import hashlib
#导入hashlib模块
for i in range(100000):
    if hashlib.md5(str(i).encode('utf-8')).hexdigest()[-6:] == '8b184b':
#利用模块的MD5方法对字符串i进行编码,注意哈希之前必须要规定字符串编码类型,最后转化为16进制输出
#输出结果取取倒数的6位字符,进行对比
        print(i)
        print(hashlib.md5(str(i).encode('utf-8')).hexdigest())

观察回显数据,说明变量a,b注入成功

代码审计2

继续看变量c的部分

  • 首先,将GET请求中的参数c解码为一个数组,并将其赋值给变量$c。此处使用了@符号,表示对可能出现的错误进行忽略。

  • 然后,代码进行了一系列的条件判断和操作:

  • 首先将c变量进行json解码,并转换为一个array数组

  • 判断$c是否是一个数组,并且$c["m"]不是一个数字,并且$c["m"]大于2022。

  • 如果满足以上条件,则继续判断$c["n"]是否是一个数组,且长度为2,并且$c["n"][0]也是一个数组。

  • 如果满足以上条件,则使用array_search函数在$c["n"]数组中搜索值为"DGGJ"的元素,并将结果赋值给变量$d。如果找到了匹配的值,则继续执行;如果没有找到,输出"no..."并终止程序。

  • 接下来,使用foreach循环遍历$c["n"]数组中的每个元素,如果某个元素的值等于"DGGJ",则输出"no......"并终止程序。否则,将变量$key2赋值为1。

  • 如果$key1和$key2都存在且为真,则输出flag

解题步骤2

根据代码审计,我们得知变量c需要传入的是一个json型的数据,并会自动转换为一个数组

is_numeric函数

is_numeric函数用来检测是否为纯数字或数字字符串

利用php字符串与数字相比较的性质:

我们得知一个字符串在没遇到字符前都是可以跟数字进行比较的,所以我可以在传入的数的最后添加任意字符就可以绕过字符比较

在php8之后好像就不允许这样了绕过is_numeric函数

当看到回显不是no就说明绕过成功

根据第二个if语句,在数组n中创建一个包含数组

接着将数组n中的第二个参数设置为DGGJ

根据回显为no......,说明绕过成功

接下来就有点麻烦了,因为接着运用了一个foreach循环将数组n的键和值分别传入key和val两个变量,如果在其中检测到DGGJ字符串就回显no......退出循环

去查了一下,array_scarch函数是查找第一次出现的位置,如果找到了就返回键值,本来想着将数组和字符串DGGJ的位置换一个变成

"n":["DGGJ",[1,2,3]]

是前面还有对变量c第一个元素为数组的检测

还想着将DGGJ字符串放到第一个数组里去,变成

"n":[["DGGJ",2,3],2]

但是检测无法进入到数组中,连第一个搜索字符串都过不了

然后想到了编码绕过,将传入的数据进行url编码试试

还是不行,最后查看了wp,得知忽略了一个及小的东西:

array_search函数

就是array_search函数的执行逻辑其实就是对数组中的数据进行比较,如果满足相等就返回下标索引

php8之前字符串与数字进行比较的性质:

字符串和数字一起比较,会将字符串先转化为数字0再进行比较

所以,我们可以直接将DGGJ字符串替换为0就可以注入成功

虽然做的有点慢,但是是自己慢慢做出来的,没有直接查看wp,印象更加深刻

在做题时,我们可以将代码截取出来,利用本地环境传入数据,然后查看代码回显并对错误代码进行调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

apple pencil一代的平替有哪些品牌?苹果平板的触控笔

随着苹果Pencil系列的推出&#xff0c;平替电容笔在国内市场得到了较好的发展&#xff0c;随之的销量&#xff0c;也开始暴涨&#xff0c;苹果pencil因为价格太高&#xff0c;导致很多人买不起。目前市场上&#xff0c;有不少的平替电容笔&#xff0c;可以替代苹果的Pencil&…

总结925

目标规划&#xff1a; 月目标&#xff1a;7月&#xff08;高等数学强化18讲&#xff0c;英语真题4套&#xff0c;数据结构&#xff09; 周目标&#xff1a;高等数学强化前5讲回顾&#xff0c;英语06年真题一套&#xff0c;数据结构第3章习题 每日规划 今日已做 1.早读&#…

普通人怎么实现财务自由?

有道无术&#xff0c;术尚可求也&#xff1b;有术无道&#xff0c;止于术。你好&#xff0c;我是程序员雪球&#xff0c;今天一起来聊聊普通人怎么实现财务自由&#xff1f; 作为普通人&#xff0c;怎么实现财务自由&#xff1f;其实只需要做好三件事&#xff1a;减少日常花销&…

一篇文章让你搞懂字符函数+字符串函数

List item 前言 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中 字符串常量适用于那些对它不做修改的字符串函数 1.求字符串长度 1.1strlen 其返回值是一个size_t的无符号给整型 …

基于vue的MOBA类游戏攻略分享平台

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而java技术&#xff0c;B/S架构则保证了较高的平台适应性。本文主要介绍了本系统的开发背景&#xff0c;所要完成的功能和开发的过程&#xff0c;主要说明了系统设计的重点、设计思想。

RK3588国产开发板Debian系统安装虚拟键盘

当我们在使用 debian 系统的时候&#xff0c;如果想要进行输入&#xff0c;无可避免地要外接键盘。当我们的 输入量不大的时候可以进行虚拟键盘的安装。具体步骤如下&#xff1a; 首先使用以下命令&#xff0c;对 onboard 虚拟键盘进行安装&#xff0c;如下图所示&#xff1a…

Python(四):Pycharm的安装配置

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

微软MFC技术中的消息队列及消息处理(下)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊微软MFC技术中的消息队列及消息处理。 MFC应用程序中由Windows 系统以消息的形式发送给应用程序的窗口。窗口接收和处理消息之后&#xff0c;把控制返回给Windows。Windows系统在同一时间可显示多…

道路与航线(SPFA+双端队列优化)

题意&#xff1a;给了若干条道路&#xff0c;道路是双向边&#xff0c;航线是单向边&#xff0c;给了一些政策&#xff0c;如果从a到b有一条航线&#xff0c;那么一定不能通过一些道路和一些航线&#xff0c;从b到a。 分析&#xff1a;因为有负边权存在&#xff0c;所以这道题…

Sentinel系统规则

Sentinel 系统规则 ​ Sentinel 系统自适应限流从整体维度对应用入口流量进行控制&#xff0c;结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标&#xff0c;通过自适应的流控策略&#xff0c;让系统的入口流量和系统的负载达到一个平衡…

8266使用巴法云OTA

为了使用方便把OTA封装一下为以下类 #include "ESP8266HTTPUpdate.h"class OTA { private:ESP8266HTTPUpdate httpUpdate;// using HTTPUpdateStartCB std::function<void()>;void OnStartCB(){Serial.println("开始OTA升级");}// using HTTPUpdat…

[模板总结] - 拓扑排序

模板题目链接 Leetcode 210 Course Schedule II Leetcode 2115 Find all possible Reciptes from given supplies 拓扑排序是在有向无环图中以图中节点依赖关系对节点进行排序。例如求解前置课程&#xff0c;求解程序中调用包的依赖关系等等。 拓扑排序思路 拓扑排序思路…

mysql,对表的简单操作

一.创建表并插入数据 mysql> create table worker(-> department_id int(11) not null comment 部门号,-> worker_id int(11) primary key not null comment 职工号,-> worker_date date not null comment 工作时间,-> wages float(8,2) not null comment 工资…

Shell第一章——Shell编程规范与变量

什么是shell&#xff1f; shell是把人的语言转换成计算机的二进制语言交给计算机的内核处理 shell在中间作为解释器&#xff0c;翻译的功能 linux系统的shell种类&#xff1a;bash&#xff0c;tcsh&#xff0c;csh bash&#xff1a;linux默认的shell tcsh&#xff1a;整合…

初识Spring - 什么是IoC容器?

目录 一、Spring是什么&#xff1f; Spring就是包含了很多工具方法的 IoC 容器。 1. 什么是IoC&#xff0c;什么是容器 2. IoC的优点 (解决耦合问题) 二、什么是Spring IoC 1. Spring IoC详解 &#xff08;1&#xff09;也就是学习 Spring 最核心的功能&#xff1a; &…

uniapp 在app中获取经纬度

在uniapp中app端&#xff0c;uni.getLocation获取经纬度会有大概1-2公里的偏差&#xff0c;在实际项目中&#xff0c;有的需求对经纬度的准确度要求比较严格&#xff0c;研究了很多种方式&#xff0c;最终发现使用高德地图api的微信小程序的插件获取的准确性是最准的&#xff0…

ELK之logstash四大组件

ELK之logstash四大组件 一、grok(正则捕获插件) 1.内置正则调用 //内置正则表达式调用 %{SYNTAX:SEMANTIC}●SYNTAX代表匹配值的类型&#xff0c;例如&#xff0c;0.11可以NUMBER类型所匹配&#xff0c;10.222.22.25可以使用IP匹配。●SEMANTIC表示存储该值的一个变量声明&a…

第十章 如何才能写出好的代码

1、编程的本质 2、好的程序关键是 有效地分离 logic Controller 和 Data 3、代码优化 优化&#xff1a; 逻辑代码 控制流程&#xff1a; 4、编写代码的四个步骤 5、react中哪些设计模式比较常用

算法与数据结构(二)--【1】表的概念及其四种实现方式

一.表是什么 【1】定义&#xff1a;表&#xff0c;又称为线性表。线性表L是n个相同类型数据元素a(1),a(2),...,a(n)组成的有限序列。 【2】相关概念&#xff1a; 表长&#xff1a;线性表中元素的个数&#xff0c;n0时为空表。 【3】基本运算&#xff08;共七种&#xff09;&…

Linux Vim提示:E325: ATTENTION 解决方案

提示&#xff1a; 这是由于我们异常退出vim界面 程序异常关闭导致的 解决&#xff1a; 在这种情况下&#xff0c;您可以根据以下选项来解决问题&#xff1a; [O]pen Read-Only&#xff1a;以只读模式打开文件。这意味着您不能编辑文件&#xff0c;但可以查看其内容。选择此选…