前言
SQL注入的原理相信大家在初始学习中也是印象深刻,深刻到只会用工具去跑,即便如此我也相信原理啥的,你一看就会。我相信大多数的师傅对注入都是有一定程度的理解和心得,如果对SQL注入了解但是不够不深入的可以详细的去学习一下基础,打打靶场,记得手工玩一玩就不要上sqlmap了,自己多熟悉一下SQL函数。当然我们在学习SQL注入的时候首先一定要先去简单的了解各种数据库的特征以及如何判断数据库类型
判断数据库类型
转载自csdn
https://blog.csdn.net/weixin_43749601/article/details/115369123
前端与数据库类型
-
asp:SQL Server,Access
-
.net:SQL Server
-
php:MySQL,PostgreSQL
-
java:Oracle,MySQL
根据端口判断
-
Oracle:默认端口1521
-
SQL Server:默认端口1433
-
MySQL:默认端口3306
根据数据库特有函数来判断
len和length函数
-
len():SQL Server 、MySQL以及db2返回长度的函数。
-
length():Oracle和INFORMIX返回长度的函数。
version和@@version函数
-
version():MySQL查询版本信息的函数
-
@@version:MySQL和SQL Server查询版本信息的函数
substring和substr函数
-
MySQL两个函数都可以使用
-
Oracle只可调用substr
-
SQL Server只可调用substring
根据特殊符号进行判断
-
/*是MySQL数据库的注释符
-
--是Oracle和SQL Server支持的注释符
-
;是子句查询标识符,Oracle不支持多行查询,若返回错误,则说明可能是Oracle数据库
-
#是MySQL中的注释符,返回错误则说明可能不是MySQL,另外也支持-- 和/**/
根据数据库对字符串的处理方式判断
MySQL
?id=1 and 'a'+'b'='ab'
?id=1 and CONCAT('a','b')='ab'
Oracle
?id=1 and 'a'||'b'='ab'
?id=1 and CONCAT('a','b')='ab'
SQL Server
?id=1 and 'a'+'b'='ab'
根据数据库特有的数据表来判断
MySQL(version>5.0)
?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
Oracle
?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
SQL Server
?id=1 and (select count(*) from sysobjects)>0 and 1=1
根据盲注特别函数判断
MySQL
BENCHMARK(1000000,ENCODE('QWE','ASD'))
SLEEP(5)
PostgreSQL
PG_SLEEP(5)
GENERATE_SERIES(1,1000000)
SQL Server
WAITFOR DELAY '0:0:5'
注入测试常见思路
在进行SRC挖掘的时候可以对SQL注入挖掘有两种方法:
-
被动扫描检查(不建议使用,因为流量过大的问题会导致封禁)
-
手工+半自动化+配合sqlmap进行检查
现在的web站点大多数都上WAF或者进行通过预编译来防止注入,但是这两种情况并不是说真的就一劳永逸了,再也不存在注入漏洞了。
-
通过真实ip去访问web站点绕过WAF
-
爬取整个站点的接口,有可能有一个接口就忘记添加WAF
-
可控的表名/列名以及 order by/sort/desc/limit 等参数,如果不属于用户的输入,也能造成注入,这就是预编译不能完全防范sql注入的原因。
举个例子,如果单引号报错,双引号正常(去对比对比返回的长度)就可能存在注入,然后判断数据库类型,套用配套的语句,证明有注入后,接下来就可以放入sqlmap中跑出注入或者自己写脚本来跑了。
注入时可能存在点
-
常见的参数传递,像id=1(数字型),id=n(字符串型)、查询框、登录框等等
-
cookies/http头/user-agent/ip/xff头也有可能存在注入,不要放过一个数据包的每个地方
-
一些不明显地方,比如字段的排序、表名、字段名可控也能引发注入
例如:
-
order by id
-
sort=id
-
desc
-
asc
-
limit
对这些参数后注入,就可以用逗号来闭合,后面接上注入语句,达到注入的结果。
通用检测流程
不论是web上的资产还是app都一样的
将所有功能点都点一下,然后回去再去看看历史记录
测试不要只盯着一个参数测,别的可疑的也测一下
在确定某参数存在注入后,就放入sqlmap中自动跑出结果即可
原文始发于微信公众号(猫因的安全):如何进行有效的SQL注入挖掘而非打靶?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论