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注入,没错,当使用如下代码时可以起到效果:

  1. $Model->where("id=%d and username=‘%s‘ and xx=‘%f‘",array($id,$username,$xx))->select();

复制代码

或者

  1. $Model->where("id=%d and username=‘%s‘ and xx=‘%f‘",$id,$username,$xx)->select();

复制代码

但是,当你使用如下代码时,却没有"防止SQL注入"效果(而官方文档却说可以防止SQL注入):

  1. $model->query(‘select * from user where id=%d and status=%s‘,$id,$status);

复制代码

或者

  1. $model->query(‘select * from user where id=%d and status=%s‘,array($id,$status));

复制代码

原因:
ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql函数没有实现SQL过滤.
原函数:

  1. protected function parseSql($sql,$parse) {
  2. // 分析表达式
  3. if(true === $parse) {
  4. $options =  $this->_parseOptions();
  5. $sql  =   $this->db->parseSql($sql,$options);
  6. }elseif(is_array($parse)){ // SQL预处理
  7. $sql  = vsprintf($sql,$parse);
  8. }else{
  9. $sql    =   strtr($sql,array(‘__TABLE__‘=>$this->getTableName(),‘__PREFIX__‘=>C(‘DB_PREFIX‘)));
  10. }
  11. $this->db->setModel($this->name);
  12. return $sql;
  13. }

复制代码

验证漏洞(举例):
请求地址:
http://localhost/Main?id=boo" or 1="1

http://localhost/Main?id=boo%22%20or%201=%221
action代码:

  1. $model=M(‘Peipeidui‘);
  2. $m=$model->query(‘select * from peipeidui where name="%s"‘,$_GET[‘id‘]);
  3. dump($m);exit;

复制代码

  1. $model=M(‘Peipeidui‘);
  2. $m=$model->query(‘select * from peipeidui where name="%s"‘,array($_GET[‘id‘]));
  3. dump($m);exit;

复制代码

结果:
表peipeidui所有数据被列出,SQL注入语句起效.

解决办法:
将parseSql函数修改为:

  1. protected function parseSql($sql,$parse) {
  2. // 分析表达式
  3. if(true === $parse) {
  4. $options =  $this->_parseOptions();
  5. $sql  =   $this->db->parseSql($sql,$options);
  6. }elseif(is_array($parse)){ // SQL预处理
  7. $parse = array_map(array($this->db,‘escapeString‘),$parse);//此行为新增代码
  8. $sql  = vsprintf($sql,$parse);
  9. }else{
  10. $sql    =   strtr($sql,array(‘__TABLE__‘=>$this->getTableName(),‘__PREFIX__‘=>C(‘DB_PREFIX‘)));
  11. }
  12. $this->db->setModel($this->name);
  13. return $sql;
  14. }

复制代码

总结:
不要过分依赖TP的底层SQL过滤,程序员要做好安全检查
不建议直接用$_GET,$_POST

原文地址:https://www.cnblogs.com/0daybug/p/12417140.html

时间: 2024-11-10 07:28:15

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

Drupal 7.31版本爆严重SQL注入漏洞

今早有国外安全研究人员在Twitter上曝出了Drupal 7.31版本的最新SQL注入漏洞,并给出了利用测试的EXP代码. 在本地搭建Drupal7.31的环境,经过测试,发现该利用代码可成功执行并在数据库中增加一个攻击者自定义的用户. 测试代码:(请勿用于非法用途) POST /drupal-7.31/?q=node&destination=node HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x8

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

如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷.而使用PHP的PDO扩展的 prepare 方法,就可以避免 sql injection 风险. PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的

ecshop 全系列版本网站漏洞 远程代码执行sql注入漏洞

ecshop漏洞于2018年9月12日被某安全组织披露爆出,该漏洞受影响范围较广,ecshop2.73版本以及目前最新的3.0.3.6.4.0版本都受此次ecshop漏洞的影响,主要漏洞是利用远程代码执行sql注入语句漏洞,导致可以插入sql查询代码以及写入代码到网站服务器里,严重的可以直接获取服务器的管理员权限,甚至有些网站使用的是虚拟主机,可以直接获取网站ftp的权限,该漏洞POC已公开,使用简单,目前很多商城网站都被×××,危害较大,针对于此我们SINE安全对该ECSHOP漏洞的详情以及如

DedeCMS另一处全版本通杀SQL注入(无限制)

一:网站要支持申请友链 url:/plus/flink_add.php =——————————————————–利用开始————————– 直接填写验证码,抓包 修改POST数据 写人exp: 1 Submit=%20%E6%8F%90%20%E4%BA%A4%20&dopost=save&email=&logo=,if(@`'`,0x7c,(select concat(userid,0x7c,pwd) from dede_admin limit 0,1)),1,1,1,1,1)#

优客365 v2.9版本 后台存在SQL注入

安装 打开后台登陆界面 http://localhost:9096/yk365/system/login.php 输入单引号报错 得到表名 经过跟踪后在\module\login.php文件出现错误 代码处理不严谨.根据上图,经测试,用户名可以用1' or '1'='1进行绕过 但密码经过md5加密 接下来通过SQL注入得到md5加密后的密码 payload:' and (select 1 from(select count(*),concat(0x7e,(select user_pass fr

X-UA-Compatible IE8 版本的一个特殊文件头标记

       X-UA-Compatible是针对 IE8 版本的一个特殊文件头标记,用于为 IE8 指定不同的页面渲染模式,对于ie8之外的浏览器是不识别的. 在X-UA-Compatible中可用的方法有: <meta http-equiv="X-UA-Compatible" content="IE=5" > <meta http-equiv="X-UA-Compatible" content="IE=7"

漏洞预警 | ECShop全系列版本远程代码执行高危漏洞

2018年9月1日,阿里云态势感知发布预警,近日利用ECShop全系列版本的远程代码执行漏洞进行批量化攻击量呈上升趋势.该漏洞利用简单且危害较大,黑客可通过WEB攻击直接获得服务器权限. 漏洞原理 该漏洞产生的根本原因在于ECShop系统的user.php文件中,display函数的模板变量可控,导致注入,配合注入可达到远程代码执行的效果.使得攻击者无需登录等操作,直接可以获得服务器的权限. 首先从user.php文件入手,代码中可以看到,系统读取HTTP_REFERER传递过来的 内容赋值给$

thinkphp 防止sql注入

对于WEB应用来说,SQL注入攻击无疑是首要防范的安全问题,系统底层对于数据安全方面本身进行了很多的处理和相应的防范机制,例如: 大理石平台价格 $User = M("User"); // 实例化User对象 $User->find($_GET["id"]); 即便用户输入了一些恶意的id参数,系统也会强制转换成整型,避免恶意注入.这是因为,系统会对数据进行强制的数据类型检测,并且对数据来源进行数据格式转换.而且,对于字符串类型的数据,ThinkPHP都会进行