一、概述:
1、介绍
SQL注入就是指Web应用程序对用户输入数据的合理性没有进行判断,前端传入后端的参数是攻击者可控制的,并且根据参数带入数据库查询,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询。
2、SQL注入的条件
(1)输入用户可控;(2)直接或间接拼入SQL语句执行。
3、审计方法
对于SQL注入漏洞审计,常见的方法是,根据SELECT、UPDATE等SQL关键字或是通过执行SQL语句定位到存在SQL语句的程序片段,随后通过查看SQL语句中是否存在变量的引用并跟踪变量是否可控。因SQL注入漏洞特征性较强,在实际的审计过程中我们往往可以通过一些自动化审计工具快速地发现这些可能存在安全问题的代码片段。如使用Fortify等自动化工具。
Java语言本身是一种强类型语言,因此在寻找SQL注入漏洞的过程中,可以首先找到所有包含SQL语句的点,随后观察传参类型是否是String类型,只有当传参类型是String类型时我们才可能进行SQL注入。
二、SQL注入的分类:
SQL注入的分类较多,一般可笼统地分为数字型注入与字符串型注入两类。
SQL注入构造恶意SQL语句的方法有:构造堆叠,构造闭合,构造报错,构造时间差,等等
SQL注入按照注入点类型来分分为:数字型注入,字符型注入,搜索型注入
SQL中注入按照提交类型来分分为:GET注入,POST注入,COOKIE注入,HTTP头部注入
SQL注入按照技巧分类的话可以分为:联合注入,布尔盲注,时间盲注,堆叠注入,报错注入。
1、数字型注入
访问http:xxx.admin.com?id=1这种形式的url,输入and 1=1与and 1=2,进行判定看是否会出现and 1=1回显正常,and 1=2回显不正常的情况。如果出现了一般就认为这里存在注入,并且是数字型注入。如果没有出现那么并不能排查这里没有注入,只是排除这里不存在数字型的注入。
2、字符型注入
url后输入' and 1=1 and '1'='1,' and 1=2 and '1'='1。看是否会出现报错的现象。如果存在我们可以进一步的闭合我们的语句。
3、可显注入
攻击者可以直接在当前界面内容中获取想要获得的内容。
4、报错注入
数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容。
5、盲注
数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。
6、时间盲注
常用函数 sleep()
分割函数 substr、substring、left
分割函数编码后可不用引号,ascii() hex()
一般时间盲注我们还需要使用条件判断函数
if(expre1,expre2,expre3)
当 expre1 为 true 时,返回 expre2,false 时,返回 expre3
7、布尔盲注
这种注入会出现在 注册、ip头、留言板等等需要写入数据的地方,如用sqlmap会产生大量垃圾数据。尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,然后如果插入失败,更新失败,然后深入测试确定是否存在注入。
8、二次注入
sql语句的变量并不是直接传入的变量,而是通过其它的方式保存到了数据库,形成二次注入。没有单引号的sql语句中,进行16进制编码,这样就不会带有单引号。
9、宽字节注入
字符注入的时候我们需要逃逸单引号,但是php提供了魔术引号开关magic_quotes_gpc和addslashes(),iconv()函数作为防御,特点是自动给传入的参数如单引号,双引号,反斜杠,%00前面加一个反斜杠,进行转义,避免单引号进行逃逸。单引号转义为 ' , mysql 会将 \ 编码为 %5c ,宽字节中两个字节代表一个汉字,所以把 %df 加上 %5c 就变成了一个汉字"運",从而绕过转义。如果数据库是GBK格式而非默认的UTF-8格式,则我们利用两个url编码是一个汉字的特点,组合一个汉字从而解决"\"问题,完成单引号的逃逸。
10、http头部注入
user-agent:判定用户使用的操作系统,以及使用的浏览器的版本。
cookie:判定用户的身份,进行session跟踪可以存储在用户本地终端上的数据,简单理解为用户的一张身份辨别卡。
x-forwarded-for:是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
client-ip: 数据库保存客户端IP的参数。
rerferer:浏览器向web端表明自己从哪个连接而来。
host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。
三、SQL注入方式
1、#和_模糊查询
2、order by注入
3、union