SQL注入原理篇
介绍SQL注入
0x00
摘要:日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话“出来混的,迟早是要还的”,所以我想通过专题博文介绍一些常用的攻击技术和防范策略。
SQL Injection也许很多人都知道或者使用过,如果没有了解或完全没有听过也没有关系,因为接下来我们将介绍SQL Injection。
0x01
SQL注入就是指web应用程序对用户输入数据的合理性没有明确判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
0x02
一般情况下,开发人员可以使用动态SQL语句创建通用,灵活的应用。动态SQL语句是在执行的过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行的过程中需要根据不同的查询标准决定提取什么字段(如select语句),或根据不同的条件选择不用的查询表时,动态的构造SQL语句非常有用。
下面以PHP语句为例
$qurey = "SELECT" *from users WHERE id = $_GET['id'];
由于这里的参数ID可控,且带入数据库查询,所以非法用户可以任意拼接SQL语句进行攻击
0x03
当然SQL注入按照不同的分类方法可以分为很多种,如报错注入,盲注,Union注入等
后面我会慢慢的更新
SQL注入原理
1x01
SQL注入漏洞产生需要满足以下两个条件
1.参数用户可控:前端传给后端的参数内容是用户可以控制的。
2.参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
当传入的ID参数为 1' 时,数据库执行的代码如下所示
select * from users where id = 1'
这不符合数据库语法规范,所以会报错。当传入参数为 and 1=1时,所执行的SQL语句如下所示
select * from users where id = 1 and 1=1
因为and 1=1为真,且where语句中的id=1也为真,所以页面会返回与id=1相同的结果。
当传入ID参数为 and 1=2 时,由于and 1=2 不成立,所以返回为假,页面就会返回与id=1不同的结果
1x02
由此可以初步判断ID参数存在SQL注入漏洞,攻击者可以进一步进行拼接SQL语句进行攻击,导致数据库信息泄露,甚至进一步获取服务器权限。
在实际环境中,凡是满足上述两个条件的参数皆有可能存在SQL注入漏洞,因此开发者需要秉持“外部参数皆不可信的原则”进行开发