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

<?php

/*

-*- coding: utf-8 -*-

@Author: atao

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

@Last Modified by: h1xa

@Last Modified time: 2020-09-28 22:38:27

*/

highlight_file(FILE);

include("flag.php");

if(isset(_POST\['v1'\]) \&\& isset(_GET'v2')){

v1 = _POST'v1';

v2 = _GET'v2';

if(sha1(v1)==sha1(v2) && v1!=v2){

echo $flag;

}

}

?>

这里我的一篇文章有相关知识点,这种**"比较类"**的题目可以花几分钟系统学习

PHP强相等&弱相等(附带科学计数法)_php 科学计数法-CSDN博客

哈希函数主流绕过就一个,拿出数组绕过,只要保证后面的数字不一样就好了

payload:

?v2\[\]=2

POST :v1\[\]=1

web107

<?php

/*

-*- coding: utf-8 -*-

@Author: h1xa

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

@Last Modified by: h1xa

@Last Modified time: 2020-09-28 23:24:14

*/

highlight_file(FILE);

error_reporting(0);

include("flag.php");

if(isset($_POST'v1')){

v1 = _POST'v1';

v3 = _GET'v3';

parse_str(v1,v2);

if(v2\['flag'\]==md5(v3)){

echo $flag;

}

}

?>

知识点:

PHP parse_str() 函数:将查询字符串解析为变量:

代码重点:

  1. 使用 parse_str() 函数将 $v1 作为参数进行解析,并将解析结果赋给变量 $v2。

  2. 若 $v2 数组中的 'flag' 键所对应的值等于 $v3 的MD5哈希值,则输出 $flag 的值。

那不还是跟之前的那道题目一嘛,只要v1的值跟v3的值不一样不就好了吗

payload:

?v3\[\]=0

POST:v1=1

web108

<?php

/*
`

-- coding: utf-8 --`

`

@Author: h1xa`

`

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

`

@Last Modified by: h1xa`

`

@Last Modified time: 2020-09-28 23:53:55`

*/

highlight_file(__FILE__);
error_reporting(0);
include("flag.php");

if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {
die('error');

}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
echo $flag;
}

?>

error

呃........这道题目真的难度很大

因为只有36d身材的人才能看到flag(doge),吓得我差点去叫了学姐外援做题,哈哈哈哈哈哈

知识点:

strrev是反转字符串的意思

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

真诚地希望我的文章对大家有所帮助!

相关推荐
砚凝霜1 小时前
【软考信息安全】第十三章 网络安全漏洞分类管理与扫描处置
安全·web安全
Xudde.2 小时前
CVE-2017-9993漏洞复现
笔记·学习·安全·web安全
墨云安全4 小时前
红队评估和渗透测试的区别是什么?2026 年从目标、方法到交付物的对比
网络·安全·web安全·网络安全·渗透测试
砚凝霜8 小时前
【软考信息安全】第十六章 网络安全风险评估项目流程与应用
网络·安全·web安全
悟道子HD11 小时前
网络安全基本功——MySQL基础
android·mysql·web安全
Hum8le1 天前
CTF题目《easy_web》(安洵杯 2019 变种 Web)
前端·安全·web安全
HackTwoHub1 天前
DeepSeek Harness 红队破甲插件|适配 SRC 挖掘场景,区分平台拦截与模型原生输出,用于大模型安全边界合规测评研究
安全·web安全·网络安全·系统安全·密码学·网络攻击模型·安全架构
梦帮科技1 天前
【3.0】上线与运维:节点监控、水龙头、区块浏览器与安全清单
运维·安全·web安全·金融·区块链·密码学·安全架构
三8441 天前
Fastjson 漏洞· 06 · 防御、审计与检测
安全·web安全·fastjson
砚凝霜1 天前
【软考信息安全】第十二章 网络安全审计概述与分类
网络·安全·web安全