(一)漏洞原理
1、 漏洞原理
SQL注入的原理是,是应用系统没有对传递的参数进行过滤,让参数直接拼接到SQL语句中,攻击通过对参数进行篡改,当参数传递到数据库中,逻辑上就会发生变化,就产生新SQL语句,造成一些不好后果
2、案例讲解
假如某业务查询功能,一般实现过程是:后端接受参数,带入查询语句中,再把查询内容返回前端,这是语句的实现:
$userID = $_POST['userID'];
$sql = "SELECT * FROM users WHERE userID = '$userID';
攻击者通过拦截到userID参数,对其植入恶意代码:userID = ' OR 1 = 1 --+
最终SQL语句变成:
SELECT * FROM users WHERE userID = ' ' OR 1 = 1 --+
这条 SQL 语句查询出了
users
表中的所有数据,因为OR 1=1
永远为真。攻击者可以进一步利用这个漏洞来获取更多的数据或执行其他操作,甚至删除数据表
所以,我认为SQL漏洞的本质,就是想进方法向参数中注入恶意代码,当参数传递到数据库中,SQL语句就发生了变化,执行之后就会产生SQL注入漏洞。
(二)漏洞分类
1、按照请求类型分类:
- GET型:通过修改URL中的参数值来注入恶意SQL语句。
- POST型:通过修改POST请求中的参数值来注入恶意SQL语句
- Cookie注入型:在请求头的Cookie参数中注入恶意的SQL语句,
2、按照字符类型分类:
- 数字型:攻击者试图将SQL代码注入到数字型的数据字段中。通常在后面加入测试语句:and 1=1
- 字符型:将SQL代码注入到字符型的数据字段中,通常在后面加入测试语句:’or 1=1
3、按照测试方法测试:
- 报错:这是基于应用程序在处理错误时返回详细信息的漏洞,通过构造恶意的SQL语句来触发应用程序产生错误,并从错误信息中获取敏感数据或执行其他恶意操作,
- 延时:这是一种利用在响应时间上的差异来判断漏洞的攻击方法,通过构造恶意的SQL语句,利用数据库管理系统的延时函数来判断查询是否成功执行,并据此推测SQL注入漏洞的存在,利用sleep()或benchmark()等函数让mysql执行时间变长
- 盲注型:攻击者无法直接从响应中获取有关注入结果的详细信息,然后通过构造特定的SQL语句,利用在不同条件下的响应差异来推断查询的结果,常用构建盲注函数:substr()、Left()、ORD()
- 布尔型:在响应中的布尔条件语句的结果来判断查询是否成功执行的一种攻击方法。通过构造恶意的SQL语句并观察应用程序的响应,来推断SQL查询的结果,结果根据false和true不返回数据库数据
(三)基本测试方法
1、SQL注入常出现位置:
只要需要带入到数据库中的参数有可能存在SQL注入,常见位置如下:
用户输入表单:用户可以通过网站的表单(如搜索框、注册表单、登录表单等)提交数据给服务器
- URL参数:URL参数是传递给应用程序的一种常见方式,产生url参数有两个来源,一是get请求会生成url参数,还有一个是隐藏的参数,网站使用隐藏字段来存储数据,这些字段可以在表单提交时自动包含在请求中。
- Cookies:cookies本身不会发生sql注入,可能会引发sql注入是因为,cookie是网络中识别用户身份的