查看原文
其他

发现注入和判断数据库(SQL注入)

哆啦安全 2022-11-05

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处理库用的最多的就数 Jacksonfastjson

而 Jackson 和 fastjson 是有 unicode hex 的编码特性,所以我们遇到json数据也可以尝试编码绕过单引号进行判断存不存在sql注入。

{"key":"\u0027\u0022"}{"key":"\x27\u0022"}

下图就是在一个项目使用Unicode绕过单引号进行注入。



判断数据库类型


access数据库基本遇不到了,可以不用管了

下面列出了很多种判断数据库类型的方法,为啥列出很多种就是怕有waf拦截,多尝试几个更好去判断。


端口判断

Oracle:1521mssql:1433Mysql:3306


系统架构组合识别

asp、.net:mssqlphp:mysql、postgresqljava:oracle、mysqliis:mssqlapache: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)=1bitand(1,1)

基本靠返回长度函数就能判断清楚了。


特殊语句

mssql使用@@version变量返回当前的版本信息

select @@version;@@pack_received ,@@rowcount

postgresql使用version()函数

select version();

mysql则是@@versionversion()两种方式都支持

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;


其他

区分assceemssql

' 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/

关联文章:

MySQL注入-Bypass

SQL注入基础知识点

SQL注入-特殊小技巧

SQL注入从入门到精通

SQL注入语句和方法总结

sqlmap检测sql注入漏洞

利用Sql注入漏洞之获取服务器Root权限



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存