变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。
通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。经常导致变量覆盖漏洞场景有:
使
用
不
当
,
e
x
t
r
a
c
t
(
)
函
数
使
用
不
当
,
p
a
r
s
e
s
t
r
(
)
函
数
使
用
不
当
,
i
m
p
o
r
t
r
e
q
u
e
s
t
v
a
r
i
a
b
l
e
s
(
)
使
用
不
当
,
开
启
了
全
局
变
量
注
册
等
。
本
篇
收
集
了
几
个
C
T
F
中
的
题
目
作
为
例
子
,
对
使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。 本篇收集了几个CTF中的题目作为例子,对
使
用
不
当
,
e
x
t
r
a
c
t
(
)
函
数
使
用
不
当
,
p
a
r
s
e
s
t
r
(
)
函
数
使
用
不
当
,
i
m
p
o
r
t
r
e
q
u
e
s
t
v
a
r
i
a
b
l
e
s
(
)
使
用
不
当
,
开
启
了
全
局
变
量
注
册
等
。
本
篇
收
集
了
几
个
C
T
F
中
的
题
目
作
为
例
子
,
对
,extract(),parse_str()的问题进行总结。
0x01 $$导致的变量覆盖问题
<?php
include “flag.php”;
$_403 = “Access Denied”;
$_200 = “Welcome Admin”;
if ($_SERVER["REQUEST_METHOD"] != “POST”)
{
die(“BugsBunnyCTF is here :p…”);
}
if ( !isset($_POST["flag"]) )
{
die($_403);
}
foreach ($_GET as $key => $value)
{
$$key = $$value;
}
foreach ($_POST as $key => $value)
{
$$key = $value;
}
if ( $_POST["flag"] !== $flag )
{
die($_403);
}
echo “This is your flag : “. $flag . “\n”;
die($_200);
?>
解题:
源码包含了flag.php文件,并且需要满足3个if里的条件才能获取flag,题目中使用了两个foreach并且也使用了
.
两
个
f
o
r
e
a
c
h
中
对
.两个foreach中对
.
两
个
f
o
r
e
a
c
h
中
对
key的处理是不一样的,满足条件后会将
f
l
a
g
里
面
的
值
打
印
出
来
,
所
以
flag里面的值打印出来,所以
f
l
a
g
里
面
的
值
打
印
出
来
,
所
以
flag是在flag.php文件文件中的。 但是由于第7,11-14行间的代码会将flag的值给覆盖掉了,所以需要先将
flag的值赋给200或_403变量,然后利用die(200)或die(_403)将flag打印出来。解题方法: 由于第7,11-14行间的代码会将
f
l
a
g
的
值
给
覆
盖
掉
,
所
以
只
能
利
用
第
一
个
f
o
r
e
a
c
h
先
将
flag的值给覆盖掉,所以只能利用第一个foreach先将
f
l
a
g
的
值
给
覆
盖
掉
,
所
以
只
能
利
用
第
一
个
f
o
r
e
a
c
h
先
将
flag的值赋给
2
00
,
然
后
利
用
d
i
e
(
_200,然后利用die(
2
0
0
,
然
后
利
用
d
i
e
(
_200)将原本的flag值打印出来。最终PAYLOAD: 本地复现,所以flag与原题不一样GET DATA:?_200=flag POST DATA:flag=aaaaaaaaaaaaaaaaaaaaa