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() 函数:将查询字符串解析为变量:
代码重点:
-
使用
parse_str()
函数将$v1
作为参数进行解析,并将解析结果赋给变量$v2
。 -
若
$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
真诚地希望我的文章对大家有所帮助!