[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:
原文出處:https://www.cnblogs.com/litlife/p/11280133.html