天天看點

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

本篇文章首先是講解利用,之後會講解I函數為什麼能繞過過濾

前提是tp沒有用I函數去接收參數,具體原因會在分析之後給出

先給出測試的payload,​

​u[0]=exp&u[1]==%27admin%27​

​接下來我們去分析

首先看看我們index頁面,看看我們的語句

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

M就不必多說上一篇已經講過了,傳回一個users模型的對象,我們直接跟進​

​where​

​函數,看看接收的參數username為數組

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

因為是數組原因是以隻執行這一句指派傳回​

​$this​

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

接下來進入​

​find()​

​也就是我們的關鍵,繼續跟進

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

首先merge參數合并這不是我們關心的地方

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

​标量變量是指 int、float、string 或 bool 類型的變量。 array、object 和 resource 類型不是标量。​

​​我們的​

​username​

​是一個數組是以直接到下面,回到find,到最關鍵的地方了,準備生成sql語句了,繼續跟進

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

跟進

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

繼續跟進

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

這裡會傳回最終sql語句,因為隻有where,我們直接跟進​

​parseWhere​

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

别忘了我們傳入的參數

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

之後的一些非關鍵處理我們略過,繼續跟進

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

這裡進行拼接​

​$whereStr .= $key.' '.$val[1];​

​看到沒沒過濾,直接繞過了

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

最終​

​$whereStr​

​​為​

​username ='admin'​

​,也得到了最終的payload

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

是以,我們便可以有其他姿勢了,盲注什麼随便來,我們這裡測試一下報錯注入,沒毛病的

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp

接下來我們把接收參數改成I函數,他會對裡面參數做處理,會在前面加一個空格,​

​exp​

​​!=​

​exp​

ThinkPHP3.2不規範接收參數導緻的SQL注入分析之exp