SQL注入与权限控制
SQL注入与权限控制
一. 实验目的
- 熟悉与掌握数据库安全的基本概念和技术;
- 了解数据库安全的身份认证与访问控制机制及其使用方法;
- 了解数据库管理系统安全加固的基本方法;
- 掌握数据库备份与恢复的基本方法;
- 了解SQL注入的基本原理和预防方法。
二. 实验要求
对每一个实验内容进行实际操作,根据要求记录具体的实验步骤:
- 列出相关SQL查询测试、SQL注入攻击过程等语句,实验过程截图附在后面;
- 列出实现权限控制的SQL语句,并将测试结果截图附后。
3.1 SQL注入实验
具体实验指导,参考文档:01--SQL注入实验指导-Lab4.pdf
1. Practice1:Practice1为一登录页面,输入正确ID和密码时能够登入网站。已知合理ID范围位于1-15,且在后端被解析为字符,尝试完成以下SQL注入任务:
Solution:(1)ID:1'--
Password栏随意输入即可。
成功登录网站后的截图:
(2)ID:1
Password:' or 1=1--
成功登录网站后的截图:
2. Practice2:尝试对搜索框进行SQL注入,从而获得未授权的数据库访问:
- 使用联合查询,在ID查询栏中输入适当的sql语句,根据回显内容获取当前数据库名称与版本;
- 使用联合查询,根据所获取的数据库名称,获取数据库中所有表名;
- 使用联合查询,根据所得user表中的列名称,获取所有用户名和密码。
Solution:(1)输入:1' and 1=2 union select database(),version()--
登录成功后界面:
(2)输入:1' and 1=2 UNION SELECT group_concat(table_name),2 FROM information_schema.tables WHERE table_schema='dbsec'--
登录成功后界面:
(3)输入:1' and 1=2 union select group_concat(username),group_concat(password) from users--
登录成功后界面:
3. Practice3:通过Cookie注入,实现在用户登入界面数据库名称的显示:
- 使用在Practice2中获取的用户名和密码,登入页面,然后在浏览器中对cookie的username字段的值修改为你的学号,刷新页面,查看修改后页面的变化并截图,记录在实验报告中;
- 构造合理的sql注入语句,将cookie中的username的值修改为注入语句,使得刷新后的页面显示数据库的名称。
Solution:(1)使用在Practice2中获取的用户名john和密码somesecrect登入界面:
查看其cookie并将cookie的username字段的值修改为21373202:
刷新页面,查看修改后页面的变化:
发现页面中显示的username已被更改,Your Login name、Your Password、Your ID行则未显示。
(2)修改cookie内容为注入语句:john' and 1=2 union select database(),2,3#
刷新页面,可以在Your ID一行看到数据库的名称为dbsec:
3.2 权限控制
实验基于Oracle数据库,具体实验指导查考:
1. 基于“最小权限”原则,对实验一的数据库用户设计合理的访问控制权限,要求如下():
- 创建一个用户OT1,使其仅拥有对OT用户的表CUSTOMERS,ORDERS, ORDER_ITEMS和PRODUCTS的SELECT权限;
- 创建一个用户OT_MANAGER,使其仅拥有对表EMPLOYEES的SELECT、UPDATE、INSERT、DELETE权限;
- 撤销用户OT的DBA权限;
- 创建一个角色OT_SELECT,要求仅有对表CUSTOMERS的CUSTOMERS,ORDERS,ORDER_ITEMS,PRODUCTS的SELECT权限,并将该角色授予OT1。
Solution:(1)创建用户OT1:
对用户OT1授权:
验证OT1的权限:
对表OT.CUSTOMERS执行查询操作如下:
可以成功查询。
但是,对表OT.CUSTOMERS执行删除操作时则显示权限不足:
执行创建表、修改表时同样如此。
(2)创建用户OT_MANAGER并对其授权:
验证OT_MANAGER的权限:
对表OT_EMPLOYEES的查询权限:
对表OT_EMPLOYEES的更新权限:
对OT的其余表则无权操作:
(3)撤销用户OT的DBA权限:
验证OT的权限:在pdb下进行查询:
撤销DBA权限之前,查询OT拥有的角色:
撤销DBA权限之后,查询OT拥有的角色:
(4)创建角色OT_SELECT并授权:
将该角色授予OT1:
验证用户OT1的权限:
对表OT.ORDER_ITEMS执行查询操作如下:
可以成功查询。
但是,对表OT.ORDER_ITEMS执行删除操作时则显示权限不足:
执行创建表、修改表时同样如此。
2. 针对Oracle数据库,对其进行基本安全加固,要求如下:
- 限制用户密码的复杂度(包括字母、数字和特殊字符等),设置每隔60天需要重新修改密码,如果用户密码连续输错3次就锁定用户(不能再登录),设置用户登录session空闲超时间隔为10分钟;
- 限制应用程序从某些固定的IP地址连接服务器。
Solution:(1)直接对profile DEFAULT进行修改:
ALTER PROFILE DEFAULT LIMIT
--限制用户密码的复杂度
PASSWORD_VERIFY_FUNCTION ora12c_verify_function
--设置每隔60天需要重新修改密码
PASSWORD_LIFE_TIME 60
--限制用户密码连续输错3次就锁定用户
FAILED_LOGIN_ATTEMPTS 3
--设置密码锁定时间为1天
PASSWORD_LOCK_TIME 1
--设置用户登录session空闲超时间隔为10分钟
IDLE_TIME 10;
在SQL命令行执行:
验证限制用户密码的复杂度功能是否生效:
可以看到口令需要满足长度大于8,同时包含数字、字母和特殊字符,并且不能包含用户名。
验证密码连续输错三次后账户将被锁定:
先赋予用户TEST_USER登录的权限:
然后登录TEST_USER用户并连续三次输错密码。第四次输入正确密码时,发现TEST_USER已被锁定。
(2)修改文件C:\app\Q\product\21c\homes\OraDB21Home1\network\admin\sqlnet.ora的内容,在最后添加两行内容:
TCP.VALIDNODE_CHECKING = YES TCP.INVITED_NODES = (127.0.0.1) |
3.3 数据库备份与恢复
1. 对实验一所用数据库,采用当前数据库用户OT进行备份,再使用与备份数据库不一样的用户名进行数据恢复(使用Oracle IMPDP/EXPDP进行备份与恢复),给出执行结果与验证截图。(提示:为了进行数据恢复,先做基于schema的数据备份,然后drop当前用户,新建用户,导入数据。 如果用户名、表空间名称不一致,可以使用REMAP_SCHEMA、REMAP_TABLESPACE 选择项进行映射。具体可参考实验指导手册。)
Solution:首先登录pdb并创建一个用户OT_BAK用于数据备份,然后在pdb创建备份的directory并对用户OT和OT_BAK授予读写权限:
然后登出pdb,使用EXPDP工具对用户OT的数据进行导出:
expdp ot/a@xepdb1 directory=DBBAK_DIR dumpfile=ot_bks.dmp logfile=ot_bk.log schemas='OT' |
可以看到执行成功。
查看C:\backup目录,发现已经生成了ot_bk.log和OT_BKS.DMP文件:
接下来将导出的备份数据使用IMPDP工具导入到用户OT_BAK中:
impdp OT_BAK/a@xepdb1 directory=DBBAK_DIR dumpfile=ot_bks.dmp logfile=test-imp.log remap_schema='OT:OT_BAK' |
可以看到执行成功。
再次查看目录C:\backup,可以看到已经生成了文件test-imp.log文件。
接下来在DBeaver工具中对比用户OT_BAK与用户OT中的数据是否相同:
用户OT的所有表及表CONTACTS内容展示如下:
用户OT_BAK的所有表及表CONTACTS内容展示如下:
其余表的内容将不再一一重复列举,进对比之后可以得知用户OT_BAK与用户OT的数据完全相同。