当前位置: 首页 > news >正文

CTFshow web93-104关

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关

93关

看代码 进行分析

他的主函数


include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(intval($num,0)==4476){
        echo $flag;
    }else{
        echo intval($num,0);
    }

 解析:

输入一个变量 num 进行get传参 如果num=4476 返回错误 

传入num 用函数preg_match进行匹配,如果匹配到则返回错误

再根据intval函数的取整的特性,传入payload:?num=4476.1/?num=010574(加0是因为intval 函数检测时字符串以 "0" 开始,使用 8 进制)

知识点:

php中使用两个等号“==” 比较,只比较值,不比较类型(两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。所以他比较的就只是值 ,不比较类型。)

intval 函数用于获取变量的整数值,intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

实例:

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

94关

 只比93关多了一个  !strpos($num, "0")

知识点:

strpos() 函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。

解析:

我们还是可以利用8进制进行绕过或者小数绕过,但是因为strpos函数特性 要在8进制前加+或者加空格 ,小数应该是0 payload:?num=4476.0/?num=+010574

95关

解析:

  if(preg_match("/[a-z]/i", $num)){

 if(preg_match("/[a-z]|\./i", $num)){  95关

与之前不同的地方在正则匹配这里,多了一个. 其他的没变

还是用之前的payload:?num=+010574

96关

 

知识点:

这题看到了flag.php 应该是让我们找文件路径的题,找文件路径可以用

php伪协议filter

/var/www/html/flag.php(/var/www/html 只是Web服务器的默认根文件夹)

./flag.php(在linux下面表示当前目录是 "./" " . ./"代表上一层目录 “/”:代表根目录.)

解析:

payload:/var/www/html/flag.php    ./flag.php    php://filter/resource=flag.php

php://filter/read=convert.base64-encode/resource=flag.php (base64编码的伪协议使用)

97关

 知识点:

属于php md5强比较绕过

在 php 中,=== 代表着强比较,不仅仅会比较值,还会比较类型。因此这里不能在使用上面的方式进行绕过了。

要绕过此处的比较,需要向 md5() 函数中传入数组,md5() 函数中如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为 True 绕过。

解析:

因此这里可以使用数组绕过

payload:a[]=1&b[]=2

是post传参而不是get传参

98关

知识点:

php三元换算符

解析:

 $_GET?$_GET=&$_POST:'flag' 如果存在GET请求,则用POST请求传入的值将其覆盖掉.

$_GET['HTTP_FLAG']=='flag'?$flag:__FILE__ GET传入的HTTP_FLAG的值为flag,则输出flag.

所以POST:HTTP_FLAG=flag;GET随便传什么都行.

 

99关

 知识点:

array函数

array_push函数

 in_array函数

file_put_contents() 函数把一个字符串写入文件中。

该函数访问文件时,遵循以下规则:

  1. 如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径
  2. 如果文件不存在,将创建一个文件
  3. 打开文件
  4. 如果设置了 LOCK_EX,那么将锁定文件
  5. 如果设置了 FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容
  6. 向文件中写入数据
  7. 关闭文件并对所有文件解锁

如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

解析:

通过看这三个函数,知道了$allow = array()是设置了数组

0x36d是877的十六进制。for语句是一个循环结构,$i从36开始,每次与877作比较,只要小于877,则让$i加1。每次for语句执行成功,也就是加1都会执行下面的array_push函数。

array_push($allow, rand(1,$i))在1-$i之间随机生成一个整数,添加到数组$allow尾部

if(isset($_GET['n']) && in_array($_GET['n'], $allow)) 从这里可以看出in_array函数使用的是弱比较 因为他没有设置第三个参数为true 所以我们传入1.php就相当于传入了1 这里也是这题的主要考点

file_put_contents($_GET['n'], $_POST['content']); 这句话就是get传参并用post传入内容

所以post就可以传入命令执行语句,get传入1.php就可以绕过,因为数字1正好在 range(1,24)数组中,当随机生成的数字正好是1时就可以绕过 in_array()函数判断

解析:

payload: get: ?n=1.php   post:  content=<?php system('ls');?>

传入以后就可以找到1.php的页面执行命令找到了存放flag的文件

再用2.php读取flag文件

 

100关

 知识点:

考察的是运算符的优先级  :&& > || > = > and > or

运算符优先级的划分如下:

()小括号优先级最高

! 优先级高于 算术运算符

算术运算符 优先级高于 关系运算符

关系运算符优先级高于 "&&"和"||"

"&&"和"||"优先级高于 "="

运算符的种类还有很多,在往后的学习中我们就会慢慢地接触到,所以,在同一行代码中,

如果出现多种不同优先级的运算符时,最好还是加上小括号,这样才会比较直观。

(3)同等优先级的运算符,执行顺序的划分:

算术运算符 —— 乘法、除法、取余运算 优先级高于 加法、减法。

算术运算符 —— 乘法、除法、取余运算 出现在同一行代码中,则按从左到右的顺序执行。

算术运算符 —— 加法、减法, 出现在同一行代码中,则按从左到右的顺序执行。

关系运算术——出现在同一行代码中,按从左往右顺序执行。

 

​ 

 解析:

is_numeric函数 用于检测变量是否为数字或数字字符串

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); 关键在这句

因为=比and优先 所以v0的值是v1赋的 所以v0=is_numeric($v1) 看到代码后面有eval函数

想到命令执行

这需要$v2传入命令,$v3需要;结尾,但这么一来is_numeric一处理就变成了

$vo = $v1 and FALSE and FAlse

if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3))

再根据这两句,v2必须没有;v3必须

payload: /?v1=1&v2=system('ls')&v3=;

找到了包含flag的文件 但是点开什么都没有 打开ctfshow.php看看

/?v1=1&v2=system('tac ctfshow.php')&v3=;     (这里用tac的原因是发现cat不行然后换了一下)

发现了flag 0x2d是16进制的- 转换一下就好了

101关

 

不一样的地方在于把v2 v3的条件给改了

if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){

知识点

新学习到了反射

反射,通俗来讲就是可以通过一个对象来获取所属类的具体内容,php中内置了强大的反射API:

    ReflectionClass:一个反射类,功能十分强大,内置了各种获取类信息的方法,创建方式为new ReflectionClass(str 类名),可以用echo new ReflectionClass(‘className’)打印类的信息。

    ReflectionObject:另一个反射类,创建方式为new ReflectionObject(对象名)。

 

API:API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数

php反射类_php 反射类_raoxiaoya的博客-CSDN博客具体的可以看这个大佬的博客 就不做具体说明了

所以我们在这里可以直接用反射类的方法来做这道题

解析:

payload:?v1=1&v2=echo new ReflectionClass&v3=;

这里的flag是少了一位的 可以用bp抓包爆破 也可以一个一个字符尝试

102关

 

 知识点:

substr() 函数返回字符串的一部分。

注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。

 call_user_func():调用一个回调函数处理字符串,
可以用匿名函数,可以用有名函数,可以传递类的方法,
用有名函数时,只需传函数的名称
用类的方法时,要传类的名称和方法名
传递的第一个参数必须为函数名,或者匿名函数,或者方法
其他参数,可传一个参数,或者多个参数,这些参数会自动传递到回调函数中
而回调函数,可以通过传参,获取这些参数
返回回调函数处理后的结果

【php】php中call_user_func函数的用法_call_user_func用在什么时候_yanhui_wei的博客-CSDN博客

解析:

<?phphighlight_file(__FILE__);$v1 = $_POST['v1'];$v2 = $_GET['v2'];$v3 = $_GET['v3'];$v4 = is_numeric($v2) and is_numeric($v3); 通过将变量v2执行的命令base64加密后转换成16进制字符串来使得变量v4为ture 
if($v4){    $s = substr($v2,2);   $str = call_user_func($v1,$s);
通过变量v1调用hex2bin函数将变量v2的16进制字符串转换成原来的base64编码形式(因为这里v2只使用数字 并且是在第二位之后即第三位开始读取suo'y)
echo $str;    file_put_contents($v3,$str);
通过使用php://filter伪协议写入webshell

get传参v2和v3,post传参v1;if中需要v4为真才能往下执行,而v4要为真就是v2传的参数要为数字或者数字字符串,同时v2也是我们要写入的webshell,为了让v2为数字或者数字字符串,我们可以先把我们的webshell转换为base64编码,再把base64编码转换为16进制,这是一种办法去转换成数字。

payload:

get:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

post: v1=hex2bin

(<?=`cat *`;——base64:PD89YGNhdCAqYDs=——16进制:5044383959474e6864434171594473) (v3为伪协议)

 

在访问1.php 得到flag

 103关

看代码发现和102关没什么区别 该绕过的都用base64以及16进制绕过了 可以沿用102关的payload

都是在页面的源代码里找到的flag

104关

 知识点:

sha1()函数特性,sha1函数无法处理数组,遇到数组会返回NULL

解析:

get传入v2 post传入v1 让两个变量的sha1值相等 用的是弱比较

payload: get: v2[]=1  post: v1[]=1

得到flag

php代码审计作业题到此结束 通过这些题也找到了代码审计方面的做题思路,一些不认识的函数也认识了不少 但是不足也很明显,好多函数的特性并没有了解过,看到简单的代码还行 如果有复杂的代码还是头大 欠缺的地方很多 到实际的时候也没有那么多时间让你去查函数  还是要花功夫去记函数的

 

 

相关文章:

CTFshow web93-104关

这周要学习的是php代码审计 根据师兄的作业 来做web入门的93-104关 93关 看代码 进行分析 他的主函数 include("flag.php"); highlight_file(__FILE__); if(isset($_GET[num])){ $num $_GET[num]; if($num4476){ die("no no no!"); …...

ElasticSearch详细操作

ElasticSearch搜索引擎详细操作以及概念 文章目录 ElasticSearch搜索引擎详细操作以及概念 1、_cat节点操作1.1、GET/_cat/nodes&#xff1a;查看所有节点1.2、GET/_cat/health&#xff1a;查看es健康状况1.3_、_GET/_cat/master&#xff1a;查看主节点1.4、GET/_cat/indices&a…...

【OpenVINOSharp】 基于C#和OpenVINO2023.0部署Yolov8全系列模型

基于C#和OpenVINO2023.0部署Yolov8全系列模型 1 项目简介1.1 OpenVINOTM 2 OpenVinoSharp2.1 OpenVINOTM 2023.0安装配置2.2 C 动态链接库2.3 C#构建Core推理类2.4 NuGet安装OpenVinoSharp 3 获取和转换Yolov8模型3.1 安装ultralytics3.2 导出yolov8模型3.3 安装OpenVINOTM Pyt…...

121. 买卖股票的最佳时机

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

FDO(Feedback-Driven Optimization) LTO(Link-Time Optimization)

反馈驱动优化&#xff08;Feedback-Driven Optimization&#xff0c;FDO&#xff09;和链接时优化&#xff08;Link-Time Optimization&#xff0c;LTO&#xff09;是两种重要的编译器优化技术。下面我们详细介绍这两种技术&#xff1a; 反馈驱动优化 (FDO)&#xff1a; FDO 是…...

低成本无刷高速吹风机单片机方案

高速吹风机的转速一般是普通吹风机的5倍左右。一般来说&#xff0c;吹风机的电机转速一般为2-3万转/分钟&#xff0c;而高速吹风机的电机转速一般为10万转/分钟左右。高转速增加了高风速。一般来说&#xff0c;吹风机的风力只有12-17米/秒&#xff0c;而高速吹风机的风力可以达…...

使用Python爬取某查查APP端(Appium自动化篇)

1. 写在前面 某查查网站反爬虫风控还是较强的&#xff0c;之后会分别介绍一下PC端协议、APP端自动化、APP端接口协议三种采集方案。这里主要介绍APP端的自动化方式&#xff0c;APP端自动化方式需要登陆账号&#xff0c;协议的话需要签名授权&#xff08;自动化经测试没有太多限…...

vue3实现组件可拖拽 vuedraggable

npm i -S vuedraggablenext 中文文档&#xff0c;里面有完整代码案例&#xff0c;值得一看 vue.draggable vue3 版本在工作台中的应用场景 - itxst.com...

gradio常用组件

gradio常用组件 1.gradio程序启动2.写入html相关代码3.文本框4. 回车触发事件5.选择按钮框6.下拉框7.点击按钮8.清空按钮9.监听组件10.输出流11.template 1.gradio程序启动 import gradio as gr def tab():pass with gr.Blocks() as ui:gr.Markdown("# <center>&am…...

vcode开发go

配置环境变量 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 创建文件夹 mkdir hello cd hello go mod help go mod help 初始化一个项目 go mod init hello 获取第三方包 go get github.com/shopspring/decimal 将依赖包下载到本地 go mod …...

聊城大学823软件工程考研

1.什么是软件工程?它目标和内容是什么? 软件工程就是用科学的知识和技术原理来定义&#xff0c;开发&#xff0c;维护软件的一门学科。 软件工程目标&#xff1a;付出较低开发成本&#xff1b;达到要求的功能&#xff1b;取得较好的性能&#xff1b;开发的软件易于移植&…...

Spring Initailizr--快速入门--SpringBoot的选择

&#x1f600;前言 本篇博文是关于IDEA使用Spring Initializer快速创建Spring Boot项目的说明&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可…...

大数据课程I1——Kafka的概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Kafka的概念; ⚪ 掌握Kafka的配置与启动; 一、简介 1. 基本概念 Apache kafka 是一个分布式数据流平台。可以从如下几个层面来理解: 1. 我们可以向Kafka发布数据以及从Kafka订阅…...

视图簇 se54 sm34 se54

今天演练了一下 维护视图到视图簇的过程。 se11建表&#xff0c;建表之后 【使用程序】→【表维护生成器】 se54 新建视图簇 对象结构 选中其中一行 字段附属 PS:以上每一行都要设置过去 &#xff0c; 设置完成了 激活 sm34展示...

风丘科技将亮相 EVM ASIA 2023

风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会&#xff0c;专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…...

腾讯云服务器S6、SA3、S5、SA2等CVM实例介绍

腾讯云服务器CVM实例标准型S6、SA3、S5、SA2等多款实例降价&#xff0c;最高幅度达40%&#xff0c;标准型S6云服务器是新一代云服务器&#xff0c;SA3和SA2是AMD处理器&#xff0c;标准型S5是次新一代的云服务器&#xff0c;如下图&#xff1a; 腾讯云服务器CVM降价 标准型S6&a…...

使用kickstart和anaconda自动化安装centos系统

使用kickstart和anaconda自动化安装centos系统 使用kickstart和anaconda自动化安装centos系统 anaconda 介绍 kickstart 介绍 实验过程 前提 1.已经安装好至少两台centos系统 2.需要实现自动安装的系统的光盘镜像 3.已安装的系统之间可以通讯(比如处于VMware中的NAT网络的…...

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长&#xff0c;其实目标很简单&#xff0c;就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD&#xff0c;并顺便加入CRC16检验函数&#xff0c;再进行16进制高低字节调整&#xff0c;方便在VB6、Delphi、La…...

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…...

单细胞分类和预测任务

对于分类和预测任务&#xff0c;在生物信息学领域有一些常用的方法和工具可以使用。以下是一些常见的方法和工具&#xff1a; 1. 机器学习方法&#xff1a; 包括支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;、随机森林&#xff08;Random Forest…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...