phpstudy、DVWA、SQLI-LABS(学习sql注入平台)、upload-labs、课程源码环境web
SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的 参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql 语句来 实现对数据库的任意操作。
举例说明:
i d = id= id=_GET[‘id’]
s q l = S E L E C T ∗ F R O M u s e r s W H E R E i d = sql=SELECT * FROM users WHERE id= sql=SELECT∗FROMusersWHEREid=id LIMIT 0,1
a) 在 MySQL5.0 版本后,MySQL 默认在数据库中存放一个“information_schema”的 数据库,在该库中,我们需要记住三个表名,分别是 schemata,tables,columns。
b) Schemata 表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据 库名的字段名为 schema_name。
c) Tables 表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库 库名和表名的字段分别是 table_schema 和 table_name.
d) Columns 表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中 记录数据库库名、表名、字段名为 table_schema、table_name、columns_name。
a) 数据库(database):按照数据结构来组织、存储和管理数据的仓库多个数据表 的集 l
b) 数据表(table):以矩阵方式存储数据,在操作界面中以表格形式展现; l
c) 列(column): 具有相同数据类型的数据的集合; l
d) 行(row): 每一行用来描述某条记录的具体信息; l
e) 值(value): 行的具体信息, 每个值必须与该列的数据类型相同; l
f) 表头(header): 每一列的名称; l
g) 键(key): 键的值在当前列中具有唯一性。
a) 数据库查询语句如下:
想要查询的值 A= select 所属字段名 A from 所属表名 where 对应字段名 B=值 B
Limit 的使用格式是 limit m,n,其中 m 指的是记录开始的位置,从 m=0 开始,表示第一条记录;
n 是指取几条记录。
a) Version();当前 mysql 的版本
b) Database();当前网站使用的数据库
c) User();当前 MySQL 的用户
三种注释符号:
i. 1.#
ii. 2.–空格 空格可以使用+代替 (url 编码%23 表示注释)
iii. 3. /!/
一般来说,SQL 注入一般存在于形如:http://xxx.xxx.xxx/abc.asp?id=XX 等带有参数的 ASP 动态网页中,有时一个动态网页中可能只有一个参数,有时可能有 N 个参数,有时是整型 参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页并且该网页访问 了数据库,那么就有可能存在 SQL 注入。如果 ASP 程序员没有安全意识,没有进行必要的字符 过滤,存在 SQL 注入的可能性就非常大。
在探测过程中,需要分析服务器返回的详细错误信息。在默认情况下,浏览器仅显示“HTTP 500 服务器错误”,并不显示详细的错误信息。因此,需要调整浏览器的配置。在 IE 浏览器中 选择“工具”→“Internet 选项”命令,弹出“Internet 选项”对话框,选择“高级”选项卡,把“显示友好 HTTP 错误信息”前面的勾去掉。
为了把问题说明清楚,以下以 http://xxx.xxx.xxx/abc.asp?ip=YY 为例进行分析,YY 可 能是整型,也有可能是字符串。
A.整型参数的判断
当输入的参数 YY 为整型时,通常 abc.asp 中 SQL 语句大致如下:
select * from 表名 where 字段=YY
所以可以用以下步骤测试 SQL 注入是否存在。
(1)在 URL 链接中附加一个单引号,即 http://xxx.xxx.xxx/abc.asp?p=YY’,此时 abc.ASP 中的 SQL 语句变成了
select * from 表名 where 字段=YY’。
测试结果为 abc.asp 运行异常;
(2)在 URL 链接中附加字符串“and 1=1”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=1。
测试结果为 abc.asp 运行正常,而且与 http://xxx.xxx.xxx/abc.asp?p=YY 运行结果相同;
(3)在 URL 链接中附加字符串“and 1=2”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=2。
测试结果为 abc.asp 运行异常。
如果以上三种情况全部满足,abc.asp 中一定存在 SQL 注入漏洞。
B.字符串型参数的判断
当输入的参数 YY 为字符串时,通常 abc.asp 中 SQL 语句大致如下: select * from 表名 where 字段=‘YY’,所以可以用以下步骤测试 SQL 注入是否存在。
(1)在 URL 链接中附加一个单引号,即 http://xxx.xxx.xxx/abc.asp?p=YY’, 此时 abc.ASP 中的 SQL 语句变成了 select * from 表名 where 字段=YY’。
测试结果为 abc.asp 运行异常;
(2)在 URL 链接中附加字符串“’and ‘1’=‘1”即
http://xxx.xxx.xxx/abc.asp?p=YY ’and ‘1’=‘1。
测试结果为 abc.asp 运行正常,而且与 http://xxx.xxx.xxx/abc.asp?p=YY 运行结果相同;
(3)在 URL 链接中附加字符串“’and ‘1’=‘2”即
http://xxx.xxx.xxx/abc.asp?p=YY ’ and ‘1’=‘2。
测试结果为 abc.asp 运行异常。
如果以上三种情况全部满足,abc.asp 中一定存在 SQL 注入漏洞。
Union 联合、合并:将多条查询语句的结果合并成一个结果,union 注入攻击为一种手工测试。
A:判断是否存在注入点
http://127.0.0.1/web/sql/union.php?id=1
1’ 异常
1 and 1=1 返回结果和 id=1 一样
1 and 1=2 异常
从而则一定存在 SQL 注入漏洞
B:order by 1-99 语句来查询该数据表的字段数量
Id=1 order by 1-99
来判断字段数
C:利用获得的列数使用联合查询,union select 与前面的字段数一样 找到了数据呈现的位置
http://127.0.0.1/web/sql/union.php?id=1 union select 1,2,3,4,5,6
D:根据显示内容确定查询语句的位置,利用 information_schema 依次进行查询 schemata,tables,columns
E:已知库名、表名和字段名,接下来就爆数据
此处正常说明为字符型
第二步判断数据表字段数
字段数为1
第三步:判断查询输出的位置
第五步:爆表名admins,classes,english,networks,students,teachers