當前位置:
首頁 > 新聞 > 挖洞經驗 | 如何在一條UPDATE查詢中實現SQL注入

挖洞經驗 | 如何在一條UPDATE查詢中實現SQL注入

前段時間,我在對Synack漏洞平台上的一個待測試目標進行測試的過程中發現了一個非常有意思的SQL注入漏洞,所以我打算在這篇文章中好好給大家介紹一下這個有趣的漏洞。

這個漏洞在我提交了19個小時之後便得到了確認,並且漏洞獎金也打到了我的賬號里。


直奔主題

跟往常一樣,在喝完我最愛的果汁飲料之後,我會習慣性地登錄我的Synack賬號,然後選擇一個應用來進行滲透測試,此時我的「黑客之夜」便正式開始了。

我與很多其他的安全研究人員的習慣一樣,我會在待測試目標中隨機選擇測試點來載入我的XSS Payload(我通常會使用』」>

在測試的過程中,我的這個Payload讓其中一個測試點返回了一個「500 error」,錯誤信息提示為「系統遇到了一個SQL錯誤」,看到了這條錯誤信息之後,我瞬間就興奮起來了,因為憑我之前的經驗來看,這裡很有可能存在一個SQL注入漏洞。

根據系統返回的錯誤信息來看,錯誤內容就是我的「用戶全名(Full Name)」,所以我趕緊切回剛才的測試界面,然後用test

test再次進行了一次測試。

而此時系統返回的是與剛才一模一樣的錯誤內容,這也就意味著引起系統發生錯誤的「罪魁禍首」就是Payload中的那個單引號。

了解到這一關鍵信息之後,我意識到這個應用中所使用的SQL查詢語句並沒有對單引號進行轉義,所以我打算輸入兩個單引號來看看會發生什麼事。

所以我這一次輸入的是test」test,使我感到震驚的是,這一次系統並沒有提示任何的錯誤信息,但是我的用戶全名變成了test』test!

由於這個存在注入點的文本域是用來編輯用戶全名(FullName)的,所以我猜這個存在漏洞的查詢語句為UPDATE查詢。

於是我將我的全名改為了』+@@VERSION +』,然後重新載入頁面之後,我的用戶全名就變成了5.6,而不出意外的話,這個5.6代表的就是後台MySQL資料庫的版本號了。

需要注意的是,頁面發送的是JSON請求,所以這裡的「+」代表的並不是空格符(%20)。

隨後,我便將我目前為止發現的所有東西報告給了Synack的管理團隊,但是他們給我的回復是讓我去嘗試進一步利用這個漏洞並從資料庫中提取出數據。


並非一帆風順

但是僅僅通過這個SQL注入漏洞就想提取出我們想要的數據,似乎並非易事。

因為每當我嘗試提取出一個字元串數據時,系統返回的值都是0,因為MySQL中並不會使用「+」來連接兩個字元串(MySQL會嘗試將加號兩端的欄位值嘗試轉換為數字類型,如果轉換失敗則認為欄位值為0)。

如果這個測試對象使用的是SQL Server的話,那我就不用在這裡廢話了,因為我可以直接用「+」來連接兩個字元串。

比如說,我可以直接用』x"+@@VERSION + 『 x 『來把我的名字改為x5x(這裡的5是資料庫管理系統的版本號)。

但問題就在於這是一個MySQL資料庫,而在MySQL中「+」是用來對數字求和的,所以』x"+version()+』x"返回的是5.6,因為字元串轉換為整形數值之後值是0,所以這就相當於是0+5.6+0,即返回值為5.6。

這也就意味著,類似』x"+user()+』x"這樣的Payload其返回的值同樣是0,因為用戶的名字肯定也是一個字元串,而正如我之前所解釋的那樣,加號「+」只能用來對數字進行求和。

這樣一來,如果我們想要從這個資料庫中提取出字元串的值,那麼唯一有可能的方法就是將其轉換成數字再進行提取了,於是我決定使用ASCII()函數先將字元串轉換為其對應的ASCII碼數值,然後將這些值提取出來之後再把它們轉換為明文信息。比如說:


『+ length(user()) # –> 獲取待轉換字元串的長度

『+ ASCII(substr(user(),1)) # –>獲取待轉換字元串的第一個字元

『+ ASCII(substr(user(),2)) # –>獲取待轉換字元串的第二個字元

『+ ASCII(substr(user(),3)) # –>獲取待轉換字元串的第三個字元

等等等等,以此類推…

但是問題又來了,因為我要不停地使用substr()函數來截取字元串中的每一個字元,然後將它們轉換為相應的ASCII值,然後再將它們轉換回字元串的明文形式,這一切如果全部通過手動操作來實現的話,就完全不符合我們黑客的「人生觀」了。

因此,我打算寫一個簡單的Python腳本來自動提取並轉換這些字元串。腳本代碼點擊閱讀原文可見。

那麼在這個腳本的幫助下,我只需要修改代碼中「column」、「table」以及「orderby」變數的值,我就可以輕而易舉地從這個資料庫中提取出任何我想要的數據了。

下面這張截圖顯示的是用戶當前可以訪問到的資料庫信息:

再對代碼進行一些簡單的修改,我就可以使用ASCII(substr(concat(email_address,0x3a,password),i)))來提取出用戶的郵箱地址以及登錄密碼了。修改後的代碼如下:


腳本的運行結果如下所示:


漏洞時間軸


- 14/2/2017 10:25 PM –> 首次提交漏洞報告

- 14/2/2017 11:02 PM –> Synack OPs團隊讓我嘗試進一步利用漏洞並提取數據

- 14/2/2017 3:00 PM –> 提交Python腳本和漏洞PoC

- 15/2/2017 10:22 AM –> 提交了更多漏洞參數信息

- 15/2/2017 3:28 PM –> 得到了豐厚的漏洞獎金

- 15/2/2017 10:18 PM –> 漏洞被修復


* 參考來源:

zombiehelp54

, FB小編Alpha_h4ck編譯,轉載請註明來自

FreeBuf.COM


您的贊是小編持續努力的最大動力,動動手指贊一下吧!


本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

KindEditor開源富文本編輯框架XSS漏洞
扒一扒這兩天有關阿里雲經典網路安全性的爭論
樂天中國官網疑似遭遇黑客攻擊,至今無法訪問

TAG:FreeBuf |

您可能感興趣

RED_HAWK:基於PHP實現的信息收集與SQL注入漏洞掃描工具
SQLiv:一款批量SQL注入漏洞扫描工具
ThinkPHP5 SQL注入漏洞&PDO真/偽預處理分析
Teva x BEDWIN & THE HEARTBREAKERS 日系成熟風注入
新曝WordPress REST API內容注入漏洞詳解
通過APC實現Dll注入——繞過Sysmon監控
新型「無文件」 + 代碼注入勒索軟體SOREBRECT現江湖
WordPress又曝漏洞:REST API由於許可權控制失效致內容注入
Onitsuka Tiger鬼塚虎「TIGER CORSAIR」復刻系列,為當下潮搭注入經典之魂!
這回是三方聯名?OFF-WHITE x NIKE「THE TEN」系列注入芝加哥公牛隊球衣?!
ASP.NET Core MVC 控制器創建與依賴注入
又一個ALL IN AI,全球最大資料庫提供商將AI注入雲
百搭經典T-Shirt匠心製造,ENTRY SG注入百年特殊技藝
注入自然魔力的花之語BODY WASH
如何使用加密的Payload來識別並利用SQL注入漏洞
Hibernate HQL注入攻擊入門
COMPUTEX 2017:電競逆勢崛起 與VR聯手為PC產業注入新動能
注入新資金 HPE為「The Machine」制定發展藍圖
如何使用加密的Payload來識別並利用SQL注入漏洞?