中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

floor()報錯注入的原因是什么

發布時間:2022-01-04 09:53:07 來源:億速云 閱讀:144 作者:小新 欄目:網絡管理

小編給大家分享一下floor()報錯注入的原因是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

0x01 簡述

floor報錯注入也有叫group報錯注入的,都一樣,指的都是他們。floor報錯注入我想大多數人跟我一樣,都是會用而不明白其中的原理。

0x02 環境

介紹下我的測試環境:

MySQL版本:5.5.53

使用的數據庫:security.users,這數據庫是sqli-labs的,大家都很熟悉。

0x03 搞起

floor()報錯注入的原因是什么

咱就直接拋出常用的報錯語句了,語句的利用格式相對固定,咱們一點一點的拆解,一點一點說。

select count(*) from users group by concat(database(),floor(rand(0)*2));

select count(*),concat(database(),floor(rand(0)*2)) as x from users group by x;

floor()報錯注入的原因是什么

它們表達的意思是一樣的,第一個中的as x其實就是concat(database(),floor(rand(0)*2))的代指(別名),這兩個SQL語句表達的意思并沒什么區別。

來,讓我們瞅瞅它報了什么錯:

ERROR 1062 (23000): Duplicate entry 'security1' for key 'group_key'

它說'group_key'的主鍵'security1'重復了,嗯?'security1'從哪里來的?哪個表的主鍵重復了?

floor()報錯注入的原因是什么

雖然剛開始,咱們還不知道原理,但是可以看到報錯提示語句中的數據庫函數已經被執行了。

就像我之前說的那樣,我本身有用到sqli-labs的數據庫,所以database()執行后是'security'很正常吧。

0x04 floor(rand(0)*2)

'security1'中的1便是來自floor(rand(0)*2),它說'security1'重復,那說明之前的表中已經有這個主鍵了。因為database()固定,我們繼續來看下產生'1'的這個floor(rand(0)*2)

rand()同樣是一個數學函數,它返回一個隨機浮點值[0,1]

floor()報錯注入的原因是什么

若指定一個整數參數N,則它被作用種子值(也被叫為隨機因子),(rand()會根據這個種子值隨機生成)用來產生重復序列,也就是rand(0)的值重復計算是固定的。

floor()報錯注入的原因是什么

而它后面的*2,則是選定獲取數據的范圍[0,2],其實就是乘以2。

floor()報錯注入的原因是什么

floor()同樣是一個數學函數,返回不大于x的最大整數值,比如floor(3.3)返回3,floor(-3.3)返回-4。

floor()報錯注入的原因是什么

現在讓我們看下計算users表數據的次數,floor(rand(0)*2)的值。

floor()報錯注入的原因是什么

可以看到rand(0)的值確實是固定的。同時1也出現了。

concat()是字符串拼接函數,拼接多個字符串,如果字符串中含有NULL,則返回結果為NULL。這樣來看,concat后的結果為'security0'或'security1','security1'出現了。

分析到這,我們后半部分沒什么好說的了,rand()還有一個非常重要的特性我們之后跟group by一起說。

0x05 group by 與 count(*)

咱們再來說這個count(*),這是一個聚合函數,返回值的數目,它與count()的區別是它不排除NULL。

咱們通過select count(*) from users group by username;這個查詢語句來了解下group by的工作過程。

floor()報錯注入的原因是什么floor()報錯注入的原因是什么

group by在執行時,會依次取出查詢表中的記錄并創建一個臨時表,group by的對象便是該臨時表的主鍵。如果臨時表中已經存在該主鍵,則將值加1,如果不存在,則將該主鍵插入到臨時表中,注意是插入!

查詢前創建的空臨時表。

floor()報錯注入的原因是什么

取第一條記錄,username是Dumb,發現臨時表中沒有該主鍵,則將Dumb插入到主鍵,count(*)值計1,取第二條記錄。

floor()報錯注入的原因是什么

同樣,取第二條記錄,username為Angelina,同樣沒有該主鍵,則將Angelina插入到主鍵,count(*)值計1。

floor()報錯注入的原因是什么

當取到原表中第8條admin時,同樣將admin作為主鍵插入到臨時表中,并將count(*)計1.當取第15條數據時,發現臨時表中已經有admin作為主鍵了,則直接count(*)加1。最終結果:

floor()報錯注入的原因是什么

floor()報錯注入的原因是什么

雖然在命令行中的顯示結果跟咱的不太一樣,但是思路是正確的(它貌似對結果按照字母進行了排序,又或者在插入臨時表前就先進行了排序)。

寫到這里,那按照上面的邏輯,報錯語句應該是 select count(*) from users group by 'security0'或'security1'; 啊?!然后group by時創建臨時表,第一個是security0,發現沒有這個主鍵,此時將security0插入主鍵的位置,計1,然后取from表中的下一條記錄。

floor()報錯注入的原因是什么

下一條是group by 'security1',臨時表中不存在security1的主鍵,則將security1插入主鍵位置,計1,然后取下一條記錄。

floor()報錯注入的原因是什么

之后group by 只有security0或security1,那應該只是計數上的變化了啊。最終應該是:

floor()報錯注入的原因是什么

那為什么不是這個結果,反而報了主鍵重復的錯誤了呢?

因為還有一個最重要的特性,就是group by與rand()使用時,如果臨時表中沒有該主鍵,則在插入前rand()會再計算一次(也就是兩次,但有些博客寫的是多次,這個多次到底是幾次并不知道,但是以兩次來理解下面的實驗都能說的通)。就是這個特性導致了主鍵重復并報錯。我們來看:

當group by 取第一條from 表記錄時,此時group by的是'security0',發現臨時表中并沒有'security0'的主鍵,注意,這個時候rand(0)*2會再計算一次,經floor()后,率先插入臨時表的主鍵不是security0,而是security1,并計數1。

floor()報錯注入的原因是什么

然后取第二條記錄,第二條記錄group by 的key中的01仍由floor(rand(0)*2)繼續計算獲得,也就是security1。此時臨時表中已經有security1的主鍵了,所以count(*)直接加1就可以。

floor()報錯注入的原因是什么

繼續從from的表中取第三條記錄,再次計算floor(rand(0)*2),結果為0,與database()拼接為security0,臨時表的主鍵中并不存在,在插入前,floor(rand(0)*2)又計算一次,拼接后與secruity1,但是是直接插入,即使臨時表中已經有了主鍵security1也硬要插入,從而導致主鍵重復報錯,也就是:ERROR 1062 (23000): Duplicate entry 'security1' for key 'group_key'。

寫道這里報錯的原理已經說完了,不知道大家跟我呼應上了沒,有沒有感受到我的倔強及小宇宙。

0x06 優化

咱們繼續看,咱們共從from的表中取了三條記錄,因為floor(rand(0)*2)的值為011011...,但其實第三次計算的1可以不要的,如果某個floor(rand(x)*2)滿足0101或1010,那么from的表中兩條數據就是可以報錯的。我經過多次實驗,發現floor(rand(14)*2)的值為101000...,那么咱們創建一個有兩條數據的表試一下看看。

floor()報錯注入的原因是什么

創建一個test表,里面只有兩條數據。

floor()報錯注入的原因是什么

分別用rand(0)*2和rand(14)*2做實驗。

floor()報錯注入的原因是什么

也就是說,在測試過程中,其實使用rand(14)*2更好一丟丟。如果from的表中只有一條數據的話floor()報錯注入就沒法用了,畢竟是重復,只插入一條數據怎么主鍵重復,對吧。

0x07 總結

最后一句話總結下:floor()報錯注入的原因是group by在向臨時表插入數據時,由于rand()多次計算導致插入臨時表時主鍵重復,從而報錯,又因為報錯前concat()中的SQL語句或函數被執行,所以該語句報錯且被拋出的主鍵是SQL語句或函數執行后的結果。

以上是“floor()報錯注入的原因是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正蓝旗| 邵阳县| 黔西县| 阿拉善盟| 若尔盖县| 乐都县| 钦州市| 兰考县| 宜黄县| 克拉玛依市| 杭州市| 阿拉善左旗| 新平| 南陵县| 健康| 吉林市| 镇远县| 昔阳县| 昌邑市| 黑河市| 九江县| 清远市| 普格县| 黄大仙区| 桃园市| 乐都县| 大邑县| 策勒县| 永清县| 天祝| 昭觉县| 峨眉山市| 怀远县| 西城区| 扎囊县| 上栗县| 隆昌县| 武清区| 普兰店市| 杂多县| 尤溪县|