什么是sql注入?

既然你会来看这篇文章,说明你和写这篇文章时的我一样,是个安全小白。不管你是以何种原因想要了解“什么是sql注入”,我都希望这篇文章尽可能地会给你一点收获。

两个通俗的概念

SQL 注入就是指 web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 sql语句来实现 对数据库的任 意操作。

又或者说

通过把sql命令插入到Web表单提交或输入域名或页面请求的查询字符串中,最终欺骗服务器执行恶意的SQL命令
在这里插入图片描述
如果你有有一些开发的基础知识,会很容易地理解SQL注入地概念,笼统地说,当你动态地请求服务器器时,会有数据交互的过程。上图是PHP链接MySQL的源码,可以再任意SQL注入靶场中查看。总的来说,SQL注入就是可控变量,被带入数据库查询了。(2021.9.30加)

当你浏览一些网页,它们大都会提供一个查询的功能,比如你打开一个视频网站,你可以通过搜索“xxxx”,来获得你想要的视频。这期间大概发生了这样一些事:你按下回车键,一个带有你输入的关键字的HTTP请求发送到服务器,业务逻辑层的Web服务器通过脚本引擎解析你的请求,动态地构造sql语句,并请求DBMS,执行SQL语句。DBMS返回SQL执行结果给Web Server,Web Server将页面封装成HTML格式响应给浏览器,浏览器解析HTML,将内容呈现给你。
要看懂上面这段话,你得需要一点计网、数据库和中间件的知识。现在,你只需要把不懂的知识封装成一个黑盒子,这个黑盒子提供了一些需要的功能。
在这里插入图片描述
那么,sql注入,就是发生在动态构造SQL语句,并将执行结果返回Web Server的这个过程。因为没有对用户输入的数据进行过滤,把恶意构造的参数带入了DBMS进行查询,实现第数据库的恶意操作。

SQL注入是怎么发生的?

如果你读懂了上面的话,你会说,哦,这就是SQL注入啊。当转念一想,你还是发现自己不懂“什么是SQL注入”。接下来,你可能需要一点数据库的知识,特别是MySQL。

MySQL有一个系统库 information_schema,存储着所有的数据库的相关信息。
可以利用该库进行一次完整的注入。以下为一般流程:
猜数据库:
select schema_name frominformation_schemata
select database()
猜某库的数据表 select table_name from information_schema.tables where table_schema=‘xxxx’
猜某表的所有列 select column_name from information_schema.columns where table_name=‘xxxxx’
获取某列的内容
select **** from *****

开始我们的SQL注入:
你最好在自己下载的数据库里尝试。
假设有一张学生表,你想查询名字为张三的学生,你会这样写:

select * from student where name = '张三'; 

也许在前端界面,你只是输入了一个“张三“,浏览器获取你的输入存在一个变量$input里,将这个变量传给脚本引擎,脚本引擎不做任何处理,直接将你的输入值动态地构造一条SQL语句,比如:

$sql = "select * from student where name = 'input'";
$result = mysql_query($sql);

上面这句代码是PHP语言对数据库的操作,不懂为什么可以这样?可以学一下ODBC或JDBC,现在,它只是个黑盒子。通过mysql_query()这个函数,$sql变量的语句被传入MySQL数据库进行执行。一切都那么完美。但是,如果你输入的是

张三'    //仅仅多了一个单引号

那么上面的语句就会变为

$sql = "select * from student where name = '张三''";

相当于在数据库进行了如下查询:

select * from student where name = '张三'';

你输入的单引号,闭合了前面原语句的单引号,后面的单引号就多出来了,此时报错。
那这有什么用呢?这太有用了。因为你可以闭合前面的子句,后面就可以拼接一切你自己构造的合法语句,并在最后加一个“ --+” 以注释后面复杂的内容,比如

select * from student where name = '张三' union select 1,2,x,x --+

这下来,你可能真的懂得了“什么是SQL注入”

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐