SQL注入-时间注入

时间注入

时间注入指的是攻击者根据SQL语句执行的时间长短变化来判断是否注入语句是否执行成功。

在MySQL中,bechmark()函数的作用是可以使同一个函数执行若干次,从而数据库执行的时间变长。如下:

<code>SELECT BENCHMARK(10000000,ENCODE("hello","world"))
> OK
> 时间: 7.411s/<code>

执行10000000次ENCODE("hello","world")函数,耗时7.411s,根据BENCHMARK函数执行的次数,SQL执行的时间也会变化,这样就可以利用这个时间变化进行判断是否具有注入的漏洞。另外,还可以根据sleep()函数来测试是否具有漏洞。sleep()函数经常与if条件语句一起使用,如下:

<code>-- 数据库名称的长度大于1,则休眠五秒,否则返回1。
if (length(database())>1,sleep(5),1)
-- 如果数据库名的第一位字母是s,则睡眠5秒,否则返回1
if (substr(database(),1,1)='s',sleep(5),1)/<code>

上述SQL语句根据if语句中条件进行判断,如果SQL查询时间比sleep中的时间稍微长一点,那么就存在漏洞。

下面来看下具体的时间注入案例,构造请求链接:

<code>http://localhost:8080/user/name?
name=lingheng' and if (length(database())>1,sleep(5),1) %23/<code>

实际执行的SQL语句为:

<code>SELECT * FROM t_person 
where Fname ='lingheng' and if (length(database())>1,sleep(5),1) #'/<code>


SQL注入-时间注入

请求的时间

在浏览器中按F12进行调试,就可以看到这次请求耗时5秒多。在sleep函数中换几个不同的数字测试,如果每次返回结果的时间都不一样,那么说明注入是成功的。

当可以判断进行时间注入,接下来也可以按照盲注的方法进行获取数据库的其他数据。

Mybatis注入分析

在Mybatis中,使用XML文件进行SQL语句的管理,有两种语法对输入的参数进行绑定,当 ${} 语法时,Mybatis会直接将输入原封不动进行绑定,也就是说直接将SQL语句与原始字符串拼接在一起。而本教程中的注入原因就是使用${}进行绑定,所以才导致SQL注入,具体的XML位置如下:

<code><select>
SELECT * FROM t_person where Fname ='${name}'
/<select>/<code>

当使用 #{} 语法时,Mybatis 会自动生成 PreparedStatement ,使用参数绑定 ( ?) 的方式来设置值,带占位符 ( ? ) 的 SQL 语句只会被编译一次,之后执行只是将占位符替换为用户输入,并不会再次编译/解释,因此从根本上防止了 SQL 注入问题。而在 SQL 注入中,用户的输入是作为 SQL 指令的一部分,会被数据库进行编译/解释执行。

上面的教程主要是利用手工进行注入,相对来说是比较耗时,以及效率比较低的,SQLMap是自动SQL注入和数据库接管工具,支持Mysql、Oracle, PostgreSQL, Microsoft SQL Server等多种数据库。有兴趣的可以直接使用SQLMap进行SQL的注入学习。

我是小图灵视界,会不定时更新互联网安全、互联网资源、互联网技术、以及互联网工具的文章,欢迎各位进行关注!

需要完整源码和教程PDF的可以关注我,并留言评论,我将会发给你!


分享到:


相關文章: