CTF_Web:php中的变量覆盖问题

0x00 前言

最近一直在整理有哪些方面的基础考点,一共可能列了10项吧,自己也在不断学习, 先把能想到的考点学完,带着这些常见问题再去重新学一次php的基础函数,然后再继续练习3分以上的题目,基础打牢,不管遇到什么都可以有自己的分析方式,而不是只能抄wp┭┮﹏┭┮。

0x01 什么是变量覆盖

变量覆盖基本都来自于各种函数(parse_str()extract()import_request_variables()等)对用户输入取值时的问题,当用户对已经存在的变量再次通过各种函数赋值时,将会触发变量覆盖,修改之前定义的值,这类问题需要严格定义用户可以输入的部分,或值避免使用存在此类问题的函数。

0x02 parse_str() 函数

菜鸟教程对他的介绍为:

定义和用法
parse_str()函数把查询字符串解析到变量中。
注释:如果未设置 array 参数,由该函数设置的变量将覆盖已存在的同名变量。
注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。
语法
parse_str(string,array)

<?php
parse_str("name=Peter&age=43");
echo $name."<br>";//Peter
echo $age;//43
?>

看起来似乎可以完成我们想要的工作,但如果用户不按照规定输入呢?这是xman-2017的一到题目:

<meta charset="utf-8">
<?php
error_reporting(0);
if (empty($_GET['b'])) {
    show_source(__FILE__);
    die();
}else{
    $flag = "ook";
$a = "www.XMAN.com";
$b = $_GET['b'];
parse_str($b);
echo $b,"<br/>";
var_dump($a);
echo "<br/>";
if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) {
    echo $flag;
}else{
exit('你的答案不对0.0');
}
}
?>

由源代码可以看出,要求输入b之后a[]的值被改变,可以看到b 的值被parse_str($b);解析,然后松散比较md5,后面部分我们上篇文章已经进行了研究,详情可看CTF_Web:php弱类型绕过与md5碰撞
我们重点关注如何让没有接受a值的情况下改变a 的值,这里使用?b=a[]=240610708,绕过。
输出:

a[]=240610708
array(1) { [0]=> string(9) "240610708" }
ook

可见我们输入的b值被解析为了a[0]=240610708,a也被覆盖更改为了数组。

0x03 extract()函数

菜鸟教程对他的介绍为:

定义和用法
extract()函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
语法
extract(array,extract_rules,prefix)
第一个参数为指定的数组,第二个为创建变量的规则,第三个为需要增加的前缀。

1.array 必需。规定要使用的数组。
2.extract_rules   可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。
可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
3.prefix      可选。如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix 是必需的。该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。

也就是说当extract函数中赋值已有的变量时,将会根据规则进行处理,例如

<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");
extract($my_array, EXTR_PREFIX_SAME, "dup");
echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>
//$a = Original; $b = Dog; $c = Horse; $dup_a = Cat   这里冲突后为冲突的变量加了前缀dup和下划线。

看到这里大家也就能猜到这个变量覆盖漏洞其实就是来源于

EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。

当没有指定规则的时候就会发生变量覆盖。

<?php
$flag="ook!";
extract($_GET);  
echo $flag;
if($key==$flag)
{
    echo $flag;
}
else
{
    echo'Oh.no';
}
?>

由于首先为flag赋值,后extract了GET的值,所以会将已经存在的进行覆盖,如果先后顺序倒换一下, 就不可以被用户控制了。

0x04 import_request_variables()函数

菜鸟教程对他的解释为:

import_request_variables()函数将 GET/POST/Cookie变量导入到全局作用域中。该函数在最新版本的 PHP 中已经不支持。
import_request_variables()函数将 GET/POST/Cookie变量导入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局变量,那么此函数就很有用。
版本要求:PHP 4 >= 4.1.0, PHP 5 < 5.4.0
语法
bool import_request_variables ( string $types [, string $prefix ] )返回bool型结果。

$types:指定需要导入的变量,可以用字母 G、P 和 C 分别表示 GET、POST 和 Cookie,这些字母不区分大小写,所以你可以使用 g 、 p 和 c 的任何组合。POST 包含了通过 POST 方法上传的文件信息。注意这些字母的顺序,当使用 gp 时,POST 变量将使用相同的名字覆盖 GET 变量。任何 GPC 以外的字母都将被忽略。
$prefix: 变量名的前缀,置于所有被导入到全局作用域的变量之前。所以如果你有个名为 userid 的 GET 变量,同时提供了 pref_ 作为前缀,那么你将获得一个名为 $pref_userid 的全局变量。虽然 prefix 参数是可选的,但如果不指定前缀,或者指定一个空字符串作为前缀,你将获得一个 E_NOTICE 级别的错误。
<?php
// 此处将导入 GET 和 POST 变量
$a= "abc";
import_request_variables("gP");  //不使用前缀将会覆盖。
echo $a;
?>
?a=1将会把已定义的a值覆盖,造成漏洞。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容