几张图带你了解SQL 注入

几张图带你了解SQL 注入 我终于明白 SQL 注入为什么会出现了最近在学习 Web 安全。按照学习路线学完文件上传和文件包含之后终于开始接触大家经常提到的SQL 注入SQL Injection。说实话在没学之前我一直觉得 SQL 注入很神秘。网上经常能看到各种专业术语联合查询报错注入布尔盲注时间盲注看得人头都大了。后来真正开始学习后我发现SQL 注入最核心的东西其实一点都不复杂。甚至可以用一句话概括用户输入的数据改变了数据库原本想执行的语句。今天就记录一下我最近学习 SQL 注入时的理解。一、学 SQL 注入之前先要知道数据库是什么以前我一直以为网站的数据都存在网页里面后来才知道。真正的数据其实都在数据库里。比如一个登录系统。数据库里可能有这样一张表idusernamepassword1admin1234562testabc123这张表通常叫users里面存放用户名密码用户信息当我们登录网站的时候网站其实是在数据库里查询SELECT * FROM users;简单理解就是把 users 表里的数据找出来。二、什么是 SQLSQL 的全称是Structured Query Language中文一般叫结构化查询语言。它是数据库沟通的语言。比如查询用户SELECT * FROM users;查询管理员SELECT * FROM users WHERE usernameadmin;删除数据DELETE FROM users;修改数据UPDATE users SET password123456;学习到这里的时候。我突然意识到数据库其实就像一个大型仓库而 SQL 就是操作仓库的指令。三、SQL 注入为什么会产生这里也是我最近最大的收获。假设有一个登录功能。用户输入用户名密码服务器收到后可能会生成类似这样的查询SELECT * FROM usersWHERE usernameadminAND password123456;本意很简单。就是验证账号密码是否正确。问题在于用户名和密码来自用户输入。如果开发者直接把用户输入拼接到 SQL 语句中。那么用户输入就有可能影响整个 SQL 结构。这也是SQL 注入出现的根本原因。四、我发现 SQL 注入和 XSS 很像学到这里的时候我突然想到之前学的 XSS。XSS 的本质是用户输入影响浏览器执行逻辑。而 SQL 注入的本质是用户输入影响数据库执行逻辑。两者其实有一个共同点以前总觉得漏洞之间毫无关系。现在越来越发现很多漏洞背后其实是同一种思路。五、为什么开发者会中招因为很多时候。开发者认为用户应该正常输入内容例如用户名admin密码123456但现实情况是。服务器永远不能假设用户一定会正常输入。因为用户输入的内容可以是数字可以是符号可以是特殊字符也可能是完全超出预期的数据如果程序没有做好处理。风险就出现了。六、学习 SQL 注入后我对网站运行有了新的理解以前学习 Web 安全总感觉是在背漏洞。今天学 XSS。明天学文件上传。后天学 SQL 注入。学着学着容易混乱。但现在慢慢发现这些漏洞背后其实都在说明同一件事服务器需要处理用户输入。而安全问题往往出现在服务器错误地相信了用户输入。这也是我最近最大的认知变化。七、为什么不要急着背各种注入技巧刚开始学的时候。我也想直接去看联合查询报错注入时间盲注后来发现如果连数据库是什么都没理解那些内容基本都是死记硬背。真正重要的是先搞懂数据库如何存储数据SQL 如何查询数据用户输入如何进入 SQL 语句把这些理解清楚之后。后面的各种注入类型其实只是不同场景下的表现形式。八、最后以前我一直以为 SQL 注入是一个非常复杂的漏洞真正开始学习之后才发现。它最核心的问题其实很简单服务器把用户输入当成了可信数据而用户输入又参与了 SQL 语句的构造最终导致数据库执行了开发者原本没打算执行的逻辑。所以现阶段对我来说比起记各种技巧更重要的是先理解数据库到底是怎么工作的。因为只有理解原理后面学习 SQL 注入的时候才不会变成机械背诵。