SQL injection(SQL 注入攻击) 原理浅析

1.database 数据库

A database is an organized collection of data. The data is typically organized to model aspects of reality in a way that supports processes requiring information.

数据库,简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。

数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

2.SQL语句

结构化查询语言(英语:Structured Query Language,缩写:SQL),是一种特殊目的之编程语言,用于数据库中的标准数据查询语言,IBM公司最早使用在其开发的数据库系统中。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

sql 主要用于对数据库进行一些数据的增、删、改、查操作,数据库管理员使用sql语言对数据库进行管理,部分数据的使用者,使用sql查询获取自己需要的数据。

假设我们拥有一个学生信息管理系统,其中有一张表存储学生的基本信息,

表名 STUDENT_INFO

字段 stuid,name,sex,hometown(对应:学号,姓名,性别,籍贯)

STUDENT_INFO

stuid name sex hometown
1 Tom M LA
2 Andy F NY
3 Sam M Seattle
1
2
3
4
5
SELECT * FROM STUDENT_INFO ; -- 查询表中所有记录

SELECT name FROM STUDENT_INFO; -- 查询表中所有姓名记录

SELECT hometown FROM STUDENT_INFO where name='Tom'; -- 查询出Tom的家乡

3. SQL injection

sql 注入攻击是黑客常用的数据库攻击手段,通过对sql 查询语句的重组与技巧性“填空游戏”,来获取非正常途径下数据库返回的信息。

通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

假如现在需要查询Tom的家乡信息,标准语句

1
SELECT hometown FROM STUDENT_INFO where name='Tom'; -- 查询出Tom的家乡

现在再拼接出另外一条语句,获取所有人的家乡信息

1
SELECT hometown FROM STUDENT_INFO where name='Tom' or '1'='1';

就这样,原本只能获取到Tom的家乡,现在变成能够获取到所有人的家乡信息了,如果这个信息是个人电话号码、身份证号等其他敏感信息,后果不堪设想;

where 语句后是一个逻辑判断 原来只有当名字为Tom时,才会返回对应查询的内容,现在拼接了一个‘1’=‘1’,这个等式是恒为真的,所以where后面的语句也就始终为TRUE;

如果这条查询语句是嵌入到Web页面用来查询某网站的语句,本来返回的是个人信息,这么一玩,就可以拿到当前网站数据库中所有其他用户的信息了

现在剥离sql语句,如果表单中只让我们填写要查询的对象“Tom”,要怎么拼接语句

你在表单中填写 Tom ,系统会自动将 Tom 用两个单引号 ‘’ 括起来 ‘Tom’ 再接入到sql语句中去,

这个时候,填空游戏来了, 在表单中填的就不能是where后面的所有字符了, 就变成 Tom‘ or ‘1’=’1 去掉了前后的两个单引号;

4.Reference

Database wikipedia
数据库 维基百科
SQL wikipedia
SQL 维基百科
SQL 百度百科
SQL注入攻击 百度百科
SQL 注入攻击 维基百科
SQL injection wikipedia