zoukankan      html  css  js  c++  java
  • ThinkPHP 5.0.15中的update注入漏洞

    漏洞demo:

        public function inc()
        {
            $username = request()->get('name/a');
            db('user')->insert(['name' => $username]);
            return 'Update success';
        }

    首先看TP的数据获取:$username = request()->get('name/a');

    request(助手函数就是获取thinkphp/library/think/Request.php 的实例,然后调用其get方法:

    重点跟进input(方法:

     

     

     

    exp数据这种就是在这里过滤的。

    input助手函数干的事:

    1.使用默认的过滤器进行过滤

    2.过了EXP这种表达式关键字符

    3.对数据类型进行强制转化,默认是字符串格式

    然后接着看操作数据库一块:db('user')->insert(['name' => $username]);

    db助手函数:

    thinkphp/library/think/Db.php 数据库的工厂类:

     

    return  hinkdbconnectorMysql 对象的实例:

    继承于:thinkphp/library/think/db/Connection.php 类。

    然后继续执行 ->name($name); 则会触发thinkphp/library/think/db/Connection.php 类中的 __call 方法:

     

    这里回调的类就是: hinkdbQuery 类中的name( 方法:

    hinkdbQuery 中的__construct( 方法:

     

    builder 属性就是  hinkdbuilderMysql 类的实例:

    父类:thinkphp/library/think/db/Builder.php

    整个TP的DB类库我们就已经理完了,TP5相对TP3来说代码也更加优化了,代码逐渐组件化,各自的职责也更加明显了,实现了代码分离。

    下面开始分析漏洞代码:

    db('user')->insert(['name' => $username]);

    db('user')主要还是进行了name属性的设置,并且return thinkphp/library/think/db/Query 实例。

    继续调用了:think/db/Query 类中的 insert( 方法:

    跟进:$options = $this->parseExpress();

    将链式操作中设置的$this->options属性进行解析合并。

    eg: db('name')->where()->order()->select(); 这种操作。

    然后看重点:

    $sql = $this->builder->insert($data, $options, $replace);

    通过前面的分析,我们已经知道$this->builder 属性就是  hinkdbuilderMysql 类的实例:

     

     

     

    因为input数据获取函数并没有过滤inc,dec这两个值,导致可以进入到这里,造成注入。

    漏洞exp:

    /public/index.php/index/index/inc?name[0]=inc&name[1]=updatexml(1,concat(0x23,user(),0x7e),1)&name[2]=1

    网上说的漏洞版本: 5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 

     主要还是为了照顾一个朋友,所以写的细一点,自己也刚好记录一下。

  • 相关阅读:
    VS2012的恢复默认窗口的基本常用设置
    在 CentOS 6.4 上安装 CloudStack 4.2
    centos7上安装mysql
    myeclipse安装aptana插件
    访问WEB-INF下的JSP (转载)
    通过字节流复制大文件内容到指定的文件
    java 通过bufferedReader和bufferedWriter 拷贝文件
    Date类获取日期的方法失效的解决办法
    java中string 类型的对象间比较的学习笔记
    ubuntu下搭建nfs服务器
  • 原文地址:https://www.cnblogs.com/xiaozhiru/p/12512672.html
Copyright © 2011-2022 走看看