Thinkphp 5.1.7 parseData缺陷致使insert/update注入 分析

[TOC]php

環境搭建

$ composer create-project topthink/think thinkphp-5.1.7html

修改composer.json 5.1.* => 5.1.7git

$ composer updategithub

分析

這個注入點與5.0.15的注入點位置都在parseData裏,都是在解析set-data時直接將用戶徹底控制的data拼接到SQL語句中。sql

下面來看漏洞點,首先根據Github的commit記錄進行定位thinkphp

能夠看到這裏直接刪除了default語句塊,並直接刪除了parseArrayData方法。json

咱們下面經過搭建5.1.7環境,來看一下被刪掉的語句在原版本中會有怎樣的影響。首先看一下控制器數組

這裏獲取一個username數組get變量,傳給$username,而後做爲字段'name'的值,插入test表。composer

咱們先請求一條測試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%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E4%B9%8BSQL%E6%B3%A8%E5%85%A52/#%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90

原文出處:https://www.cnblogs.com/litlife/p/11280133.html

相關文章
相關標籤/搜索