Less-46
從本關開始,我們開始學習order by 相關注入的知識。
本關的sql語句為$sql = "SELECT * FROM users ORDER BY $id";
嘗試?sort=1 desc或者asc,顯示結果不同,則表明可以注入。(升序or降序排列)
從上述的sql語句中我們可以看出,我們的注入點在order by后面的參數中,而order by不同於的我們在where后的注入點,不能使用union等進行注入。如何進行order by的注入,我們先來了解一下mysql官方select的文檔。
我們可利用order by后的一些參數進行注入。
首先
(1)、order by 后的數字可以作為一個注入點。也就是構造order by 后的一個語句,讓該語句執行結果為一個數,我們嘗試
http://127.0.0.1/sqli-labs/Less-46/?sort=right(version(),1)
沒有報錯,但是right換成left都一樣,說明數字沒有起作用,我們考慮布爾類型。此時我們可以用報錯注入和延時注入。
此處可以直接構造 ?sort= 后面的一個參數。此時,我們可以有三種形式,
①直接添加注入語句,?sort=(select ******)
②利用一些函數。例如rand()函數等。?sort=rand(sql語句)
Ps:此處我們可以展示一下rand(ture)和rand(false)的結果是不一樣的。
③利用and,例如?sort=1 and (加sql語句)。
同時,sql語句可以利用報錯注入和延時注入的方式,語句我們可以很靈活的構造。
報錯注入例子
上述例子,可以看到root@localhost的用戶名
接下來我們用rand()進行演示一下,因為上面提到rand(true)和 rand(false)結果是不一樣的。
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=115)
http://127.0.0.1/sqli-labs/Less-46/?sort=rand(ascii(left(database(),1))=116)
從上述兩個圖的結果,對比rand(ture)和rand(false)的結果,可以看出報錯注入是成功的。
延時注入例子
http://127.0.0.1/sqllib/Less-46/?sort=1%20and%20If(ascii(substr(database(),1,1))=116,0,sleep(5))
上述兩個延時注入的例子可以很明顯的看出時間的不同,這里就不貼圖了,圖片無法展示延時。。。
同時也可以用?sort=1 and 后添加注入語句。這里就不一一演示了。
-
procedure analyse參數后注入
利用procedure analyse參數,我們可以執行報錯注入。同時,在procedure analyse和order by之間可以存在limit參數,我們在實際應用中,往往也可能會存在limit后的注入,可以利用procedure analyse進行注入。
以下為示范例
-
導入導出文件into outfile參數
http://127.0.0.1/sqllib/Less-46/?sort=1%20into%20outfile%20%22c:\\wamp\\www\\sqllib\\test1.txt%22
將查詢結果導入到文件當中
那這個時候我們可以考慮上傳網馬,利用lines terminated by。
Into outtfile c:\\wamp\\www\\sqllib\\test1.txt lines terminated by 0x(網馬進行16進制轉換)