ctfhub技能樹—sql注入—報錯注入


打開靶機

payload

1 Union select count(*),concat((查詢語句),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

 payload拆分講解

1 count():count()函數返回匹配指定條件的行數。count(*)函數返回表中的記錄數
2 floor():floor:函數是用來向下取整呢個的,相當於去掉小數部分
3 rand():rand()是隨機取(01)中的一個數,但是給它一個參數后0,即rand(0),並且傳如floor()后,即:floor(rand(0)*2)它就不再是隨機了,序列0110110
4 concat():用於連接兩個字符串
5 group by x:x就是相當於 as x,設一個別名
6 0x26:16進制數值,ASCII為“&”,在回顯中起到分隔作用

產生原因

MySQL報錯注入通過構造payload讓信息通過錯誤提示回顯出來,主要應用與查詢不回現內容,會打印錯誤信息;Update、insert等語句,會打印錯誤的信息。

 報錯注入實現原因(摘自:https://www.cnblogs.com/Triomphe/p/9489639.html)

報錯的原因是因為rand()函數在查詢的時候會執行一次,插入的時候還會執行一次.這就是整個語句報錯的關鍵

前面說過floor(rand(0)*2) 前六位是0110110

group by x先建立一個空表,用於分組.然后進行分組查詢,第一次rand()執行,查詢的結果是0,因為是空表所以插入這條,而插入的時候rand()又執行了一次,所以表中的結果就是

第一次執行完,接着執行rand()的值為1,因為表中存在,所以加1,表中結果成為

到了第三次執行rand()是值為0,因為表中不存在所以要插入新的數據,這次插入rand()再次執行,所以插入的又是1.而表中已經存在1了

此時插入因為重復出現同一個key,就會出現報錯 重復出現key.而報錯中會說明那個key有問題,我們的key中結合了想要了解的字符串root@localhost

這樣就實現了報錯注入,拿到了自己想要的數據

這就是整個報錯注入的原理了,rand(),floor() group by 函數缺一不可.

 

具體實驗過程如下

查看頁面信息

查詢數據庫名

查詢數據表信息

 查詢字段

查詢字段數據信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM