几乎OWASP每年的top 10 安全问题中,SQL注入 一直高居榜首,这也就成为了安全测试、渗透测试领域最为关注的一个点。
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
一、SQL注入的应用场景
1、对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle;
2、通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
3、SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程;
4、因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!
二、SQL注入的特点
1、拖库导致用户数据泄漏;
2、危害web等应用的安全;
3、失去操作系统的控制权;
4、用户信息被非法买卖;
5、危害企业及国家的安全。
三、SQL注入案例
下图是一段php的原码,其中对数据库的查询语句中直接使用了前端页面传递的表单数据。
如果我们前端页面输入一个正规的数据,user_id为1。
则执行:
select first_name,last_name from dvwa.users where user_id='1';
可以获得user_id为1的first_name和last_name并返回,这是我们正常使用系统并可以得到正常的结果。
1、注入布尔表达式的情况
但如果我们在前端页面输入user_id的数据为: ' or 1=1 -- '
即为:select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' '
则整个语句的意思是从数据库库的users表里面查询first_name,last_name两个字段的所有内容。
2、注入逻辑运算的情况
如果前端页面输入user_id的数据为:' and sleep(5) -- ''
即为:select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''
如果执行页面响应等待了5s则这个sleep(5)就可以更换为你希望的其他任何条件,从而获取到你不应该看到的数据。
3、注入union语句
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;
即为:select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- ''
里面的1,2,3 代表的是字段名,union语句查询的时候,前后的 字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。这里 显然只有两个字段。
四、SQL注入防范
1、用存储过程来执行所有的查询,使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
2、限制表单或查询字符串输入的长度。
3、检查用户输入的合法性,确信输入的内容只包含合法的数据。
4、将用户登录名称、密码等数据加密保存,加密用户输入的数据,然后再将它与数据库中保存的数据比较。
5、检查提取数据的查询所返回的记录数量,如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
源自公众号 软件测试藏经阁