<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我相信很多小夥伴在玩sql注入報錯注入時都會有一個疑問,為什麼這麼寫就會報錯?曾經我去查詢的時候,也沒有找到滿意的答案,時隔幾個月終於找到搞清楚原理,特此記錄,也希望後來的小夥伴能夠少走彎路
我們先來看一看現象,我這裡有一個users表,裡面有五條資料:
然後用我們的報錯語句查詢一下:
select count(*),(concat(floor(rand()*2),(select version())))x from users group by x
成功爆出了資料庫的版本號。
要理解這個錯誤產生的原因,我們首先要知道group by語句都做了什麼。我們用一個studetn表來看一下:
現在我們通過年齡對這個表中的資料進行下分組:
形成了一個新的表是吧?你其實應該能夠想到group by 語句的執行流程了吧?最開始我們看到的這張sage-count()表應該時空的,但是在group by語句執行過程中,一行一行的去掃描原始表的sage欄位,如果sage在sage-count()不存在,那麼就將他插入,並置count()置1,如果sage在sage-count()表中已經存在,那麼就在原來的count(*)基礎上加1,就這樣直到掃描完整個表,就得到我們看到的這個表了。
注:這裡有特別重要的一點,group by後面的欄位時虛擬表的主鍵,也就是說它是不能重複的,這是後面報錯成功的關鍵點,其實前面的報錯語句我們已經可以窺見點端倪了
正如我前面所說的,報錯的主要原因時虛擬表的主鍵重複了,那麼我們就來看一下它到底是在哪裡,什麼時候重複的。這裡rand()函數就登場了。
首先我們先來了解rand()函數的用法:
1.用來生成一個0~1的數
2.還可以給rand函數傳一個引數作為rand()的種子,然後rand函數會依據這個種子進行隨機生成。
那他們的區別是什麼呢?我們來看一下,這兩個語句的執行效果:
可以看到rand()生成的資料毫無規律,而rand(0)生成的資料則有規律可循,是:
0110 0110
注:如果你覺得資料不夠,證明不了rand()的隨機性,你可以自己多插入幾條資料再查詢試一下。
現在我們弄清楚了group by語句的工作流程,以及rand()與rand(0)的區別,那麼接下來就是重點了,mysql官方說,在執行group by語句的時候,group by語句後面的欄位會被運算兩次。
**第一次:**我們之前不是說了會把group by後面的欄位值拿到虛擬表中去對比嗎,在對比之前肯定要知道group by後面欄位的值,所以第一次的運算就發生在這裡。
**第二次:**現在假設我們下一次掃描的欄位的值沒有在虛擬表中出現,也就是group by後面的欄位的值在虛擬表中還不存在,那麼我們就需要把它插入到虛擬表中,這裡在插入時會進行第二次運算,由於rand函數存在一定的隨機性,所以第二次運算的結果可能與第一次運算的結果不一致,但是這個運算的結果可能在虛擬表中已經存在了,那麼這時的插入必然導致錯誤!
所以我們現在通過一個例子來驗證我們的理論,拿出我們最開始的例子:
select count(*),(concat(floor(rand(0)*2),'@',(select version())))x from users group by x
宣告:users表就是本文第一個表,表中有五條資料
注意我這裡用的是rand(0),不是rand(),rand(0)生成的有規律的序列:
我們跟著剛剛的思路走,最開始的虛擬表是空的,就像下面一樣:
count(*) | x |
---|---|
當我掃描原始表的第一項時,第一次計算,floor(rand(0)*2)是0,然後和資料庫的版本號(假設就是5.7.19)拼接,到虛擬表裡去尋找x有沒有x的值是x@5.7.19的資料項,結果顯然是沒有,那麼接下來就將它插入到上表中,但是還記得嗎,在插入之前會進行第二次計算,這時x的值就變成了1@5.7.19,所以虛擬表變成了下面這樣:
count(*) | x |
---|---|
1 | 1@5.7.19 |
現在掃描原始表的第二項,第一次計算x==’1@5.7.19‘,已經存在,不需要進行第二次計算,直接插入,得到下表:
count(*) | x |
---|---|
2 | 1@5.7.19 |
掃描原始表的第三項,第一次計算x==‘0@5.7.19’,虛擬表中找不到,那麼進行第二次計算,這時x==‘1@5.7.19’,然後插入,但是插入的時候問題就發生了,虛擬表中已經存在以1@5.7.19為主鍵的資料項了,插入失敗,然後就報錯了!
上面是使用rand(0)的情況,rand(0)是比較穩定的,所以每次執行都可以報錯,但是如果使用rand()的話,因為它生成的序列是隨機的嘛,所以並不是每次執行都會報錯,下面是我的測試結果:
執行了五次,報錯兩次,所以是看運氣。
總之,報錯注入,rand(0),floor(),group by缺一不可
到此這篇關於sql注入報錯之注入原理範例解析的文章就介紹到這了,更多相關sql注入報錯注入原理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45