初学SQL注入

Posted bisal的个人杂货铺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学SQL注入相关的知识,希望对你有一定的参考价值。

点击标题下「蓝色微信名」可快速关注

预计阅读时间:5分钟


SQL注入是比较常见的网络攻击方式之一,他不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。


当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的 字符串来传递,也会发生SQL注入。SQL注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码, 根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了。


SQL注入攻击的总体思路,

1、寻找到SQL注入的位置

2、判断服务器类型和后台数据库类型

3、针对不通的服务器和数据库特点进行SQL注入攻击


一个简单的例子,

SQL> create table account(id number primary key, name varchar2(10), password varchar2(20));
Table created.

SQL> insert into account values(1, 'bisal', '111111');
1 row created.

SQL> commit;
Commit complete.

SQL> select * from account;
       ID NAME       PASSWORD
---------- ---------- --------------------
        1 bisal      111111

SQL> select * from account where name='' or 1=1 -- and password='';
       ID NAME       PASSWORD
---------- ---------- --------------------
        1 bisal      111111


条件后面"username='xx' or 1=1",用户名等于“空 or1=1",因为1=1恒为ture,那么这个条件一定会成功,另外,后面加两个“-”,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。


SQL注入漏洞存在的原因,就是拼接SQL参数。也就是将用于输入的查询参数,直接拼接在SQL语句中,导致了SQL注入漏洞。例如,

select id,password from user where id=2;


如果该语句是通过sql字符串拼接得到的,例如,

String sql = "select password from user where id=" + id;


其中的id是一个用户输入的参数,那么,如果用户输入的是“2 or 1=1”进行sql注入攻击,上面的语句(select id,password from user where id=2 or 1=1;),就将user表中的所有记录都查出来了,这就是典型的sql注入。


试想,如果用户输入的,是一些危险操作,例如drop table,通过SQL注入的攻击,就不仅仅是数据的泄露,有可能是对数据库的破坏。


至于解决方案,有人总结过,

1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。

2. 永远不要使用动态拼装SQL,可以使用参数化的SQL(绑定变量)或者直接使用存储过程进行数据查询存取。

3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

6. SQL注入的检测方法一般采取辅助软件或网站平台来检测。


关于SQL注入的学习,

1. Sqli-labs

Sqli-labs是一个印度程序员写的,用来学习sql注入的一个游戏教程,可以本地安装,浏览器进行访问,学习各种SQL注入的案例,

https://github.com/Audi-1/sqli-labs

2. OWASP

关于信息安全,OWASP(Open Web Application Security Project)是一个开源组织,会有各种开源的项目,可以参加,或是有条件使用,有兴趣可以看,

http://www.owasp.org.cn/owasp-project

以上是关于初学SQL注入的主要内容,如果未能解决你的问题,请参考以下文章

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

Java代码审计连载之—SQL注入

SQL注入现象_实例总结