一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

下面由thinkphp框架教程欄目給大家介紹一分鐘了解有關(guān)thinkphp框架的審計(分享),希望對需要的朋友有所幫助!

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

ThinkPHP簡介

ThinkPHP 是一個免費開源的,快速、簡單的面向對象的 輕量級PHP開發(fā)框架 ,創(chuàng)立于2006年初,遵循Apache2開源協(xié)議發(fā)布,是為了敏捷WEB應(yīng)用開發(fā)和簡化企業(yè)應(yīng)用開發(fā)而誕生的。ThinkPHP從誕生以來一直秉承簡潔實用的設(shè)計原則,在保持出色的性能和至簡的代碼的同時,也注重易用性。并且擁有眾多的原創(chuàng)功能和特性,在社區(qū)團(tuán)隊的積極參與下,在易用性、擴(kuò)展性和性能方面不斷優(yōu)化和改進(jìn),已經(jīng)成長為國內(nèi)最領(lǐng)先和最具影響力的WEB應(yīng)用開發(fā)框架,眾多的典型案例確??梢苑€(wěn)定用于商業(yè)以及門戶級的開發(fā)。

漏洞簡述

盡管ThinkPHP 5.0.x框架采用了參數(shù)化查詢方式,來操作數(shù)據(jù)庫,但是在?insert?和?update?方法中,傳入的參數(shù)可控,且無嚴(yán)格過濾,最終導(dǎo)致本次sql注入漏洞發(fā)生。

以ThinkPHP框架 5.0.x sql注入漏洞進(jìn)行分析

thinkphp官網(wǎng)下載5.0.15版本:?http://www.thinkphp.cn/down/1125.html?。搭建好數(shù)據(jù)庫,數(shù)據(jù)庫為tp,表名為user,其中有兩個字段id和username。

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

修改數(shù)據(jù)庫配置信息 application/database.php,在application/config.php 中打開調(diào)試和trace。

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

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

public??function?testsql() ????{ ????????$username?=?input('get.username/a'); ????????db('user')->where(['id'=>?1])->insert(['username'=>$username]); ????}

解釋如下:

http://127.0.0.1/thinkphp/? public/?????? ?index.php/?? index/?? index/?? index
?????? 域名?????? 網(wǎng)站目錄??? 對外訪問目錄??? 入口文件?????? 前臺???? 控制器??? 方法名

擴(kuò)展:

其中關(guān)于 updatexml 函數(shù)UPDATEXML (XML_document, XPath_String, new_value);

第一個參數(shù):XML_document是String格式,為XML文檔對象的名稱,文中為Doc

第二個參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網(wǎng)上查找教程。

第三個參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù)

作用:改變文檔中符合條件的節(jié)點的值

訪問payload,就可以觸發(fā)漏洞了。

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

漏洞分析

首先,我們知道?insert?方法存在漏洞,那就查看?insert?方法的具體實現(xiàn)。

通過input獲取到參數(shù)后,username變量情況如下:

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

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

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

然后執(zhí)行insert語句

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

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

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

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

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

可以看出$val是數(shù)組,且根據(jù)$val[0]值為inc,會通過switch語句進(jìn)入到’inc’:

此處的parseKey,即thinkphp/library/think/db/builder/mysql.php

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

此處并未對傳入的$key進(jìn)行更多的過濾與檢查,將其與前面經(jīng)過parseKey的結(jié)果進(jìn)行拼接后返回給result

至此注入成功。

漏洞修復(fù)

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

一分鐘了解有關(guān)ThinkPHP框架的審計(分享)

在進(jìn)行dec和inc操作之前對$val[1]的值進(jìn)行了再次確認(rèn)。

總結(jié)

第一次審計Thinkphp框架?? ,結(jié)合Thinkphp5.0手冊以及網(wǎng)上教程完成此次漏洞的審計。

相關(guān)推薦:最新的10個thinkphp視頻教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享