PHP-变量覆盖漏洞

$$变量覆盖

CG-CTF一个简单的$$变量覆盖

地址: 变量覆盖

查看网页源码:

1
2
3
4
5
6
<!--foreach($_GET as $key => $value){  
$$key = $value;
}
if($name == "meizijiu233"){
echo $flag;
}-->

foreach是一个遍历数组的函数,也可用于对象

有两种语法:

1
2
3
4
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

$$key = $value;中key有两个$,这会获取到的数组键名作为变量,数组中的键值就成了变量的值

即该题目中利用?name=meizijiu233,覆盖原name的值就可输出flag

3.jpg

接着又学习了下extract()和parse_str()导致变量覆盖的问题

extract()

用法:

1
extract(array,extract_rules,prefix)
1
2
3
4
5
6
<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$flag = "xxx";
extract($_GET);
if (isset($gift)) {
$content = trim($flag);
if ($gift == $content) {
echo "success";
}
else {
echo "failed";
}
}
?>

extract($_GET)接收了GET请求中的数据,并将键名和键值转换为变量名和变量的值,然后两个if 的条件判断

GET请求?flag=&gift=令flag和gift的值相等

2.jpg

parse_str

parse_str() 函数用于把查询字符串解析到变量中

注:如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。

语法:parse_str(string,array)

array可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。

1
2
3
4
5
<?php
parse_str("name=Bill&age=60");
echo $name."<br>";
echo $age;
?>

找个网上的代码测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
}
else {
$a = "www.OPENCTF.com";
$id = $_GET['id'];
@parse_str($id);
if ($a[0] != "QNKCDZO" && md5($a[0]) == md5("QNKCDZO")) {
echo "ok";
} else {
exit("其实很简单其实并不难!");
}
}
?>

利用parse_str变量覆盖a[0]的值,再利用0e开头的md5绕过

比如?id=a[0]=240610708

4.jpg

防范:

  • 觉得应该尽量少利用以上方法注册变量或选择合适的参数,比如extract的EXTR_SKIP

  • 看有无同名变量存在

文章作者: J0k3r
文章链接: http://yoursite.com/2018/04/02/blfg/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J0k3r
支付宝打赏
微信打赏