一、SQL注入
1. SQL注入原理
web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,把用户输入的数据当作代码来执行,获取或修改数据库中的数据。
2. SQL注入常用函数及含义
version():MySQL数据库版本
user():数据库用户名
database():当前数据库名
user():用户
@@basedir:数据库安装路径
@@datadir:数据库文件存放路径
@@version_compile_os:操作系统版本
3. SQL注入防御手段
1.输入验证和过滤
输入验证和过滤是一种用于确保用户输入数据的安全性和有效性的技术。它可以防止恶意输入和错误数据导致的安全漏洞和应用程序错误。
def validate_input(input):
if not re.match(r'^[a-zA-Z0-9_]+$', input):
raise ValueError('Invalid input')
return input
2. 使用参数化查询
参数化查询通过将SQL语句和用户输入分开,避免将用户输入直接拼接到SQL查询中,从根本上杜绝SQL注入。
user = User.objects.get(username=username, password=password)
3. 数据库权限管理
通过合理设置数据库用户权限,限制数据库用户的操作范围和权限,可以减少SQL注入攻击的影响。
GRANT SELECT, INSERT, UPDATE, DELETE ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password';
4. 使用Web应用防火墙(WAF):检测并阻止恶意请求。
二、sqli-labs
1.
判断是否存在注入
判断id类型,根据结果判断为字符型
判断列数,由图看出不是小于5
由图看出大于等于三
由图看出小于4
则列数为3
检查哪几列显示在前端,由结果判断2、3列显示在前端
查看数据库和版本信息
由于mysql的版本大于5,故可以使用内置库 information_schema
查找数据库表名
根据回显,猜测users表存放了密码账户的信息,则需要查询users表列名
根据回显,查询用户账号和密码
2.
插入单双引号查看回显
都存在报错,说明为数字型
查询有多少列
说明为3列
查询哪些列显示在前端
说明2、3列显示在前端
查询数据库以及版本信息
查询存在哪些表
查询存在哪些列
查询账号密码
3.
判断类型
判断为双引号字符型且带括号
判断列数
查看哪些列回显在前端
查看数据库和版本信息
查看有哪些表
查看有哪些列
查看用户名和密码等信息
4.
输入单引号,回显正常,输入双引号,回显提示有括号
查看列数
查看哪些列有回显
查看数据库和版本信息
查看有哪些表
查看users表有哪些列
查看用户名密码信息
5.
判断类型
判断列数
判断数据库名长度是否大于10
判断是否大于5
判断是否大于7
判断是否大于8
由结果判断数据库名长度为8
判断数据库名第一位是什么,由于使用同样的数据库,且长度为8,故猜测是数据库security
先猜测第一位是否是‘s‘,结果为真,故接下来只需验证即可
判断user表是否存在
判断id列是否存在
查询username列是否存在
查询password列是否存在
用同样的方法对id和password以及username进行穷尽
三、SQLi的手工注入的步骤
1.通过加引号根据回显判断是否存在注入点
2.通过加引号括号注释组合判断当前字段类型闭合方式是否有括号等
3.通过order by判断有几列
4.通过联合查询判断哪些列回显在前端
5.通过内置函数判断数据库及其版本信息
6.通过内置表查询管理员创建了哪些表
7.通过columns表判断有哪些列
8.根据列名使用联合查询得到用户名密码等信息
四。、sqlmap通过或验证第六关
1.判断是否存在注入点
根据提示get请求存在布尔盲注、报错注入、时间盲注
2.获取数据库名称
发现存在一下库
3.获取security库的表名
发现存在以下表
4.获取users表的列名
发现存在一下列