sql注入的概念
==SQLI,sql injection==,我们称之为 sql 注入。Sql语言就是我们在管理数据库时用到的一种。在我们的应用系统使用 sql 语句进行管理应用数据库时,往往采用拼接的方式形成一条完整的数据库语言,而危险的是,并没有仔细考虑用户提交的数据是否合法,导致提交的恶意代码直接执行。在web安全中,产生的漏洞比如xss,文件上传,命令执行漏洞产生的原因都是注入恶意代码,并且要可以解析。
sql注入的分类
==基于从服务器接收到的响应==
1. 基于错误的SQL注入
2. 联合查询的类型,基于union
3. 堆查询注射,用分号连接两个sql语句
4. SQL 盲注,就是当网页并不将执行sql语句的结果输出,但是将sql语句执行了,这种sql注入称为盲注,盲注分为:基于布尔 SQL 盲注 , 基于时间的 SQL 盲注,基于报错的 SQL 盲注,
基于时间的盲注:通过mysql的函数sleep(time),根据时间延迟来判断提交的sql语句是否被执行。
基于布尔的盲注:通过and或者or然后在后面产生一个条件来通过页面是否正常显示来判断注入的语句是否执行。
基于错误的盲注:使用group by 对一些rand()函数进行操作时会返回duplicate key 错误,而这个错误将会披露关键信息.
==基于如何处理输入的 SQL ====
1. 字符型
2. 数字型
这两个主要是因为考虑到字符串的闭合问题,如果是字符型需要用单引号来闭合.
3.搜索型 比如拼接的语句是这样”select * from users where username like “+
name+”查找已
_name(变量)开头的username
==基于程度和顺序的注入 ====
1. 一阶注入(直接将注入的语句执行)
2. 二阶注入(比如说:在用户留言板或者评论区的sql语句,先插入数据库存储,然后展示的时候将这个内容直接从数据库拿出来,和查询的语句拼接在一起造成sql注入,通常这类漏洞比一阶注入常见,这类漏洞需要从源码审计挖掘)
==基于注入点的位置上的==
1. 通过用户输入的表单域的注射
- [ 比如说登录页面,用户名和password存在注入,就直接可以构造语句绕过登录认证]
- 通过 cookie 注射
- 通过http头
- [ 比如通过x-forwarded-for注入,通过x-forwarded-for可以伪造真实的ip,有时候在登录后台的时候,会验证你的真实ip,这个时候可以用burpsuit抓包修改这个参数来伪造ip,绕过认证 ]
sql注入产生的必备条件
1.变量接受
$_GET 接受get传递
$_POST接受post传递
$_COOKIE接受cookie传递
$_REQUEST 全部接受
- 带入数据库查询执行
- 不存在过滤(可尝试绕过)
mysql基础知识
数据库的结构
- Mysql5.0以上自带数据库:information_schema:存储mysql下所有信息的数据库(数据库名,表名,列名)
- information_schema.SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
- TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
字段名 | 介绍 |
---|---|
Table_schema | 数据表所属的数据库名 |
Table_name | 表名称 |
Column_name | 列名称 |
4. COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
函数介绍
函数 | 功能 |
---|---|
database() | 数据库名,当前使用的数据库 |
user() | 数据库用户,判断是否是root最高权限(读写文件的权限) |
version() | 数据库版本,Mysql5.0以上自带数据库information_schema |
@@version_compile_os | 操作系统,windows搭建的对大小写不敏感,linux下一定要注意大小写 |
@@datadir | 数据库路径 |