zoukankan      html  css  js  c++  java
  • Thinkphp 5.1.7 parseData缺陷导致insert/update注入 分析

    环境搭建

    $ composer create-project topthink/think thinkphp-5.1.7

    修改composer.json 5.1.* => 5.1.7

    $ composer update

    分析

    这个注入点与5.0.15的注入点位置都在parseData里,都是在解析set-data时直接将用户完全控制的data拼接到SQL语句中。

    下面来看漏洞点,首先根据Github的commit记录进行定位

    可以看到这里直接删除了default语句块,并直接删除了parseArrayData方法。

    我们下面通过搭建5.1.7环境,来看一下被删掉的语句在原版本中会有怎样的影响。首先看一下控制器

    这里获取一个username数组get变量,传给$username,然后作为字段'name'的值,插入test表。

    我们先请求一条测试url:

    127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=aaa&username[1]=bbb

    可以看到此时$username的值为{"aaa","bbb"}。

    下面在commit删除的部分下个断点,由于这个断点位于parseData()处,所以我们先从parseData开始跟。

    可以看到,这里将$data解析成键值对,由于$val是数组且不为空,进入了switch-default语句块,然后以用户可控的$val作为参数传入parseArrayData方法中。然后将获得的返回值放到$result数组中,最终返回$result数组。我们先跟进一下parseArrayData

    这里先把$data的前两个元素赋值给$type和$value。不过由于我们这个的第一个元素是aaa,因此没有进入第一个case。通过分析第一个case可以发现,这里直接将$value(即$data[1])、$data[2]、$data[3]拼接到了返回值$result中,因此我们把我们的username[0]的值改为point,然后再加一个username[2]。

    测试url:

    127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=point&username[1]=bbb&username[2]=ccc

    调试一下:

    可以看到这里直接将参数拼接进来。继续调试,看看最终形成的sql语句:

    返回页面:

    试一下报错注入payload:

    http://127.0.0.1/thinkphp/thinkphp_5.1.7/public/index.php/index/index/sqli?username[0]=point&username[1]=bbbb&username[2]=updatexml(1,concat(0x7e,user(),0x7e),1))--%20

    参考

    https://mochazz.github.io/2019/03/21/ThinkPHP5漏洞分析之SQL注入2/#漏洞分析

  • 相关阅读:
    软件工程实践2019第一次作业
    SDN第三次作业
    SDN第二次作业
    SDN第一次作业
    软工第二次结对
    #软件工程第三次作业
    2019软件工程第一次作业
    php-长文章分页函数
    Sqlilab靶机配置
    目录遍历(复现及修复)
  • 原文地址:https://www.cnblogs.com/litlife/p/11280133.html
Copyright © 2011-2022 走看看