开发不得不知道的SQL注入( 三 )


 
从上图可以看到第一个字段名字为Fid,查询第二个字段名将imit 0.1改为limit 1,1 就可以了 。通过查询得到表的字段名为:Fid、Fname、Fpass_word、Fsex 。通过数据名称、表名以及字段名,就可以将数据中的数据数据查出来,将union select 中的 2 位置换成如下SQL语句:
select Fpass_word from test.t_person limit 0,1根据上述的SQL语句就可以查询字段对应的数据了,其他字段的数据也可以构造上述的查询语句进行查询 。现在攻击者没有权限却获取了数据库的名称、表名、字段名以及数据库中的数据,这对于网站来说是一件很危险的事 。
时间注入时间注入指的是攻击者根据SQL语句执行的时间长短变化来判断是否注入语句是否执行成功 。
在MySQL中,bechmark()函数的作用是可以使同一个函数执行若干次,从而数据库执行的时间变长 。如下:
SELECT BENCHMARK(10000000,ENCODE("hello","world"))> OK> 时间: 7.411s执行10000000次ENCODE("hello","world")函数,耗时7.411s,根据BENCHMARK函数执行的次数,SQL执行的时间也会变化,这样就可以利用这个时间变化进行判断是否具有注入的漏洞 。另外,还可以根据sleep()函数来测试是否具有漏洞 。sleep()函数经常与if条件语句一起使用,如下:
-- 数据库名称的长度大于1,则休眠五秒,否则返回1 。if (length(database())>1,sleep(5),1)-- 如果数据库名的第一位字母是s,则睡眠5秒,否则返回1if (substr(database(),1,1)='s',sleep(5),1)上述SQL语句根据if语句中条件进行判断,如果SQL查询时间比sleep中的时间稍微长一点,那么就存在漏洞 。
下面来看下具体的时间注入案例,构造请求链接:
http://localhost:8080/user/name?name=lingheng' and if (length(database())>1,sleep(5),1) %23实际执行的SQL语句为:
SELECT * FROM t_person where Fname ='lingheng' and if (length(database())>1,sleep(5),1) #'

开发不得不知道的SQL注入

文章插图
 
在浏览器中按F12进行调试,就可以看到这次请求耗时5秒多 。在sleep函数中换几个不同的数字测试,如果每次返回结果的时间都不一样,那么说明注入是成功的 。
当可以判断进行时间注入,接下来也可以按照盲注的方法进行获取数据库的其他数据 。
Mybatis注入分析在Mybatis中,使用XML文件进行SQL语句的管理,有两种语法对输入的参数进行绑定,当 ${} 语法时,Mybatis会直接将输入原封不动进行绑定,也就是说直接将SQL语句与原始字符串拼接在一起 。而本教程中的注入原因就是使用${}进行绑定,所以才导致SQL注入,具体的XML位置如下:
<select id="selectByName" parameterType="JAVA.lang.String" resultMap="BaseResultMap" >SELECT * FROMt_person where Fname ='${name}'</select>当使用 #{} 语法时,Mybatis 会自动生成 PreparedStatement,使用参数绑定 ( ?) 的方式来设置值,带占位符 ( ? ) 的 SQL 语句只会被编译一次,之后执行只是将占位符替换为用户输入,并不会再次编译/解释,因此从根本上防止了 SQL 注入问题 。而在 SQL 注入中,用户的输入是作为 SQL 指令的一部分,会被数据库进行编译/解释执行 。
上面的教程主要是利用手工进行注入,相对来说是比较耗时,以及效率比较低的,SQLMap是自动SQL注入和数据库接管工具,支持Mysql、Oracle, PostgreSQL, Microsoft SQL Server等多种数据库 。有兴趣的可以直接使用SQLMap进行SQL的注入学习 。




推荐阅读