Myql SLEEP函數和SQL注入

2020-12-11 蟲蟲搜奇

緣起

如果你審查過的慢查詢日誌或者網站access日誌中,你可能都會看到如下的語句:

可能就是你網站啟用後大概1小時候內就收到的日誌,或者你Web伺服器(nginx)訪問中看到的。如果你是在Mysql慢查詢日誌中或者access日誌中看到,並且該跳請求返回的狀態碼為200,而不是404,那麼恭喜你可能中標了,被人Sql攻擊了。本文蟲蟲就和大家以sleep()函數為介入來討論。

SLEEP()函數

SLEEP(n),暫停資料庫n秒。

不要混淆MySQL控制臺中的sleep狀態,它描述了連接的狀態,SLEEP()函數做了一件事,就是暫停資料庫的執行,直到設定的時間。那麼該操作有什麼用?為什麼要用它呢?

通常,有一些操作需要一段時間來操作,操作時候需要暫時操作或者更新(比如數據鎖,比如記錄一個Pos點後,備份一個從庫),當然也有可能是黑客攻擊。

漏洞滲透和掃描

如果你的資料庫和網站沒有做安全措施,直接把埠暴露在公網上(比如ssh 22埠,mysql 3306埠),那麼,很快就會能有掃描器對你的埠進行掃描滲透。所以蟲蟲以也提到過在主機防護中的條款:禁止把埠暴露在公網;修改常用埠。專門對於mysql,最常用的掃描滲透和安全審計工具是sqlmap。

sqlmap是使用Python編寫的一款資料庫sql注入掃描工具,目前支持常見的mysql、oracel、postgresql、sql server,access,db2,sqlite等數據的安全漏洞(sql注入)。

在sqlmap盲主掃描中,通常會Fuzzy各種sql語句,通常還會使用sleep命令。比如掃描那些使用舊的mysql或mysqli等非PDO的連接PHP MySQL網站,然後枚舉易受攻擊的AJAX命令列表或GET/POST結果,在輸出掃描結果時候的通常需要中止執行。

sqlmap及同類工具可以並行攻擊幾十個站點,通過對這些網站強制資料庫sleep一段時間(數字設定取決於個人經驗),通過計數sleep的時間,來測試滲透命令中的有效性,這在安全界通常叫基於時間的盲注。

快速解剖

在本文開頭,我們舉了一個sql語句的例子,這是常用的盲注的典型語句。如果執行SELECT語句,其中的條件語句部分被替換為類似以下的內容,那麼它將絕對鎖定資料庫:

注意該語句巧妙地使用各種運算符和分隔符。注意該語句,對只對拼寫sql語句的程序有用,使用PDO該語句可以被過濾,不能執行的 。

PHP mysql注入示例

讓我們寫一個php的示例,來說問題。看以下函數:

上面的示例中,我們使用implode()函數生成以逗號分隔的ID列表。由於對輸入沒有任何驗證,傳入的數組中,可能是非法的具有SLEEP的命令或者dump 資料庫表中的數據到展示頁面。針對這種問題,你需要使用對傳入的數據做驗證,驗證長度(根據實際需要限制參數長度,可以極大防止注入的成功)。

你可以使用PDO等連結框架,利用佔位符代替(綁定)參數生成sql語句,並通過prepare做參數驗,這樣可以阻止絕大多數的SQL注入的值。

PDO並非靈丹妙藥

上面我們也說通過PDO可以預防絕大多數的PHP Sql注入問題,但是他不是100%保證能解決所有問題。

如前所述,自己拼湊Sql的原始動態組合方法,讓很多PHP系統處於危險之中

所以,一無所措的碼農們不可避免地會通過谷歌尋求幫助他們:

上面是網上一個很流行的PDO使用教程之一,該代碼使用PDO,但是和純的手動拼湊Sql的並沒有什麼兩樣,也是非常危險的做法。

還有如下StackOverflow(一個知名的編程問答網站)上的的一個答案:

看到了麼,這也是很糟糕的代碼,但是還被接受了。在碼農們接受的概念是"使用PDO可以防止sql注入",但是他們不知道PDO防止注入也是有前提的,那就是必須是用"?佔位符綁定寫SQL,然後prepare,然後execute",否則等於沒有用。

不要小看sleep()

可能你覺得發現sleep()執行,並沒有什麼的?起碼不會DROP你的資料庫。SLEEP()很容易識別,並且在該階段通常幾乎沒有啥害。但是通過,可以在通過盲注Fuzz測試數據執行大量的查詢,並很快就找到有效的攻擊EXP。

實際上,這就死sqlmap的核心功能。這種思路的一個問題是,在依賴於MySQL for UX/UI的生產Web項目中,通常的做法是將代碼執行用戶限制為僅具有SELECT權限,不給他DROP權限。但是SLEEP()使用只需SELECT權限。

SLEEP怎麼禁止?

因為SLEEP函數的使用只需要SELECT,不需要任何特權權。並且可以作為"最安全的"MySQL命令執行。

它只是一個SQL注入漏洞,無法使用定時攻擊暫停資料庫執行或瀏覽數據(或對其進行dump)。而且一般通過簡單的配置無法禁用SLEEP函數。MySQL可以在資料庫,表和列級別做權限限制。當然如果能有辦法簡單這頂對某些危險函數的禁止也是有意義的(比如php.ini中的disable_functions配置)。

實際上sleep也給了我們一種防禦思路,基於對該函數關鍵字的探測來實現sql攻擊告警和防禦。比如蟲蟲自研了一款web防火牆App-Waf(github:/ bollwarm/App-Waf)就是基於這樣的探測原理,通過分析訪問日誌中的關鍵詞,其中就包括了sleep函數,下面是我用的關鍵字規則(部分)。

本文中蟲蟲和大家一起以Mysql的sleep()函數為介入討論了Sql注入的問題,總體上來說可以使用sleep()來枚舉SQL漏洞,PDO綁定參數的方法擦可以防禦Sql注入,sleep()一般無害,而且不會正常情況下很少用的到,但是可以變廢為寶用他來做為探測攻擊的手段。

關於更多的安全和Sql注入的問題關注蟲蟲,蟲蟲會撰寫文章和大家一起學習。

相關焦點

  • SQL注入常規Fuzz全記錄
    前言本篇文章是在做ctf bugku的一道sql 盲注的題(題目地址:注入題目)中運用了fuzz的思路,完整記錄整個fuzz的過程
  • SQL 注入常規 Fuzz 全記錄
    盲注的題中運用了fuzz的思路,完整記錄整個fuzz的過程,給師傅們當點心,方便大家加深對web sql注入 fuzz的理解。2、嘗試輸入admin/123456,提示密碼錯誤,因此可以確定存在用戶admin,這裡可能會有師傅要爆破了,但這裡題目要求sql注入,我們就按照預期解來吧。
  • SQL注入的幾種類型和原理
    正則表達式匹配like():select user() like 'ro%' ,和regexp 類似substr()和ascii():ascii(substr((select(database()),1,1))=98ord()和mid() : ord(mid((select user()),1,1))=114幾個函數沒什麼好說,都是對字符串操作的函數
  • SQL注入攻擊詳解
    本文將帶你從介紹 Web 應用運行原理開始,一步一步理解 Sql 注入的由來、原理和攻擊方式。注入可以藉助資料庫的存儲過程進行提權等操作4、判斷Sql注入點4.1 判斷是否存在sql注入漏洞通常情況下,可能存在 Sql 注入漏洞的 Url 是類似這種形式 :http://xxx.xxx.xxx/abcd.php?id=XX對 Sql 注入的判斷,主要有兩個方面:判斷該帶參數的 Url 是否存在 Sql 注入?
  • SQL 注入攻防入門詳解
    true : false;}方法中userName和 password 是沒有經過任何處理,直接拿前端傳入的數據,這樣拼接的SQL會存在注入漏洞。把危險的和不必要的存儲過程刪除xp_:擴展存儲過程的前綴,SQL注入攻擊得手之後,攻擊者往往會通過執行xp_cmdshell之類的擴展存儲過程,獲取系統信息,甚至控制、破壞系統。
  • 淺談開啟magic_quote_gpc後的sql注入攻擊與防範
    開啟magic_quote_gpc=on之後,能實現addslshes()和stripslashes()這兩個函數的功能。前提是,當參數為數字型的時候,且未經過Intval()函數的處理,因為經過intval()的處理之後,所有的數據就都會強制轉換成數字。前面已經提到過,開啟magic_quote_gpc=on之後,相當於使用addslshes()這個函數。但是數字型沒有用到單引號,所以理所當然的繞過了addslshes()函數的轉換了。
  • 徹底幹掉噁心的 SQL 注入漏洞, 一網打盡!
    佔位符)和PreparedStatement,如// use ? to bind variablesString sql = "SELECT * FROM users WHERE name= ? 這裡需要注意的是,使用了PreparedStatement 並不意味著不會產生注入,如果在使用PreparedStatement之前,存在拆分sql語句,那麼仍然會導致注入,如// 拼接 sqlString sql = "SELECT *
  • desc巧用及反引號 ` SQL注入——【61dctf】 inject writeup
    $_GET['table']:"test";$table = Filter($table);mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();$sql = "select 'flag{xxx}' from secret_{$table}";$ret = sql_query($sql);echo $ret[0];?
  • Java web安全黑客攻防之sql注入
    1.什麼是sql注入sql注入通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL命令通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL
  • 特殊場景的sql注入思路
    上一篇介紹了sql注入的基礎知識以及手動注入方法,但是在實際的環境中往往不會像靶場中那樣簡單。今天我就來為大家介紹一種特殊場景的sql注入思路。用戶名與密碼分開驗證的情況第一個場景我們以We Chall平臺的Training: MySQL II 一題為例。
  • web安全之SQL注入(16)——delete和like注入
    delete from users where id=14 一般情況是網站後臺的sql語句,當我們測試刪除功能是否存在注入時,一定你要是用and測試,不要使用or測試。當使用or進行測試,跟一個布爾假值,這時如果前面的條件為真,你使用or跟一個假值,只會刪除一條數據,這裡問題不大,繼續測試
  • 開窗函數之累積和,PySpark,Pandas和SQL版實現
    ,想更多了解開窗(窗口)函數,可以看看那篇文章。今天主要是結合Pandas, Koalas和PySpark來介紹下開窗函數的累積和。測試環境Jupyter NotebookiPython-sqlPySpark 3.0KoalasPandas名詞解釋累積和(Cumulative Sum,CUSUM)是一種序貫分析法,由劍橋大學的 E. S. Page 於1954年首先提出。
  • SQL Server應用程式的高級Sql注入
    [概 要] 這篇文章討論常用的"sql注入"技術的細節,應用於流行的Ms IIS/ASP/SQL-Server平臺。這裡探討有關這種攻擊各種可以注入程序訪問數據和資料庫防範的方法。SQL語句可以修改資料庫的結構(用數據定義語言"DDL")和操作資料庫裡的數據(用數據操作語言"DML")。我們在這裡著重討論Transact-SQL(交互式SQL),應用於SQL-Server的SQL一種方言(非標準SQL)。如果攻擊者可以插一系列的SQL語句進入應用程式的數據查詢時,Sql注入攻擊就可能發生。
  • SQL注入、XSS以及CSRF分別是什麼?
    什麼是SQL注入、XSS和CSRF?本篇文章就來帶大家了解一下SQL注入、XSS和CSRF,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。SQL注入SQL注入是屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據(比如用戶敏感數據)隔離,在讀取數據的時候,錯誤的將數據作為代碼的一部分執行而導致的。典型的例子就是當對SQL語句進行字符串拼接的時候,直接使用未轉義的用戶輸入內容作為變量。
  • Python sleep()函數用法:線程睡眠
    位於 time 模塊中的 sleep(secs) 函數,可以實現令當前執行的線程暫停 secs 秒後再繼續執行。
  • MySQL 注入攻擊與防禦
    加微信群回復公眾號:微信群;QQ群:16004488加微信群或QQ群可免費索取:學習教程注入常用函數與字符下面幾點是注入中經常會用到的語句控制語句操作(select, case, if(), ...)其中BENCHMARK函數是指執行某函數的次數,次數多時能夠達到與sleep函數相同的效果文件操作文件操作權限在MySQL中,存在一個稱為secure_file_priv的全局系統變量
  • 在MSSQL注入中學到的新姿勢
    通過查詢SQL Server官方手冊,然後自己利用其它函數的組合,實現了一個新的字符串截取方法。0x02 注入由於該注入點已經修復,所以無法復現,就簡單複述一下前期的測試過程。/t-sql/functions/charindex-transact-sql?
  • 使用exp進行SQL報錯注入 - 51CTO.COM
    當我們拿到MySQL裡的函數時,作者比較感興趣的是其中的數學函數,它們也應該包含一些數據類型來保存數值。所以作者就跑去測試看哪些函數會出現溢出錯誤。然後作者發現,當傳遞一個大於709的值時,函數exp()就會引起一個溢出錯誤。
  • 技術分享 | MySQL 注入攻擊與防禦
    ,文章如果有錯也歡迎各位dalao指出:)注入常用函數與字符下面幾點是注入中經常會用到的語句控制語句操作(select, case, if(), ...)其中BENCHMARK函數是指執行某函數的次數,次數多時能夠達到與sleep函數相同的效果文件操作文件操作權限在MySQL中,存在一個稱為secure_file_priv的全局系統變量
  • SQLServer應用程式中的高級SQL注入
    SQL語言可以修改資料庫結構(數據定義語言)和操作資料庫內容(數據操作語言)。在這份文檔中,我們將特別討論SQLSERVER所使用的Transact-SQL語言。當一個攻擊者能夠通過往query中插入一系列的sql語句來操作數據寫入到應用程式中去,我們管這種方法定義成SQL注入。