十七、SQL注入(SQL Injection)-Low
大约 2 分钟
十七、SQL注入(SQL Injection)-Low
一、漏洞原理
在动态网站中,前端页面会通过post/get等方法向后端传递参数,后端代码将参数值与SQL查询语句进行拼接,然后对数据库执行查询操作,最后将查询结果返回给前端页面。
在上述过程中,如果不对前端传递的参数值进行检查和过滤,攻击者就会构造恶意的参数值,与查询语句拼接在一起对数据库进行攻击。
Low级别是直接将参数id的值拼接到SQL查询语句中,并且没有对参数id的值做任何限制。
二、漏洞利用
Low级别模块提供的功能是用户输入用户ID后提交给后端,后端使用ID的值来查询用户信息,并将查询结果返回到页面上。这里我们可以输入的用户ID为1、2、3、4、5。
比如我们输入1时,SQL查询语句可以拼接成
SELECT first_name, last_name FROM users WHERE user_id = '1' ;
此时查询结果返回ID为1的用户信息
但当我们输入1' or 1 = 1 #时,SQL查询语句就被拼接成了
SELECT first_name, last_name FROM users WHERE user_id = '1' or 1 = 1 #';
源代码中的$id变量就被1' or 1 = 1 #替换掉,拼接完成后通过or关键字进行逻辑判断,绕过对第一个条件的判断。
根据or关键字的逻辑判断规则,不论第一个参数是否为真,只要第二个条件为结果永远为真即可查询所有信息,因此第一个参数填写什么无所谓,关键在于第二个判断条件要永远为真。
因为1=1的结果永远为真,所有执行上述查询语句后会返回所有用户的信息,导致了数据库所用用户信息的泄漏,实现了SQL注入攻击。
三、防御手段
造成SQL注入的原因在于没有对前端输入的内容进行限制,也没有在后端对前端传递的参数进行安全处理,有效的防御措施包括一下几点,因后台使用的开发语言不同实现起来也有差异,需要在具体开发时注意。
使用参数化查询
对输入进行验证、过滤或编码
使用ORM框架
使用存储过程
Loading...