SQL注入基础知识
一、SQL注入的原理
(一)注入原理
1、一句话总结
sql注入存在于前后端数据交互中,前端用户输入的数据(或参数)没有经过严格处理,直接交给执行(即带入数据进行相关的操作)。
2、产生原因
后端接受前端用户相关的参数,没有经过严格的处理,就直接带入数据库操作。
3、SQL注入攻击的必要条件
- 明确web应用程序所使用的技术,例如php+mysql,asp+mssql等;
- 确定前端提交数据的方式与位置,方式例如post提交、get提交、cookies提交、ajax等;位置例如:登陆框、搜索框等;
- 查找存在注入点的位置,根据上面的信息,定位注入点,可以详细观察网站的报错页面;
(二)注入点存在的常见位置
- 登录验证模块
- 修改用户信息/找回密码模块
- 搜索模块/查询信息模块
- 留言版模块/留言删除
- 总结:凡是提交数据查询、数据插入、删除等与后端进行数据交互的位置,都有可能存在注入点。
(三)注入点判断(手工)
1、单引号法
在表单参数的后面添加一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该位置可能存在注入点。
- 这里需要注意,有部分网站进行了sql注入防护,这里会提示你输入参数不合法,这个时候就要使用另一种方法或进行绕过处理。
- 这里所指的表单参数,可以通过抓包后在burpsuite更改header头部、post参数、get参数、cookies参数等方式;也可以在相关的输入框直接输入。
2、逻辑判断法
可以输入and 1=1
和and 1=2
后提交页面,对比返回页面是否有不同之处,以此来判断是否存在注入点。
- 若这种方式依然被拦截,可以尝试编码处理等方式进行绕过。
(四)SQL注入攻击的准备工作
1、浏览器
-
火狐:安装hackbar可以进行注入攻击的调参
-
低版本的IE浏览器:配置显取消示友好http错误信息,能够更好的判断注入点是否存在,更加便捷的观察注入效果
#配置方法 #工具-->internet选项-->高级-->取消勾选“显示友好http错误消息”
2、工具
- Burp Suite:抓取数据包,修改请求参数
- SQLmap:自动注入攻击工具(单独模块总结)
(五)SQL语句的拼接原理(MySQL)
以DVWA漏洞实验平台为例子(php+mysql环境)
- 在查询框输入1,浏览器发送的url请求为
http://192.168.75.4:9500/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
- 而实际上,在网页后端将用户输入的参数1,拼接到后端程序中的SQL语句上,程序中的拼接语句如下(图中user和id中间少了个_):
-
而在数据库中的查询语句为:
mysql> select first_name,last_name from users where user_id = '1'; +------------+-----------+ | first_name | last_name | +------------+-----------+ | admin | admin | +------------+-----------+ 1 row in set (0.00 sec)
-
也就是可以在
id=1
这个位置,利用注释符号可以构造SQL注入语句,那么这样就能可以构造攻击语句:mysql> select first_name,last_name from users where user_id = '1' union select database(),user(); +------------+----------------+ | first_name | last_name | +------------+----------------+ | admin | admin | | dvwa | root@localhost | #这一行是正常语句无法查出的信息。 +------------+----------------+ 2 rows in set (0.00 sec) # 理解:1是正常的参数,1后面的都是我们构造的攻击语句,可以在输入框中输入 1' union select database(),user() #,为什么不用;,因为在编程语言中,传给后端执行,可加;也可不加,但是在mysql命令框中一定要加。
二、注入的分类(闭合方式)
(一)数字型注入
-
理解:输入的查询参数为数字型
mysql> select username,password from users where id=1; +----------+----------------------------------+ | username | password | +----------+----------------------------------+ | admin | e10adc3949ba59abbe56e057f20f883e | +----------+----------------------------------+ 1 row in set (0.00 sec)
-
例子:
(二)字符型注入
-
理解:输入的查询参数为字符串型
mysql> select username,password from users where username='admin'; +----------+----------------------------------+ | username | password | +----------+----------------------------------+ | admin | e10adc3949ba59abbe56e057f20f883e | +----------+----------------------------------+ 1 row in set (0.00 sec)
-
例子:
(三)搜索型注入
-
理解:输入的查询参数为模糊字段型
mysql> select username,pw from member where username like '%vince%' ; +----------+----------------------------------+ | username | pw | +----------+----------------------------------+ | vince | e10adc3949ba59abbe56e057f20f883e | +----------+----------------------------------+ 1 row in set (0.00 sec)
-
例子:
(四)xx型注入
-
理解:也称之为其他类型,输入的查询参数为需要用括号等闭合;
mysql> select username,pw from member where username=("vince"); +----------+----------------------------------+ | username | pw | +----------+----------------------------------+ | vince | e10adc3949ba59abbe56e057f20f883e | +----------+----------------------------------+ 1 row in set