一、sql注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
即把sql命令插入到web的请求表单中,欺骗服务器,以此来获取服务器的数据和权限。
二、sql注入的分类
根据数据的分类:整型
字符型'',"",(''),("")
根据数据的传输方式:GET,POST,COOKIE
根据注入的模式:基于联合查询的注入模式
基于报错的注入模式
基于布尔的盲注
基于时间的盲注
堆查询的注入模式
三、sql注入一般步骤
求闭合字符
选择注入模式
爆数据库
爆表名
爆列名
爆字段
四、sql注入相关
union联合查询:
union操作符用于拼接两个或者多个select查询语句
union中的每个查询必须拥有相同的列数
![](https://i-blog.csdnimg.cn/blog_migrate/fcfccbb6399af3c9a2184ebc2b7d5f2b.png)
order by语句
order by 语句用于根据指定的列对结果集进行排序
order by语句默认按照升序对记录进行排序
在sql注入中常用来二分法判断表的列数
![](https://i-blog.csdnimg.cn/blog_migrate/763190b3a84266e71c1b3fcd624a5510.png)
sql注入中一些常用的mysql函数/语句
函数/语句 | 功能 |
user() | 当前用户名 |
database() | 当前所用数据库 |
current_user() | 当前用户名(可用来查看权限) |
version() | 数据库的版本 |
@@datadir | 数据库的路径 |
load_file() | 读文件操作 |
into outfile()/into dumpfile | 写文件操作 |
注释在sql注入中的作用
在原来的sql语句中插入payload,攻击者注入一段包含注释符的sql语句,将原来的语句的一部分注释,注释掉的部分语句不会被执行。
select user from student where id =1 limit 0,1;
select user from student where id =1 and 1=2 union select user() # limit 0,1;
sql注入读写文件的根本条件
数据库允许导入导出(secure_file_priv)
当前用户文件操作权限(File_priv)
![](https://i-blog.csdnimg.cn/blog_migrate/599704567748bbc773c031f30a8627d5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8c91fd0cb50498fc18c8767df902baed.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2978e39e1722a7031c4239bd47a8331.png)
secure_file_prive参数的设置 | 含义 |
secure_file_prive=null | 限制mysqld不允许导入导出 |
secure_file_priv=/tmp/ | 限制mysqld的导入导出只能发生在/tmp/目录下 |
secure_file_priv='' | 不对mysqld的导入导出做限制 |
secure_file_prive直接在my.ini文件里设置即可
五、sql注入经常出没的地方
内部实现/流程的角度 | 业务点 |
url传参 | 新闻/商品等查询处 |
表单post | 用户注册/登录处 |
Cookie | 修改用户资料处 |
User-Agent | 找回密码处 |
X-Forwarded-For | 搜索框 |
........ | ...... |
六、本质
把用户输入的数据当作代码执行。
两个关键条件:
用户能够控制输入;
原本程序要执行的代码,拼接了用户输入的数据。
七、sql注入防御
(1)PreparedStatement
(2)使用正则表达式过滤传入的参数
(3)字符串过滤
(4)Jsp中调用该函数检查是否包函非法字符
(5)JSP页面判断代码: