SQL注入 floor 報錯注入

2021-09-22 02:01:16 字數 1683 閱讀 2479

基礎知識:

floor(): 去除小數部分

rand(): 產生隨機數

rand(x): 每個x對應乙個固定的值,但是如果連續執行多次值會變化,不過也是可**的

floor報錯payload:

and select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)

原理:第一眼看起來有些懵逼,我們來從最基本的入手,最後在分析這個語句首先是floor()報錯產生的條件:select count(*) ,floor(rand(0)*2)x from security.users group by x(自定義資料庫的一張表)這裡解釋一下x是什麼意思,可能有些同學不太熟悉sql語句,floor(rand(0)*2)x的x是為floor(rand(0)*2)新增了乙個別名,就是x就等於floor(rand(0)*2),這樣做的目的是讓group by 和 floor(rand(0)*2)相遇(請原諒我這麼解釋).

這個payload的重點在group by a,也就是group by floor(rand(0)2)。首先,floor(rand(0)2)的意思是隨機產生0或1。雖說是隨機,但是它是有規律可循的。看看上面解釋的rand(x),對於rand(0)而言,雖說是隨機數,但是它的值與執行rand(0)的次數是意義對應的,即每一次執行rand(0)得到的結果都是固定的。基本是011011…這個序列。

那它為什麼會報錯呢?先來解釋一下count(*)與group by是如何共同工作的。首先,系統會建立乙個虛擬表:

好了,現在group by原理講完了。那究竟是如何將其與floor聯合起來,進行floor報錯呢?

先來回顧一下payload: select count(), floor(rand(0)2) as a from information_schema.tables group by a;

總體是乙個group by語句,只不過這裡group by的是floor(rand(0)2)。這是乙個表示式,每次運算的值都是隨機的。還記得我剛剛說的floor(rand(0)2)的值序列開頭是011011…吧?ok,下面開始運算。

首先,建立一張虛擬表:

繼續進行group by。這是第四次floor運算了,根據剛剛那個011011序列,這次的值為0,在表中找是否有key為0的資料。當然沒有,故應當插入一條新記錄。在插入時進行floor運算(就像第一次group by那樣),這時的值為1,並將count(*)置1。可是你會說,虛擬表中已經有了key為1的資料了啊。對,這就是問題所在了。此時就會丟擲主鍵冗餘的異常,也就是所謂的floor報錯。

利用:select count(), concat((select database()), 『-』, floor(rand(0)%2)) as a from information_schema.tables group by a; #將select database()換成你想要的東西!~

sql注入之floor薛丁格報錯注入以及報錯原理

之前已經簡單介紹了sql注入的基本原理,接下來會按照sql注入的各種型別一一進行梳理,sql注入的常見主要分為回顯注入 報錯注入 bool盲注 延時注入 堆疊注入 二次注入 寬位元組注入 http頭注入 dns load注入。sql注入的報錯注入利用的是頁面返回了資料庫報錯的內容,當回顯注入無法使用...

floor報錯注入原理

關鍵函式 rand 產生0 1的偽隨機數 rand有兩種形式 1 rand 即無引數的,此時產生的隨機數是隨機的,不可重複的 2 rand n 即有引數數,如rand 0 相當於指定隨機數生產的種子,那麼這種情況產生的隨機數是可重複的。floor 向下取整數 concat 連線字串 count 計算...

SQL注入 報錯注入

乙個帶get引數的 並且不從資料庫返回資料,但存在報錯資訊 檢視字段情況 報錯注入語句格式 and 1 2 union select1,2,3 from select count concat floor rand 0 2 sql語句 a from information schema.tables...