每天努力一点点,坚持下去 ------ 博客首页

SQL注入基础

一、SQL注入简介

1、SQL注入的地位

  • 一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

OWASP开发Web应用安全工程排名对比表(安全漏洞排在前十的类型)

注入的排名下降到第3位,测试发现有94%的应用存在注入漏洞,跨站脚本攻击也被归类到注入漏洞。

访问控制失效从第5位上升到了第1位,94%的应用程序都经过了某种形式的访问控制失效测试。

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

1、对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2、使用参数化(Parameterized Query或Panameterized Statement);

3、还有就是,目前有很多ORM框架会自动使用参数化解决注入问题;

当在查询框中输入:1 or 1=1#,所有的数据都会被搜索出来

 这是为什么呢?

因为,后端是:SELECT name FROM `user` WHERE userid = '%s' #若userid = 1 or 1=1,因为1=1是真,就会查询到所有的;

如果后端进行了处理带有【or】就会屏蔽掉,就不会出现这样的情况,就是合理的,但我们刚刚的是没有做这样的处理,直接拼接了,从而导致查询到的是所有用户的信息。

有的框架是直接避免了SQL注入的一些安全问题,可以确认一下,使用的什么框架的开发的,是否已经处理了哪些SQL注入的问题

2、SQL注入的注意事项

  1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等

  2. 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取

  3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接

  4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息

  5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

3、SQL注入的分类

按参数注入

按注入位置

按结果反馈

其他

数字型注入 GET注入 盲注 延时注入
字符型注入 POST注入 非盲注 搜索注入
  Cookie注入   编码注入
  HTTP请求注入   堆查询注入
      联合查询注入
      多阶注入

 

按参数注入:通过【文本框】进行输入

二、MYSQL基础知识

1、MySQL的注释

  1. #:注释从'#'到该行末尾
  2. --:注释从'--'到该行末尾/**1:注释一个范围内字符的用法,可以用于sql语句中
  3.  /**/:注释一个范围内字符的用法,可以用于sql语句中()

 // 在mysql中如何写注释语句

  • mysqI> SELECT 1+1;    # 这个注释直到该行结束
  • mysqI> SELECT 1+1;    - 这个注释直到该行结束
  • mysqI> SELECT1           /* 这是一个在行中间的注释 */ + 1

 2、常见元数据查询语句

  • 元数据是关于数据的数据,是描述数据库内数据的结构和建立方法的数据,如数据库名(schema_name)、表名table name )、列的字段名(colunmn name)或访问权限等。【INFORMATION SCHEMA 数据库】是MVSQL自带的,它提供了访问数据库元数据的方式。
select database(); #查看使用中的数据库,需先use数据库,要不然返回是空
select version();#查看数据库版本
desc table_name  #查看此表的所有字段
select schema name from information schema.schemata; #查询全部数据库
select table name from information schema.tables;#查询全部数据库表
select COLUMN NAME from information schema.columns; #查询全部表字段名
select table name from information schema.tables where table schema =(select database()); #查询当前库中的表名
select COLUMN NAME from informationschema.columns where table name=“student”;#查询数据库表中的所有字段

 3、union[all] 语句

  • union 用于把来自多个select 语句的结果组合到一个结果集合中,对应的列应该具有相同的字段属性,且第一个select 语句中的字段名称也被用于结果的字段名称。

select userid,username,password from user union select 2,"allen”,123456; #数据库存在了,不会插入
select userid,username,password from user union all select 2,"allen”,123456; #数据库存在了,也会插入

注意:union all: 返回所有记录不去重,而union去重复

 4、mysql函数

(1)load file()函数读文件操作

  • 必须提供文件全路径(windows放在根目录)
select 1,2, load file("e:lddd.json");

 (2)lnto outfile写文件操作

select "hello world" into outfile "e:laa.csv";

 MySQL提供了向磁盘文件写入数据的操作,与 load file一样,必须持有FILE权限,并且文件必须为:完整路径

 若是没有操作权限,可点击文件【属性】-【安全】-【编辑】,修改一下操作权限:

 若是Linux,使用命令:chomd 777 xxx.txt #添加操作权限

(3)concat()

用于将多个字符串连接成一个字符串

select userid,username,password from user union select 2,"allen",concat(database),user(),version();


concat ws ():是concat()的特殊形式,第一个参数是其它参数的分隔符

select userid,username,password from user union select 2,"allen",concat ws(",",database(),user(),version();

group_concat(字段名):在指定条件下,拼接指定字段的不同数据为一个字符串

 5、SQL注入案例

(1)SQL注入案例

  1. 数字型注入
  2. 字符型注入
  3. 搜索型注入
  4. 基于boolean值的盲注
  5. Insert/update注入

(2)SQL注入的通用思路

  1. 检测注入点
  2. 判断是否存在 SQL 注入可能
  3. 数据库爆破
  4. 数据库表爆破
  5. 字段爆破
  6. 数据爆破,比如用户名、密码

(3)注入案例介绍

$query="select username,email from member where id=$id";

 

修改Pikachu/vul/sqli/sqli id.php文件内容(将页面的下拉列表改为输入框):

 

posted @   他还在坚持嘛  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2021-02-06 高效测试计划&工作量排期
2021-02-06 常用的软件测试工作量评估方法【转】
点击右上角即可分享
微信分享提示