[关闭]
@1kbfree 2018-10-01T19:03:31.000000Z 字数 1020 阅读 1837

变量覆盖漏洞

代码审计


变量覆盖是指可以用我们自定义的参数值替换代码中原有的变量值,变量覆盖漏洞可以结合其他功能来打组合拳实现危害更高的漏洞,我先讲解变量覆盖漏洞再来说如何打组合拳~

函数使用不当造成的变量覆盖


extract函数:

先看使用方式(姿势):
image_1cd0am42v1gt31r3386914uk1j4a9.png-25kB

extract()的意思就是把数组里的key变成变量名,把value变成变量值。它的参数如下~

语法:
image_1cd0avsdfdk81p3718tf1d3m1utr1g.png-76.8kB

也就是说该函数有3种情况会覆盖已有的变量:
1. 第二个参数为EXTR_OVERWRITE(如果有冲突,覆盖已有的变量)
2. 只传入第一个参数而不传入第二个参数的时候,也就是默认为EXTR_OVERWRITE
3. 第二个参数为EXTR_IF_EXISTS时,他表示如果代码中存在那个变量就覆盖那个变量,否则无法覆盖

此函数缺陷利用方法之一:
变量覆盖漏洞其实不是分函数的,这里只是为了演示,所以就那其中之一的思路来利用
image_1cd0bfr04fshd2m4jh1o7jpfa2a.png-285kB
这里就是运用了变量覆盖漏洞来修改shop_money的值来购买物品(居然0元,当然这只是演示,程序员肯定不会这么简单的写的,这就需要你和程序员比细心了~)


parse_str函数:

使用方式(姿势):
image_1cd0c58po1ejlrrqtdntr1n5s34.png-132.3kB
把这里的好字去掉~
image_1cd0cdii91k1t11qt5te1pg1pqv3h.png-54kB


import_request_variables函数:

此函数把GET、POST、COOKIE的参数注册为变量,一般不建议开启

注意,只在 PHP4.1PHP5.4之间可用

  1. <?php
  2. $name = 'whoami';
  3. import_request_variables('GP'); //G表示GET、P表示POST如果有C表示COOKIE;这里的GP表示注册GET和POST请求的参数为变量
  4. echo $name;
  5. ?>

效果:
image_1cckvkb6b186c6g11p8ojf4lbd9.png-54.1kB


$$变量覆盖

image_1cbrhvola1igmjhm15mc1rsqed816.png-33.4kB
image_1cbri0lsa1tuc1erh1d5q1drsdre1j.png-70.7kB

更巧妙的使用方法

  1. <?php
  2. foreach (array( '_GET','_POST' ) as $key => $value) {
  3. foreach ($$value as $_key => $_value){
  4. echo $_key.':'.$_value;
  5. echo "<br >";
  6. }
  7. }
  8. ?>

执行后的结果:
image_1ccl9ivq22vk1pdat631f7oq8s1g.png-32.5kB


打组合拳方法:

前提是存在变量覆盖漏洞~

  1. 利用变量覆盖漏洞来修改用户余额或产品价格来购买
  2. 利用变量覆盖漏洞来修改sql语句查询的$id内容,造成sql注入
  3. 利用变量覆盖漏洞修改文件上传的白名单列表,覆盖进去一个PHP扩展名,就可以上传PHP文件的shell了
  4. 还有很多...

防御变量覆盖

看了那么多,那么我们该如何防御呢,有一个简单粗暴的方法就是判断这个变量是否存在,如果存在则不执行变量覆盖操作

image_1cd0dvnpf1jnm1a7u14411kip9jdm.png-65.1kB
image_1cd0e10et14uah5efrd8dr1cec13.png-105.2kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注