SQL注入是所有WEB漏洞中最危险的攻击方式,带来的危害也是最大的。没有之一。
SQL注入基础
在编写web应用时,几乎所有的数据都存储在网站的数据库中,你的账号信息,收藏信息,文章信息等等数据都存在数据库当中。
我们常看到同一个网站,不同人登录后显示的页面是不同的,这些不同便在于不同用户所拥有的数据。
网站并非是为每个人单独去写一个个的页面,而是通过脚本语言,通过与数据库交互(传入相关信息,数据库对所传入的信息进行搜索,数据库返回搜索结果),之后脚本语言把结果显示在一个页面的模板上。这样每个人看到的页面就是不同的了。
public function delAllCate($cate_id){
// 此时$cate_id是一个数组,需要先转换为字符串
$cate_id = implode(',', $cate_id);
$sql = "delete from bg_category where cate_id in($cate_id)";
return $this->dao->my_query($sql);
}
这是一个php的数据库交互函数的例子,其中$cate_id是通过post传入的参数,利用字符串拼接的方法,把这个 $cate_id 变量字符串写到对应的地方,之后执行这条语句,并返回对应的结果。
如果我们不按照规矩传呢?我们通过劫持流量修改其中的post数据中的cate_id呢?这会引发一系列后果。
漏洞原理
通过用户可控参数中注入SQL语法,破坏原有的SQL结构,进行攻击的方法。
造成原因:
-
程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造SQL语句。
-
未对用户可控参数进行足够的过滤便将参数内容拼接到SQL语句中。
注入位置
在Web应用获取用户数据的地方,只要存在数据库查询交互,都有可能存在SQL注入的可能。
- Get数据 ?user=123456&pass=admin
- POST 数据
- HTTP 头部请求报文
- Cookie 数据
- .....其他一系列数据交互的地方,尤其是表单,搜索框注入,留言板注入。
漏洞危害
-
利用SQL漏洞,可以得到数据库中的多种信息,将数据库的信息完全暴露出来。
-
特别情况下可以删除数据库中的信息以及在数据库中更新或者插入数据。
-
如果数据库权限分配存在问题,或者数据库本身的缺陷,攻击者可以通过SQL注入漏洞直接获取WebShell, 服务器系统权限。
SQL注入类型分类
数据类型: 数字型(无引号包裹),字符型(引号包裹),日期型。
注入手法:
- Union query SQL injection 联合查询
injection 英[ɪnˈdʒekʃn] n.注射; 大量资金的投入; (液体)注入,喷入;
- Error-based SQL injection 报错注入
- Boolean-based blind SQL injection 布尔型注入
- Time-based blind SQL injection 延时注入
- Stacked queries SQL injection 堆查询注入
MySQL知识点
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。开源。
Github用的就是ruby+Mysql
MySQL注释
#
-
--
杠杠空格。 -
/* */
多行注释
MySQL 元数据库 information_schema
MySQL 常用参数和函数
函数名 | 描述 | 实例 |
---|---|---|
RAND() | 返回 0 到 1 的随机数 | SELECT RAND() --0.93099315644334 |
DATABASE() | 返回当前数据库名 | SELECT DATABASE(); -- runoob |
USER() | 返回当前用户 | SELECT USER(); -- guest@% |
VERSION() | 返回数据库的版本号 | SELECT VERSION() -- 5.6.34 |