ctf
题目中可以看到一些变量覆盖的知识点,之前对这个方面学习的有点不全面,虽然网上有这方面的文章,但是感觉讲的不是很全面,所以就决定写一篇文章来总结这方面的知识。$$
extract()
parse_str()
import_request_variables()
mb_parse_str
register_globals
extract()
extract()
函数从数组中将变量导入到当前的符号表。<?php
$a = "eeknight";
$my_array = array("a" => "C","b" => "T", "c" => "F");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>输出:
$a = C; $b = T; $c = F
<?php
$a="echo 'eeknight';";
echo $a;
echo "n";
eval($a);
?>
输出:
echo 'eeknight';
eeknight
eval
去利用他,就可以直接输出单引号里的东西了。extract
就发挥作用了。<?php
$a="echo 'eeknight';";
extract($_GET);
eval($a);
?>
$
$$
产生的漏洞主要是因为foreach
遍历数组的值,然后将获取的数组键名作为变量,数组中的值作为变量的值。
在这先简单介绍一下foreach
和$$
。
foreach
循环只适用于数组,并用于遍历数组中的每个键/值对。
<?php
$colors = array("red","green","blue","yellow"); foreach ($colors as $value) {
echo "$value n";
}
?>
输出:red
green
blue
yellow
$$
这里举个栗子
在PHP中,$var
表示一个名为var
的普通变量,它存储字符串、整数、浮点等任何值。而$$var
是一个引用变量,用于存储$var
的值。
在我看来就是套娃。
<?php
$var = "ee";
$$var = "eeknight";
echo $var ;
echo "n";
echo $$var;
echo "n";
echo "$ee";
?>
输出:ee
eeknight
eeknight
parse_str()
parse_str()
把查询字符串解析到变量中。
parse_str(string,array)
string 必需。规定要解析的字符串。
array 可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。
<?php
parse_str("name=eeknight&age=20");
echo $name."n";
echo $age;
?>
输出:eeknight
20
通过上面的例子,可以想到,如果parse_str()
括号是GET
,PSOT
等之类的,我们是不是就可以直接执行我们要的函数。
mb_parse_str
mb_parse_str
— 解析 GET/POST/COOKIE 数据并设置全局变量
具体的用法和上面的parse_str()
一样。
这里就不多说明了。
import_request_variables()
import_request_variables()
函数将 GET/POST/Cookie 变量导入到全局作用域中。
<?php
import_request_variables("gP", "ee_");
echo $ee_knight;
?>
只要利用了这个函数,就可以直接对里面的变量进行赋值。
register_globals
register_globals
的意思就是注册为全局变量
当php.ini
中register_globals
=On
时,传递过来的值会被直接注册为全局变量,当为off
时,需要到特定的数组中去得到
例子
<?php
echo "Register_globals: ".(int)ini_get("register_globals")."<br/>";
if ($auth){
echo "hello!";
}
?>
这里ON-->OFF
的转换时记得重启一下apache
。
为什么echo "$a = $a; $b = $b; $c = $c";
这里要加上呢
解:这些斜杠的的意思就是,让后面的变量失去意义。那么写的是什么就是什么。
parse_str()
php.ini
文件中的magic_quotes_gpc
设置影响该函数的输出。如果已启用,那么在parse_str()
解析之前,变量会被 addslashes()
转换。
import_request_variables()
该函数在最新版本的 PHP 中已经不支持。
支持的版本:PHP 4 >= 4.1.0, PHP 5 < 5.4.0。
register_globals
register_globals
从php5.3.0起废弃,并从php5.4.0时移除。
addslashes()
addslashes()
在每个双引号(")前添加反斜杠。
使用原始变量,不进行变量注册;
验证变量存在,如果一定要进行变量注册,可以在注册变量前先判断变量是否存在。
本文作者:蚁景科技
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/155955.html