CTFshow web(php特性 105-108)

web105

<?php

/*

-*- coding: utf-8 -*-

@Author: Firebasky

@Date: 2020-09-16 11:25:09

@Last Modified by: h1xa

@Last Modified time: 2020-09-28 22:34:07

*/

highlight_file(FILE);

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); ?\> 知识点:**php变量间接引用(或者叫php变量覆盖)** **在代码中,`$$key=$$value` 是使用变量间接引用(variable variable)的方式来进行赋值操作。** **变量间接引用是一种特殊的功能,可以通过变量的值来构建变量名称,并对其赋值。在这里,`$key` 代表一个变量名,`$value` 代表变量的值。** **当执行 `$$key=$$value` 时,首先会使用 `$value` 的值构建一个变量名,并将其赋值给 `$key`。也就是说,使用变量 `$value` 的值作为新的变量名,并将这个新的变量名的值指向 `$value` 的值。** **如果觉得太绕了,那就举个例子:** **举个例子来说明,假设 `$key` 的值是 `'name'`,而 `$value` 的值是 `'John'`。那么执行 `$$key=$$value` 后,就相当于执行 `$name=$John`。结果就是创建了一个名为 `$name` 的变量,并将它的值设置为 `'John'`。** **明白了这个那接下来就好办了,直接令suces=flag然后再在POST上传error=flag** **原理:** **在代码执行时,`$$key=$$value` 这一行会被执行两次,首先是执行`$suces=$flag`,然后是执行 `$error=$suces`。由于`$flag` 被包含在了`flag.php`文件中,并被引入到了代码中,因此通过 `$suces=$flag`,`$suces`的值即变为了 `flag`。接着,通过 `$error=$suces`,`$error`的值也变为了 `flag`。** **接下来,代码会通过判断`if (!($_POST['flag'] == $flag))`来检查 `$_POST['flag']` 是否等于 `$flag`,而当我们在POST请求中传递了参数 `flag=flag`时,这个条件将会满足,所以不会触发 `die($error)`,而是输出 `your are good` 和 `$flag` 的值。** **payload:?suces=flag** **POST error=suces** **web106** \ ![](https://file.jishuzhan.net/article/1754316825371348993/edd62d26e4850ea0198bd76d84baa342.webp)这里我的一篇文章有相关知识点,这种**"比较类"**的题目可以花几分钟系统学习 [PHP强相等\&弱相等(附带科学计数法)_php 科学计数法-CSDN博客](https://blog.csdn.net/csjjjd/article/details/135005124 "PHP强相等&弱相等(附带科学计数法)_php 科学计数法-CSDN博客") 哈希函数主流绕过就一个,拿出数组绕过,只要保证后面的数字不一样就好了 payload: ?v2\[\]=2 POST :v1\[\]=1 ![](https://file.jishuzhan.net/article/1754316825371348993/4071f60e2814f93ccd444c4a758ba890.webp) web107 \ 知识点: **PHP parse_str() 函数:将查询字符串解析为变量:** ![](https://file.jishuzhan.net/article/1754316825371348993/90ced3eae22afc8cf47d06a398dec1d0.webp) **代码重点:** 1. **使用 `parse_str()` 函数将 `$v1` 作为参数进行解析,并将解析结果赋给变量 `$v2`。** 2. **若 `$v2` 数组中的 'flag' 键所对应的值等于 `$v3` 的MD5哈希值,则输出 `$flag` 的值。** **那不还是跟之前的那道题目一嘛,只要v1的值跟v3的值不一样不就好了吗** **payload:** ?v3\[\]=0 POST:v1=1 ![](https://file.jishuzhan.net/article/1754316825371348993/04aab55f306be7bf671152e7e370ed62.webp) web108 `` error 呃........这道题目真的难度很大 因为只有36d身材的人才能看到flag(doge),吓得我差点去叫了学姐外援做题,哈哈哈哈哈哈 知识点: strrev是反转字符串的意思 ![](https://file.jishuzhan.net/article/1754316825371348993/5aeafd29d9b84e1b3fea17efb888667b.webp) `ereg()`函数搜索由指定的字符串作为由模式指定的字符串,如果发现模式则返回`true`,否则返回`false`。搜索对于字母字符是区分大小写的。 可选的输入参数`regs`包含由正则表达式中的括号组成的所有匹配表达式的数组。 **在这里的意思就是c必须全是字符** **语法** int ereg(string pattern, string originalstring, [array regs]); **返回值** * 如果有找到模式匹配,则返回`true`,否则返回`false`。 * **注意php5.3后废弃,看看就好了** **前面要全是字符,后面又要877的反转778,怎么可能!** **除非进行%00前后截断,截断过后%00后面就不再受到前面的控制,不用全字符。** payload:?c=a%00778 真诚地希望我的文章对大家有所帮助!

相关推荐
独行soc9 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
Clockwiseee12 小时前
php伪协议
windows·安全·web安全·网络安全
xcLeigh13 小时前
网络安全 | 防火墙的工作原理及配置指南
安全·web安全
安全小王子14 小时前
Kali操作系统简单介绍
网络·web安全
光路科技15 小时前
八大网络安全策略:如何防范物联网(IoT)设备带来的安全风险
物联网·安全·web安全
网络安全Jack17 小时前
网络安全概论——身份认证
网络·数据库·web安全
网络安全King17 小时前
计算机网络基础(2):网络安全/ 网络通信介质
计算机网络·安全·web安全
黑客Jack18 小时前
网络安全加密
安全·web安全·php