前言
SQL注入(SQL Injection)一直是WEB安全中常谈到的一个漏洞,在网络中,数据库常支持着Web应用,因此而存在的SQL注入是最容易影响企业运营和最具破坏性的漏洞之一。
漏洞原理
1.什么是SQL?
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
2.什么是SQL注入
SQL注入就是一种通过操作输入来修改服务器后台的SQL语句,通过执行输入的代码来达到攻击的目的。
3.SQL注入是怎样产生的呢?
在目前的Web应用中,数据库常用于存放用户的信息和一些关键的数据,那么就很容易涉及到数据的增加(注册操作)、删除、查找(搜索操作)等,这些对于编程人员来说,都属于可控变量,使用者是可以对这些变量进行操作的,甚至能写入一段代码,所以当攻击者写入一段合理的SQL语句的时候,数据库就会给出响应,甚至能读取到管理员的信息等等。
注入思路
这里主要介绍最基本的SQL注入,像报错注入、布尔型注入、时间注入都是在SQL注入的基础上的一些变形。
下面是lamp环境下DVWA的low级别SQL注入思路:
先看看在low环境下,源代码是如何执行查询操作的:
1 | $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; |
代码的意思就是会把用户输入(可控变量)直接进行查询,但是在进行黑盒测试和CTF比赛中,我们是看不到这些代码的,或者只能看到部分代码,所以我们只能逐个去寻找注入点,而这题的注入点就在$id中,
Ⅰ.找注入点。输入1时,回显正常,尝试输入1’出现上图的报错,输入1’ #时回显正常,说明该处存在SQL注入漏洞。(1’ 的存在是为了闭合前面的 ‘ ,当闭合了前面的 ‘ 后,因为多出的一个 ‘ 数据库会进行报错 ,那么我们只要用注释符#,就能将该行后面的代码注释掉,解决报错)
Ⅱ.猜解字段数,爆用户名、数据库名和版本信息。order by子句,能通过报错来判断该数据表的(字段数)列数,通过联合查询union select的方式,和user(),database(),version()_os等函数,查到该数据库的关键信息。
Ⅲ.爆表名、列名。通过schema结构爆出数据库中所有的数据表和选定数据表中的列名。(这里以user表为例)
Ⅳ.获取列下的信息,成功爆出用户名和密码。
总结
这里主要了解SQL注入的原理,关于如何防护,就不做详解。