SQL注入总结(mysql)

目录

  • 前言
  • 1. SQL注入原理、产生原因、危害
    • 1.1 SQL注入漏洞原理
    • 1.2 SQL注入产生条件
    • 1.3 SQL注入危害
  • 2. SQL注入基础:
    • 2.1 版本特性:
    • 2.2 手工注入常见数据库信息
      • Information_schema库
      • Schemata表
      • Tables表
      • Columns表
    • 2.3 SQL注入类型
      • 2.3.1按照注入点类型
      • 2.3.2 按照数据库类型
      • 2.3.3 按提交方式
      • 2.3.4 按执行效果/方式
  • 3.常见的注入方式及其注入方式的选择
    • 3.1 常见的注入方式
    • 3.2 注入方式的选择
  • 4.SQL注入绕过WAF方式
  • 5.SQL注入的防御方式
  • 文末

前言

本文着重与写mysql的sql注入,sql注入是一常见的安全漏洞,写了mysql数据库,其他数据库也可以触类旁通。写这篇文章主要是自用,本来是想写详解的,但是篇幅可能会过长,内容多且杂,以后有心情应该会单独拎出来写,故此将本篇改为了总结篇。大致是一些原理、注入方式等。

1. SQL注入原理、产生原因、危害

任何东西都是懂其原理、基础,才能进一步深入学习、拓展,因此我把原理单独放在了最上面。

1.1 SQL注入漏洞原理

SQL注入是指Web应用程序对用户输入数据的合法性未进行判断、处理。前端传入的参数是攻击者可控的,并且参数被正常带入到数据库中执行,攻击者可以通过构造不同的SQL语句来对数据库进行操作,正常情况下,攻击者可以对数据进行高危操作。例如,数据查询、WebShell写入、命令执行等操作。

1.2 SQL注入产生条件

根据原理,我们能总结出两点SQL注入产生的条件:
1.参数是用户可控的,也就是前端传入后端的参数的内容是用户可以控制的;

2.参数被带入数据库进行查询,也就是传入的参数被拼接到SQL语句中,并且被带入到数据库进行查询;

1.3 SQL注入危害

作为OWASP top 10榜首,自然危害不会小,以下是sql注入的常见危害:

1.数据库信息泄露:泄露数据库中存放的数据、用户隐私等

2.获取WebShell:当前用户为高权限(例如root)且知道绝对路径时,可以直接写一句话木马到服务器。

3.网页篡改:注入出后台管理员用户,登陆后台后发布恶意数据、篡改后台数据等。

4.网站挂马 : 当拿到WebShell或者获取到服务器的权限后,可将一些网页木马挂在服务器上,去攻击别人。

5.获取系统权限:当权限足够高时,可以获取系统主机的权限。

6.万能密码:利用特定的Payload登录后台或者其他页面。

7.文件读取:读取敏感文件。

2. SQL注入基础:

2.1 版本特性:

在Mysql5.0后,加入了一个information_schema这个系统表,这个系统表中包含了该数据库的所有数据库名、表名、列表,可以通过SQL注入来拿到用户的账号和口令,而Mysql5.0以下的只能暴力跑表名。

2.2 手工注入常见数据库信息

其实这段本来我是想放在上面原理基础的,但是跟版本特性也挂钩,思考之下还是放在这里。这边建议想学习sql注入一开始最好都从手注,更好的去理解原理,而不是全都依赖sqlmap工具!当你熟练了再使用也不迟!有些sqlmap跑不出来的并不是不存在sql注入,通过自己手工注入可能是可以注入成功的。

提醒:进行手工注入需要对数据库的查询语句拥有一定的了解!

Information_schema库

information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等;
在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,字段等;

Schemata表

记录着MySQL数据库中存在的所有数据库的名称。
schemata表:存储该用户创建的所有的数据库库名,这里我们只需要记住 SCHEMA_NAME 这个字段;
tables表:存储该用户创建的所有的数据库库名和表名,这里我们只需要记住TABLE_SCHEMA和TABLE_NAME这两个字段;
columns表:存储该用户创建的所有的数据库库名、表名和字段名,这里我们只需要记住TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME;

Tables表

tables表,TABLE_SCHEMA和TABLE_NAME分别存放着MySQL中的所有库名和表名;

Columns表

columns表,TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME分别存放着MySQL中的所有库名、表名、字段名;

小结:
一般来说,手工注入的话是逐步渐入的过程,使用函数得到库名,Information_schema库进一步得到表名,然后再依次得到字段名、字段信息。下方列举了简单的sql注入语句例子(sqli-labs):

http://127.0.0.1/sqli-labs-master/Less-1/?id=-1’ union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)–+

2.3 SQL注入类型

2.3.1按照注入点类型

1.数字型
比如Web 端大概是http://xxx.com/news.php?id=1这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为:
select * from 表名 where id=1;
2.字符型
比如Web端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为:
select * from 表名 where name=‘admin’
注意多了引号;
3.搜索型
一些网站方便用户寻找网站资源,会对用户提供搜索功能。
这一类SQL语句原型大概为:
select * from user where content like ‘%$con%’;
使用like、%通配符匹配数据。

也有种说法,其实本质就只是分为数字型和字符型,看构造闭合的方式是直接拼接还是构造字符完成闭合,自己怎么方便理解怎么来吧。

2.3.2 按照数据库类型

Access、MsSQL、MySQL、Oracle、DB2等;

2.3.3 按提交方式

GET、POST、cookie、HTTP头、XFF;

2.3.4 按执行效果/方式

联合注入、报错注入、布尔盲注、时间盲注、堆叠查询注入等;

3.常见的注入方式及其注入方式的选择

3.1 常见的注入方式

1.联合注入
union有一个十分严格的约束条件,因为是联合查询,保证字段数一致,即两个查询结果有相同的列数,因此我们后面要对字段数进行判断。

2.报错注入
即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中;

3.时间盲注
即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;

4.布尔盲注
即可以根据返回页面判断条件真假的注入;

5.宽字节注入
程序员为了防止sql注入,对用户输入中的单引号(')进行处理,在单引号前加上斜杠(\)进行转义,这样被处理后的sql语句中,单引 号不再具有‘作用’,仅仅是‘内容’而已,换句话说,这个单引号无法发挥和前后单引号闭合的作用,仅仅成为‘内容’ ;

6.堆叠查询注入
可以同时执行多条语句的执行时的注入;

7.Cookie注入
COOKIE 注入与 GET、POST 注入区别不大,只是传递的方式不一样。GET 在 url 传递参数、POST在 POST 正文传递参数和值, COOKIE 在 cookie 头传值;

8.二次注入
在第一次进行数据库插入数据的时候(例如注册),仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在后端代码中可能会被转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用在拼凑sql语句中,所以就形成了二次注入。

9.DNSlog外带注入
DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。例如:
此时存在一个域名为dnslog.com,要使用的payload为`whoami`.dnslog.com,就可以通过DNS解析日志来获取到主机名。

3.2 注入方式的选择

一般看页面分为有回显还是无回显的情况:
有回显:
1.union联合查询(页面存在回显点)
2.报错注入(有报错信息)
3.布尔盲注(页面异常回显)

无回显:
1.时间盲注
2.DNSlog外带

4.SQL注入绕过WAF方式

1.编码绕过 , 可以对关键字进行url编码 base64 unicode hex ascii等。
2.修改请求方式。
3.参数复写绕过(参数污染)。
4.大小写绕过 , 双写绕过。
5.特殊字符替换空格绕过 , 如mysql中%0a(换行)替换空格 , mssql中用/**/替换空格,注释符 emoji 换行; (±/^)。
6.mssql数据库 , 还可以尝试特殊字符拼接。
7.编码和注释结合绕过 (php 在 base64 解码的时候会忽略特殊字符,我们在 payload 里面穿插!@.来让 waf 没办法识)。
8.waf本身的功能绕过 , 如有的waf会把一些字符替换为空。
9.组合绕过waf , 关键字替换后再编码 , 加注释干扰 and => && , url编码 , 前面加 /**/。
10.内联注释绕过 /**/。
11.分块传输绕过。
12.垃圾字符填充,有的waf有最大长度限制。
13.使用生僻函数绕过(例如报错函数的polygon,时间盲注的BENCHMARK等)。

5.SQL注入的防御方式

1.使用预编译语句
绑定变量,攻击者无法改变SQL的结构。不同的编程语言Java、Php有不同的语法,就不做展示了。例如php里使用pdo来防御。

2.使用存储过程
使用安全的存储过程防止SQL注入,由于存储过程中也可能存在SQL注入问题,应尽量避免使用动态SQL语句。

3.检查数据类型
例如,需要输入的是整型,那么,可以判断用户的输入,如果包含非整型,例如,字符串"AND"、“BENCHMARK”等,则不运行sql语句。其他类型,例如,邮箱等可以通过使用正则表达式来进行判断。

4.使用安全函数

文末

以上是sql注入内容的总结,希望大家能有所收获。
感谢你的阅读!

你可能感兴趣的:(Web安全,mysql)