一、浅谈
有一个别的公司的测试问我,会sql注入么,刚开始我有点懵,因为本身黑盒测试sql注入这块其实是一个测试关注点,但一直只是听说过,没用过,后来简单的入门了一下,才知道拿别人的后台不只是“白帽”能做到,对于测试来说也是轻而易举
二、什么是sql注入
我的理解就是通过网页传递给数据库的数据,开发人员未对此类数据做过滤限制,通过这些未被过滤的数据进行sql语句的代码进行攻击。
常见可被注入的网址一般如下
1.www..com/index.asp?page=11
2.www..com/news.asp?id=1&page=2
3.www.?id=11
直接通过页面传递GET请求参数页面,是比较经典的sql注入网址,但绝对不是所有的GET请求页面都能被注入,具体能被注入的网址需要自己去试,或者自己去用工具,如果基础比较好的人可以自己编写简单的注入工具
三、如何判断注入
常见的注入and/or/',通过这个三个可以判断网站是否存在注入
对于使用access数据库的网站,一般注入分为以下几个步骤
判断注入 :使用 and/or/'
猜解表名 :使用 order by 和 UNION 联合操作
猜解列名 :使用 UNION 操作
猜解数据 :根据猜解的列名采集数据
根据上面的四个步骤,我们在数据库模拟操作看实际效果
- 单引号的时候数据库直接报错,对应web页面可能会出现对应的报错信息
- and 1=1 真and真为真,对应web页面数据返回正常
+and 1=2 真and假为假,所以没有数据返回,对应web页面也应该无数据返回
现在假如我们判断页面符合注入
首先知道数据库中ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
- 使用order by 判断字段数
这里我先大于实际字段数时数据库报错
当我等于实际字段数时
这时候我可以判断出这个表的字段有五个,下一步使用UNION,这里我们首先要知道union的意义
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
根据这个猜表我们用null 占位字段,使其达到让两个表的字段一致
-
表名猜错时会出现报错
-
表名猜对时数据展示正常
-
这时候通过替换方法猜测列名
输入错误字段名称报错
在任意位置输入正确字段,字段内容全部显示
我们运用这个基础知识去测一个网站看我们能不能拿到网站数据,这是我从某网站拿到的表
表:
+------------+
| ad |
| admin_user |
| menu |
| news |
| system |
| video |
+------------+
字段:
+----------+
| Column |
+----------+
| admin |
| id |
| keywords |
| password |
+----------+
用户名密码其实我也拿到了,但点到为止就好