SQL注入漏洞处理
sql注入的概念
SQL注入(SQL Injection):它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
sql注入的场景
sql注入的分类
显注
显注是指攻击者能够直接从应用程序返回的错误信息或其他响应中获取 SQL 注入攻击的结果。这种情况下,攻击者可以通过观察应用程序的响应,直接获得攻击结果,如数据库中的数据、表名等。
显注通常发生在应用程序对用户输入的数据缺乏充分过滤和验证的情况下。攻击者可以通过向输入字段中插入恶意 SQL 代码来触发错误,从而获取有关数据库结构和数据的信息。
盲注
盲注是指攻击者无法直接从应用程序返回的响应中获取攻击结果,而是通过观察应用程序的行为或结果的不同来推断攻击是否成功,并最终获取攻击结果。
盲注通常发生在应用程序对用户输入的数据进行了一定程度的过滤或是针对错误进行了隐藏的情况下。攻击者需要利用不同的测试方法来验证注入点的存在,并逐步推断出数据库结构和数据。
sql注入的检测和修改
sql注入的检测
数字型
http://host/test.php?id=100 and 1=1 返回成功
http://host/test.php?id=100 and 1=2 返回失败
字符型
http://host/test.php?name=rainman ’ and ‘1’=‘1 返回成功
http://host/test.php?name=rainman ’ and ‘1’=‘2 返回失败
搜索型
3.1)先搜索('),如果出错,说明 90%存在这个漏洞。
3.2)然后搜索(%),如果正常返回,说明 95%有洞了。
3.3)然后再搜索一个关键字,比如(2006)吧,正常返回所有 2006 相关的信息。
3.4)再搜索(2006%‘and 1=1 and ‘%’=’)和(2006%‘and 1=2 and ‘%’=’)
绕过验证(常见的为管理登陆)也称万能密码
(1) 用户名输入: ‘ or 1=1 or ‘ 密码:任意
(2)Admin’ - -(或‘ or 1=1 or ‘ - -)(admin or 1=1 --) (MS SQL)(直接输入用户名,不进行密码验证)(3)用户名输入:admin 密码输入:’ or ‘1’=’1 也可以
(4) 用户名输入:admin’ or ‘a’=‘a 密码输入:任意
(5) 用户名输入:‘ or 1=1 - -
(6) 用户名输入:admin‘ or 1=1 - - 密码输入:任意
(7) 用户名输入:1’or’1’=‘1’or’1’='1 密码输入:任意
sql注入的修改
- 举例
String sql="SELECT * FROM userdata WHERE user="+user;
- 上面这条语句就存在sql注入漏洞,因为最后的use是用字符串拼接的,再看下面的写法。
String sql="SELECT * FROM userdata WHERE user=?";
- 上面的语句便不存在sql注入漏洞,那如何把参数写进去呢?通过PreparedStatement 的setString的方式。
PreparedStatement pst = connection.prepareStatement(sql);
pst.setString(1, user);
数据库加密
sha-256
SHA-256 是一种加密哈希函数,属于 SHA-2(Secure Hash Algorithm 2)家族的一部分。它接收输入,并输出一个固定长度的哈希值,通常为 256 位(32 字节)。
数据库脏数据
- 使用MySQL的事务管理机制
MySQL的事务管理机制可以帮助我们解决脏数据问题。事务是一组数据库操作,这些操作要么全部执行成功,要么全部执行失败。如果在事务执行过程中发生错误,MySQL会自动回滚事务,保证数据的一致性和完整性。在编写MySQL程序时,我们应该尽可能地使用事务来管理数据库操作,避免出现脏数据。
- 使用数据库备份恢复技术
ysqldumpch等。在备份MySQL数据库时,我们应该选择合适的备份方案,定期备份数据库,并保证备份的数据是完整的、可靠的
- 使用数据库监控工具
terpriseitor、Nagios、Zabbix等。通过使用这些工具,我们可以对MySQL数据库进行全面的监控和管理,及时发现并解决问题,保证数据的完整性和可靠性。
面试题
工作中安全测试的任务,怎么去做测试
我一般会确定我要做什么漏洞的测试,比如输入框我会想到xss或者sql注入,如果是登录的话或者是接口的话,我会想到是sql注入,接口越权;对于上传文件的地方,我会想到文件上传的漏洞,如果是xss,我会写一个脚本去测试是否会有弹窗,如果是sql注入的话,我会写一个’1or’1‘=1的payload去测试,我会构造一个请求去测试是否能够悄无声息的改掉密码。
sql注入原理和预防以及危害
原理:后端用了拼接sql语句的代码
预防:后端不用拼接sql语句的代码,可以改成参数的方式接受
怎么做测试sql注入:
对登录的密码框写一个 payload,看是否有sqlsyntax 的报错,或是直接绕过验证,登录成功,对接口中的参数写一个 payload 验证,以及搜索框中输入payload 查看送否有 sql syntax 的报错,或者直接查询出想要的数据,也可以在接口的参数中修改 payload再发送到后端去,查看是否有 sql语句的报错。