打開靶機
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()是隨機取(0,1)中的一個數,但是給它一個參數后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 函數缺一不可.
具體實驗過程如下
查看頁面信息
查詢數據庫名
查詢數據表信息
查詢字段
查詢字段數據信息