以DVWA的sql注入初级为例,结合网上搜索的相关利用方式,总结成这一篇文章,内容会有点跳跃。
大纲:
1.初级手工注入
2.order by的使用
3.union查询注意点
4.Mysql相关的注释用法(比如 ‘--’后面需要跟一个空格或者回车等)
5.Mysql相关系统信息函数和全局变量
6.Mysql常用函数
详细信息如下:
1.初级手工注入
DVWA登录之后设置 security level为low,找到SQL Injection之后,通过显错注入的方式来判断是否存在注入。添加单引号之后 页面显示报错如下
提示存在语法错误 ,原因在于引号没有闭合好,页说明了sql语句查询的时候是带上引号的,就自发的认为是字符型参数。在输入框中使用数字万能秘钥 1 or 1=1 的时候 竟然发现可以查询出来 。在数据库中也直接使用 查询语句 SELECT * FROM `users` where user_id = '1 or 1=1' 也可以查出。这个就有点奇怪了。原因在于如果是字符型参数,输入 1 or 1=1 ,是不能查出数据的,我一度还以为数据库进行了布尔运算,百思不得。后面发现 这个参数竟然是int型 的。数据库会自动截断输入不为数字的字符,保留从首位开始为数字的一段入参。这个也解释了为什么 输入 1 or 1=1 能够得出id =1 的信息。
既然后台语言查询的时候 是有引号的 那就先闭合引号 再注入sql语句。比如使用 1 ' or 1=1 -- ['--'后面有个空格,否则会报错],这个输入会显示出表里面的所有数据
再比如 1' or '1'= '1 这个就不需要sql注释语句来注释后面的引号;
2.order by的使用
初步显示数据之后,我们可以判断一下 这个查询语句 查询了这张表 几列数据,这时使用 order by 来判断查询了几列。order by 数字 这个语句指示这按照查询列的数据来排序,具体产生什么样的结果 我们可以看看下面的查询结果。
最简单的 SELECT `first_name`,`last_name` FROM `users` 查询
添加order by 1之后的 SELECT `first_name`,`last_name` FROM `users` order by 1的结果
发现第一列开始按照首字母进行了排序
添加order by 2之后的 SELECT `first_name`,`last_name` FROM `users` order by 2的结果
增大数字为3,发现报错
利用这个原理 我们可以一步步增大order by 数字 ,直到报错为止,这个报错意味着只查询了这么几列的。
所以在输入框中我们输入 1' order by 3 -- [--后面需要有空格,mysql的注释语法导致的],发现报错了,故数值下减,直到判断为2 结束order by 的运用。
3.union查询注意点
通过order by 我们知道了查询的列数 我们需要使用 union查询来输出我们需要的信息。使用union 的时候 我们可以使用火狐插件 如 hackbar 来方便我们操作,如下图所示,我们输入查询的列数即可
union查询有一定的特点,在http://www.w3school.com.cn/sql/sql_union.asp 这里面讲了。即union查询左右两边查询的数据类型需要相似或者一致。
这个也就意味着 我们输出的数据可以在数字所指示的地方显现出来。
有了这个之后,我们去获得一些我们想要的信息。比如user(),version(),database()等。
自然也可以这个样子
两种方式其实是一样的。
有了这些之后,我们还可以看看操作系统信息,这里就需要用到数据库的全局变量了,全局变量不需要说明在哪个库。union select 1,@@global.version_compile_os from mysql.user-- 以及union select 1,@@global.version_compile_os from 结果是一样的
后续还可以猜解表名什么的可以自己搜搜了。
可以参考http://www.2cto.com/article/201307/230064.html
4.Mysql相关的注释用法(比如 ‘--’后面需要跟一个空格或者回车等)
MySQL服务器支持3种注释风格:
从‘#’字符从行尾。
从‘-- ’序列到行尾。请注意‘-- ’(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。该语法与标准SQL注释语法稍有不同,后者将在1.8.5.7, “‘--’作为注释起始标记”中讨论。
从/*序列到后面的*/序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。
5.Mysql相关系统信息函数和全局变量
了解Mysql相关系统信息函数和全局变量有助于我们更好的了解这个系统
USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER 这个都是对等的,schema()等于 database()。
数据库中经常出现 @@ ,这个起头的代表的就是全局变量,格式是@@global.var_name。常用的有 version version_bdb version_compile_os等 多搜集一些这样的数据是不会有错的。
这个可以参考http://www.cnblogs.com/gavin110-lgy/p/5772577.html
6.Mysql常用函数
了解这个主要适用于转换注入语句的时候,方便过安全狗这类的,可以参考http://www.2cto.com/database/201508/436118.html 。