php框架审计,关于ThinkPHP框架的审计

下面由thinkphp框架教程栏目给大家介绍有关ThinkPHP框架的审计,希望对需要的朋友有所帮助!

189c83070bf46ec6fa0a6571c4d6377f.png

ThinkPHP简介

ThinkPHP是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

漏洞简述

尽管ThinkPHP 5.0.x框架采用了参数化查询方式,来操作数据库,但是在 insert 和 update 方法中,传入的参数可控,且无严格过滤,最终导致本次SQL注入漏洞发生。

以ThinkPHP框架 5.0.x sql注入漏洞进行分析

thinkphp官网下载5.0.15版本:http://www.thinkphp.cn/down/1125.html 。搭建好数据库,数据库为tp,表名为user,其中有两个字段id和username。

92579e4c5c2295da1656e31802a65958.png

修改数据库配置信息 application/database.php,在application/config.php 中打开调试和trace。

c999a87891ff1b1a1f12d08b23e8aaef.png

a8a40fdebd9b3ff37df17288edb947ec.png

在 application/index/controller/Index.php 中Index类中添加方法:

public function testsql()

{

$username = input('get.username/a');

db('user')->where(['id'=> 1])->insert(['username'=>$username]);

}

我们本次的 payload 为:http://127.0.0.1/thinkphp5.0.15/public/index.php/index/index/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1

解释如下:http://127.0.0.1/thinkphp/ public/ index.php/ index/ index/ index

域名 网站目录 对外访问目录 入口文件 前台 控制器 方法名

扩展:

其中关于 updatexml 函数UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

访问payload,就可以触发漏洞了。

1a88176755f7697389fdc7a9f58f03f5.png

漏洞分析

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

通过input获取到参数后,username变量情况如下:

c75925761795d4fb3666f640729b732c.png

跟入insert,thinkphp/library/think/db/Query.php

d69d2084b21a6ae5c11effc4fae47071.png

然后执行insert语句$sql = $this->builder->insert($data, $options, $replace);

跟入 thinkphp/library/think/db/Builder.php

d23894e45cd321413ca38d42523473bd.png

跟入parseData至 thinkphp/library/think/db/Builder.php

cfc0f2e39283e799f631707e7ec12f6a.png

可以看出$val是数组,且根据$val[0]值为inc,会通过switch语句进入到’inc’:

此处的parseKey,即thinkphp/library/think/db/builder/Mysql.php

97fa0d4c9aa7b058185043f4a2b99fb7.png

此处并未对传入的$key进行更多的过滤与检查,将其与前面经过parseKey的结果进行拼接后返回给result

至此注入成功。

漏洞修复

https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b

fe96beb8967d4f2a35773d458a16eeb5.png

在进行dec和inc操作之前对$val[1]的值进行了再次确认。

总结

第一次审计Thinkphp框架 ,结合Thinkphp5.0手册以及网上教程完成此次漏洞的审计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值