下面由thinkphp框架教程欄目給大家介紹有關(guān)thinkphp框架的審計(jì),希望對(duì)需要的朋友有所幫助!
ThinkPHP簡(jiǎn)介
ThinkPHP 是一個(gè)免費(fèi)開(kāi)源的,快速、簡(jiǎn)單的面向對(duì)象的 輕量級(jí)PHP開(kāi)發(fā)框架 ,創(chuàng)立于2006年初,遵循Apache2開(kāi)源協(xié)議發(fā)布,是為了敏捷WEB應(yīng)用開(kāi)發(fā)和簡(jiǎn)化企業(yè)應(yīng)用開(kāi)發(fā)而誕生的。ThinkPHP從誕生以來(lái)一直秉承簡(jiǎn)潔實(shí)用的設(shè)計(jì)原則,在保持出色的性能和至簡(jiǎn)的代碼的同時(shí),也注重易用性。并且擁有眾多的原創(chuàng)功能和特性,在社區(qū)團(tuán)隊(duì)的積極參與下,在易用性、擴(kuò)展性和性能方面不斷優(yōu)化和改進(jìn),已經(jīng)成長(zhǎng)為國(guó)內(nèi)最領(lǐng)先和最具影響力的WEB應(yīng)用開(kāi)發(fā)框架,眾多的典型案例確??梢苑€(wěn)定用于商業(yè)以及門(mén)戶級(jí)的開(kāi)發(fā)。
漏洞簡(jiǎn)述
盡管ThinkPHP 5.0.x框架采用了參數(shù)化查詢方式,來(lái)操作數(shù)據(jù)庫(kù),但是在?insert?和?update?方法中,傳入的參數(shù)可控,且無(wú)嚴(yán)格過(guò)濾,最終導(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ù)庫(kù),數(shù)據(jù)庫(kù)為tp,表名為user,其中有兩個(gè)字段id和username。
修改數(shù)據(jù)庫(kù)配置信息 application/database.php,在application/config.php 中打開(kāi)調(diào)試和trace。
在 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 ??????? 域名???????網(wǎng)站目錄????對(duì)外訪問(wèn)目錄????入口文件???????前臺(tái)?????控制器????方法名
擴(kuò)展:
其中關(guān)于 updatexml 函數(shù)UPDATEXML (XML_document, XPath_String, new_value);
第一個(gè)參數(shù):XML_document是String格式,為XML文檔對(duì)象的名稱,文中為Doc
第二個(gè)參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語(yǔ)法,可以在網(wǎng)上查找教程。
第三個(gè)參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù)
作用:改變文檔中符合條件的節(jié)點(diǎn)的值
訪問(wèn)payload,就可以觸發(fā)漏洞了。
漏洞分析
首先,我們知道?insert?方法存在漏洞,那就查看?insert?方法的具體實(shí)現(xiàn)。
通過(guò)input獲取到參數(shù)后,username變量情況如下:
跟入insert,thinkphp/library/think/db/Query.php
然后執(zhí)行insert語(yǔ)句
$sql?=?$this->builder->insert($data,?$options,?$replace);
跟入 thinkphp/library/think/db/Builder.php
跟入parseData至 thinkphp/library/think/db/Builder.php
可以看出$val是數(shù)組,且根據(jù)$val[0]值為inc,會(huì)通過(guò)switch語(yǔ)句進(jìn)入到’inc’:
此處的parseKey,即thinkphp/library/think/db/builder/mysql.php
此處并未對(duì)傳入的$key進(jìn)行更多的過(guò)濾與檢查,將其與前面經(jīng)過(guò)parseKey的結(jié)果進(jìn)行拼接后返回給result
至此注入成功。
漏洞修復(fù)
?https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b
在進(jìn)行dec和inc操作之前對(duì)$val[1]的值進(jìn)行了再次確認(rèn)。
總結(jié)
第一次審計(jì)Thinkphp框架?? ,結(jié)合Thinkphp5.0手冊(cè)以及網(wǎng)上教程完成此次漏洞的審計(jì)。