一、关于SQL注入漏洞
SQL注入是一种常见的web安全漏洞,利用这个漏洞可以访问或修改数据,或利用潜在的数据库漏洞进行攻击。
下面先简单了解一下
1.一次SQL注入过程:
2.SQL注入的本质:
数据与代码未分离,即将数据当成了代码来执行,即攻击者通过将恶意的SQL代码插入到用户输入或其他数据源中,改变了原有SQL语句的逻辑
3.SQL注入的必备条件:
①可以控制输入的数据
②服务器要执行的代码拼接了可控制的数据
4.SQL注入的危害:
①获取数据库信息(包括管理后台用户名和密码 以及 脱裤<即脱取数据库信息>)
②获取服务器权限
③植入Webshell,获取服务器后门
④读取服务器敏感文件
⑤“万能密码”
二、SQL注入之数字类型分类
一般主要分为字符型,数字型,搜索型和xx型
在此之前,我先简述一下抓包的过程:
抓包(以pikacha靶场为例,在Burpsuite上进行):
①首先打开pikachu靶场(在这里以字符型注入为例),在查询框里输入要查询的用户名
eg:vince
②紧接着打开Burpsuite,然后打开拦截器(看到如下图的 Intercept is on 即代表拦截器已打开,而Intercept is off 代表拦截器已关闭!)
在打开拦截器后一定要记得将火狐浏览器右上角的 bp(代表burpsuite在火狐浏览器中的拦截请求)打开!!!(如下图)
③点击查询后,你会看到如下图所示的拦截到的数据,即我们抓到的数据包!
然后在此页面的空白处单击右键,选中 Send to Repeater(即发送到重放器),如下图所示:
接着在 Repeater (即重放器)的左上角中找到 Send,并点击
然后在左半边的 Response 中找到Reader(即页面渲染),点击后即可呈现出用户名为 vince 的查询后的页面效果,如下图所示: 当然我们可以在右半边的 Request 中改变用户名的信息,再次按Send,然后查询页面渲染的效果,会呈现出相应的信息
接下来我们步入正题:
1.字符型(主要为get请求,以下图为例):
①首先以 vince 为例
当输入的用户名为 vince 时,经过抓包后得到的页面渲染效果:
②而当用户名输入为 xx' or 1=1 时,经过抓包得到的页面渲染效果是:它居然呈现出了所有用户的相关信息!!!
接下来我们来简单分析一下
打开后即可看到如下内容
下图即当用户名为 xx' or 1=1# ,拼接到语句里面的情况
并且 or 后面的 1=1 条件为真,数据库里面的数据信息都符合,所以它呈现出来所有用户的信息!(以上为个人在学习时的理解,若有错误,欢迎大家前来评论指正!!!)
在这里值得一提的还有对于 get 请求访问的要求:
如下图所示,我们可以看到 name= 的后面并不是我们在查询框里输入的 xx' or 1=1#,它是经过URL编码或是浏览器特殊处理的
对于get请求比较特殊,后面输入的数据不能有空格或是特殊字符
若有则不符合语法,这是要么会进行URL编码,要么浏览器进行特殊处理,对于其他请求(例如 post请求)可以空格
下面简述一下URL编码规则
*URL编码:
①将需要进行编码的字符替换:为其对应的编码形式,使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。
②对于URL中的保留字符,也需要进行编码。
③URL 不能包含空格,通常使用加号(+)或 %20 替代空格。
④其他字符出现在 URL 之中都必须转义,规则是根据操作系统的默认编码,将每个字节转为百分号(%)加上两个大写的十六进制字。
*关于注释符:
# :在SQL语句中使用#作为注释符号时,将#放在SQL语句的末尾,来注释掉后面的内容。eg:select id,username form users where id = 1 #id=admin,此时后面的部分被注释掉,不会执行。而且,在使用#进行注释时,#的后面不能有空格,否则会被浏览器解释为URL的一部分。
--(后面有空格):用于内联注释,即从“-- ”开始到行末的内容都会被数据库当作注释忽略。eg:在 select id,username from users where username = vince -- and username = admin 中,“-- ”后面的内容被注释掉,而改变了原SQL语句的逻辑
--+:和 “--(后面有空格)”的效果相同,主要用于在SQL语句中注释掉后面的内容,以改变原SQL语句的执行逻辑
/*/:在SQL中,/*/作为一种块注释符,在“/”与“*/”之间的内容会被当做注释而忽略,可用于SQL注入来改变SQL语句的执行逻辑。eg:在select id,username from users where username = 'vince'/ and username = ‘admin’ */中,and username = 'admin' 就会被注释掉,而不被执行
对于字符型注入我们还可以用引号测试来检测SQL注入点,具体如下图所示:
2.数字型
在这里以id=1为例
我们按照之前的步骤打开其脚本语言进行查看,在这里(即数字型注入)输入的数字拼接进去的语句与字符型注入的有所不同!!!直接是id=$id(变量),不用管有什么‘ ’闭合(字符型输入拼接时的)!!!
当把id改为 1 or 1=1 时
3.搜索型
在这里首先以用户名为vince为例,如下图:经过抓包后得到的页面渲染效果:
在这里我们依然可以按照前面的步骤打开其脚本语言进行查看,在这里(即搜索型注入)输入的用户名拼接进去的语句与字符型注入的有所不同!!!两边用%来闭合!!!
那么在这里简单地介绍一下通配符
*通配符
在SQL中,通配符主要用于模糊查询
①“%”(百分号):在 like操作符中使用,它可以代表零个、一个或多个字符,由于%为通配符,而通配符不能用=连接,所以select id,email for member where username like '%vin'; 代表是要在数据库里查询用户名中含有vin的 id,email 的信息',这条SQL语句会查找用户名字段中包含“vin”的所有记录,不管“vin”前面和后面有多少其他字符。
②“_”(下划线):也用于 like操作符,它代表一个字符。eg:“select id,email for member where username like 'vin_'”,会查找用户名为以“vin”开头,后面只有一个字符的记录,像“Vince”符合条件,而“vince”不符合。(在此只是以该查询语句为例进行说明,但在pikachi靶场中并不适用,因为在数据库中不含用户名为vinc的信息!!!)
在下面几张图片里我们可以看到在搜索框里不论是输入 vin ,vin%,%vin%还是%vin%%,搜索得到的数据都是一样的,而这正体现了上面所说的通配符%的作用效果!!!
4.xx型
在此还是以 用户名为 vince 为例:
打开其脚本语言进行查看
最后来介绍一下防止SQL注入的方法
*防止SQL注入的方法:
1.参数化查询:使用参数化查询可以避免SQL注入的风险,因为参数不会被解释为SQL代码。
2.输入验证:对所有输入进行严格的验证,确保输入符合预期的格式和类型。
以上为个人对SQL注入分类之数字类型分类的所学总结,若有叙述不正确或不恰当的地方,欢迎大家前来评论指正哦!!!