Thinkphp 5.0.15 設計缺陷導致Insert/update-SQL注入 分析


分析

與上一個漏洞類似,這個也是前端可以傳入一個數組變量,如['exp','123','123'],后端根據array[0]來將array[1]和array[2]直接拼接到SQL語句中。

由於TP只是框架,為了保證應用業務正常運行,不能為主應用做過多的安全防御(如轉義、去除危險字符等)。

上一個漏洞點存在於處理where語句的parseWhere()處,而這個點則在處理insert和set的data的parseData()處。

本文以insert為例,首先payload如下:

http://127.0.0.1/thinkphp/thinkphp_5.0.15_full/public/index.php/index/index/sqli?username[0]=inc&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1

15行,以數組的格式獲取$_GET中的username變量,然后作為參數傳入insert(),跟進一下

parseExpress在這里主要就是把表名放到$options['table']中,用於后面拼裝SQL語句。$data在這里就是['name'=>$_GET['username']]。

到2085行,跟進insert函數,這個函數用來拼接整條SQL語句

首先調用parseData()來解析$data,跟進一下

這里經過101行的foreach,在119行將我們的payload拼接到了$result[$item]中,繼續往下看

這里直接返回了$result。回到insert(),在728行將parseData()返回的$data拼接到整條SQL語句中,最后返回完整的SQL語句。

回到最外層的insert()

2094行直接執行了insert()返回的SQL語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM