又到暑假了,仿佛寒假才刚刚过去呢🤣。
接着前面的学习进度,在接下来的一段时间,我们来看看SQL注入相关的知识。
由于SQL注入涉及到的内容非常多,所以我将内容分成了几个模块,当前模块主要讲讲SQL注入的基本原理。
前置知识
想要学走,必须先学会爬,想要学好SQL注入,SQL语句不会是不行的。
在学习SQL注入之前,你必须掌握:
- 基本的SQL语句
基本的增删改查
条件查询、联合查询、子查询、分组查询、分页查询 … - 基本的SQL函数
可以参考sql注入常用函数进行学习
Ps:学习函数的时候一定要自己敲一遍,不能看一遍就带过了 - python语言和简单的爬虫(requests库)
在学习盲注的时候要自己写脚本注入,所以python代码要会写,requests库要会用
加油,奥利给!
sql注入漏洞被利用的过程
sql注入是一种注入型漏洞,其本质是服务器把用户可控的数据拼接后当成sql语句执行。
- 客户端在可以控制的参数处构造sql注入语句并发送给服务器
- 服务器接收到客户端的数据后没有经过严格过滤处理,将其拼接到将要执行的sql语句中
- 数据库引擎执行服务器传来的sql语句,将结果返回给服务器
- 服务器接收到结果后进行一系列处理,之后返回内容给客户端
- 客户端接收到服务器返回的内容,根据内容判断注入结果和构造下一步的sql注入语句
这样来看,sql注入攻击的其实是数据库引擎,其根本原因就是服务器没有对客户端传来的数据进行严格的过滤和处理。
SQL注入的分类
按照上面sql注入的过程,
从客户端->服务端,可以分为:post注入、get注入、cookie注入、http头注入 …
从服务端->数据库引擎,可以分为:数字型注入、字符型注入 …
从服务端->客户端,可以分为:回显注入、盲注 …
按照SQL注入利用方法,又可以分为:联合查询注入、报错注入、布尔盲注、延时盲注、堆叠注入 …
虽然有很多种分类,但只要掌握到SQL注入的本质,这些不同类别的注入就都很好理解。
SQL注入的作用
在CTF中,SQL注入可能的用途主要有:
绕过登录验证:使用万能密码登录网站后台等
获取敏感数据:获取网站管理员帐号、密码等
文件系统操作:读取、写入文件等
一个例子
网站登录验证最简单的代码一般是这样的
1 |
|
其中$username
和$password
是用户传进来的用户名和密码,是用户可控的内容。
正常情况下,用户必须输入正确的用户名和密码才能使这个sql语句有查询结果,否则查询结果为空,服务端也是根据这个来进行登陆的验证。
但是,如果用户将用户名设置为admin
(一般的管理员账号),将密码设置为' or 1=1#
,将绕过登录验证,直接以admin账号登录成功。
这是因为这里服务器直接将用户输入的$username
和$password
拼接到$sql
中,此时的$sql
变量内容为
1 | select * from users where username='admin' and password='' or 1=1#' |
很容易看出,这时的sql语句结构发生了变化,功能也和原来不同了。
简单分析一下,语句从users表中查询满足条件的内容,条件为username='admin' and password='' or 1=1
(由于#
在sql语句中是注释符,所以后面的单引号没有作用)
因为 sql 语句中or
的优先级高于and
,所以这里的条件可以改成username='admin' and (password='' or 1=1)
,后面的password='' or 1=1
中1=1
永远为真,所以条件语句又等价于username='admin' and 1=1
,即username='admin'
所以,整个sql语句变成了select * from users where username='admin'
,从而达到以admin用户登录的目的。