> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 安全测试报告指南

> 本文介绍了安全测试报告相关内容，包括常见问题、安全测试用例、安全测试结果等。

## 应用上架市场安全测试报告指南

测试并填写[《安全测试报告结果模板》](https://open-dev-resource.oss-cn-beijing.aliyuncs.com/%E5%AE%89%E5%85%A8%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A-%E6%A8%A1%E6%9D%BF.docx)并转成PDF格式进行提交。
报告最终内容可参考[《某某应用安全测试报告结果(样例)》](https://open-dev-resource.oss-cn-beijing.aliyuncs.com/%E6%9F%90%E6%9F%90%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A%E7%BB%93%E6%9E%9C%20%28%E6%A0%B7%E4%BE%8B%29.pdf)。

## 常见问题

**截图时，请将工具的完整界面全部截下来（包含请求内容、返回内容），不要进行压缩直接附在报告里。**

1. 问: 报告需要提供哪些信息，是否每个用例都要测试?

   答: 报告里指定的测试用例都是必须的安全检查点，报告提供安全评估需要关注的典型风险类型，需要ISV根据报告要求测试用例结合自己业务类型对 **所有适用的接口进行安全测试。报告里需要体现的是对关键接口的测试过程，但实际测试内容不限于报告里体现的接口测试。**
2. 问: 公司没有相关的安全人员，是否可以不提供安全评估报告?

   答: 不可以，报告里针对每项测试用例有推荐的测试方法和工具，比如burp suite，对于工具的使用可以在网上找到详细的使用规范，为了保障业务上线后的安全性，上线前的安全测试是必须和必要的。
3. 问: 报告里每个测试用例有没有测试规范要求？

   答: 测试用例分两种：数据检查和安全测试。数据检查类似端口扫描，使用中间件信息等，不涉及数据修改，需要记录真实的系统现状，提供必要的信息；使用工具检查的，需要提供截图信息，比如namp扫描结果。

   **安全测试类的用例，需要遵守如下规范进行测试：**

   1. **系统发起正常请求，使用工具对正常发送的请求和服务端返回截图，同时对业务应用页面的展示信息进行截图。**
   2. **在工具内修改网络请求信息，比如修改id，把修改后的网络请求和服务端返回内容在工具中截图，同时对业务应用页面的返回结果进行截图。**
   3. **把工具和业务应用的截图都附在报告里。**
4. 问: 如果报告里提到的测试用例在业务中不存在怎么办?

   答: 这种场景需要提供不适用的原因或者用到的替换技术，比如：如果没有短信模块，可以注明没有使用短信功能。
5. 问: 已经做了参数防修改，权限校验测试的目的是什么?

   答: 参数防修改和权限校验针对的场景是不一样的，前者是为了防止数据的伪造，校验数据的一致性，对于部分接口可能存在合法用户尝试访问非授权数据的场景，比如查看其他部门的信息，输入的信息是有效的，但是操作员不在授权范围内。
6. 问: 测试过程很多，可不可以不截图?

   答: 测试的目的是为了尽早发现风险，保障业务线上的安全性，截图只是用来记录测试过程，钉钉安全团队会根据测试的截图信息帮助分析和发现潜在的其他业务风险，截图是必要的。
7. 问: 如果业务上线前做的测试比报告要求多，怎么处理?

   答: 如果有其他方式和途径进行了安全报告里未覆盖的场景，建议把内容整理成文档，在报告里新建工作表作为附件放在工作表里。钉钉安全团队会协助分析报告，评估风险。
8. 问: 测试截图的目的是为了什么?

   答: 截图的目的是为了查看测试方法是否正确，是否按照要求进行了测试。

## 安全测试用例

### 准备工具

**抓包改包工具:**

| Tools      | **Editions** | **Download**                                                       |
| ---------- | ------------ | ------------------------------------------------------------------ |
| Burp Suite | Community    | \<[https://portswigger.net/burp/>](https://portswigger.net/burp/>) |
| Charles    | —            | —                                                                  |
| Fiddler    | —            | —                                                                  |

**端口扫描工具:**

| Tools | **Download**                                                                                                                                                                                  |
| ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Nmap  | - Windows: \<[https://nmap.org/book/inst-windows.html>](https://nmap.org/book/inst-windows.html>) - MAC: \<[https://nmap.org/book/inst-macosx.html>](https://nmap.org/book/inst-macosx.html>) |

### 安全要求

1. 必须配置并使用SSL协议, 并且代码和提供的服务中也都使用https协议。
2. 上架应用必须使用钉钉账号体系，使用开放平台提供的接口获取用户身份信息，禁止自建登录体系。

**说明**

如有存储用户文件的场景，为保证数据安全及稳定性，禁止文件存储在ECS服务器上，需使用对象存储OSS存储数据。

| 用例编号  | 测试名称          | 使用工具    | 测试过程                                                                                                                                                                              | 测试结果                                                                          | 修复方案                                                      | 备注 |
| ----- | ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------- | -- |
| NO.01 | 域名/IP对外开放端口信息 | nmap    | nmap使用命令: nmap -sV -T4 -Pn -p1-65535 ip                                                                                                                                           | 附端口扫描结果截图，需要能看出来被扫描的IP和扫描结果。                                                  | 对外只允许开启22、80和443端口。                                       | —  |
| NO.02 | 数据库信息         | 人工      | 查看生产数据库数据库表结构                                                                                                                                                                     | 附数据库表、字段结构信息。                                                                 | 禁止存储用户的敏感信息，包括但不限于身份证号码、银行卡号。                             | —  |
| NO.03 | 敏感信息          | 人工和抓包工具 | review代码及环境。  1. 是否存在接口返回或展示用户较敏感信息  2. 服务端业务日志是否打印或存储敏感信息                                                                                                                        | 1. 敏感信息已打码处理 。  2. 没有打印或存储敏感信息。                                               | 1. 返回或展示较敏感信息(例如手机号、邮箱)需进行打码处理 。  2. 服务端业务日志不允许打印或存储敏感信息。 | —  |
| NO.04 | 越权漏洞          | 抓包工具    | 修改请求URL参数中的ID类参数                                                                                                                                                                  | 1. 使用A用户身份，通过修改请求参数的方式，无法获取其他用户数据。  2. 使用普通用户身份，无法通过访问管理员类接口的方式获取数据或者进行修改类操作。 | 做好权限校验。校验用户身份禁止通过取参数的内容方式进行判断。                            | —  |
| NO.05 | 跨站漏洞          | 人工      | 在用户可以输入的地方, 输入js代码  `&lt;img src=x onerror=alert(1)/>`                                                                                                                            | 用户输入的js代码在展示页面未执行。                                                            | 对于用户输入的内容做好过滤。                                            | —  |
| NO.06 | SQL注入漏洞       | 人工和抓包工具 | 修改请求中用于查询类的参数                                                                                                                                                                     | 程序未执行参数中的sql语句。                                                               | 禁止拼接sql语句，需要使用预编译模式进行数据库操作。                               | —  |
| NO.07 | CSRF漏洞        | 人工或抓包工具 | 修改增删修改类请求接口中的referer或token                                                                                                                                                        | 修改referer或token后，增删修改无法执行成功。                                                  | 对增删修改类请求接口的referer做白名单校验或 在参数中增加随机token。                  | —  |
| NO.08 | 隐私安全          | 人工      | 1. 进入**应用开发** > **基础信息** > **权限管理**页面，单击**用户信息使用说明**，填写采集的用户信息及使用场景说明。  2. 进入**应用运营** > **推广管理** > **应用线下推广** > **微应用线下部署**页面，单击最右侧的操作列表的二维码标识**查看商品线下部署二维码**，用钉钉扫码安装提供安装的授权页面截图。 | 1. 已完成自采集用户数据的使用说明填写。  2. 提供安装授权页面截图（默认接入，根据申请的API权限进行授权内容的展示）。               | —                                                         | —  |

## 安全测试结果

### NO.01 EIP对外开放端口信息

填写表格并附扫描情况截图。

**要求**：EIP(弹性公网IP)仅开放必要服务端口(如22、80、443、3389端口)；SLB仅开放web服务端口(如80、443端口)。如有特殊端口开放请说明场景。

| 域名/IP                                                  | 端口开放信息 | **备注** |
| ------------------------------------------------------ | ------ | ------ |
| 域名：\*\*\*.\*\*\*.com  EIP: \*\*\*.\*\*\*.\*\*\*.\*\*\* |        |        |

> 将"\*\*\*"替换成EIP如有多个EIP(弹性公网IP) 则需提供所有的EIP端口开放情况。内网IP端口信息无需提供。nmap使用命令: nmap -sV -T4 -Pn -p1-65535 ip

### NO.02 数据库信息

填写表格(数据库表、字段结构信息)；如表和字段较多，仅填写与用户信息相关的表和字段。

**要求**：禁止存储用户的敏感信息(包括但不限于身份证号码、银行卡号等)。如有特殊需求请说明使用场景。

| **数据库字段名** | **字段描述** | **备注** |
| ---------- | -------- | ------ |
| username   | 用户名称     |        |
| address    | 用户的通信地址  |        |

### NO.03 敏感信息

填写表格。

**要求**：

1. 返回或展示较敏感信息(例如手机号、邮箱)需进行打码处理。

2. 服务端业务日志不允许打印或存储敏感信息。

| **场景信息**           | **情况描述** | **备注** |
| ------------------ | -------- | ------ |
| 是否存在接口返回或展示用户较敏感信息 |          |        |
| 服务端业务日志是否打印或存储敏感信息 |          |        |

### NO.04 越权漏洞

使用工具: 抓包工具

1. **漏洞介绍:**

通过直接访问URL或修改URL的参数例如ID，可以看到属于其他的人条目的信息，甚至可以进行修改。

2. **漏洞成因:**

从URL参数或者未加密的cookie中获取用户身份标识(userid)，以此为基础进行数据查询和功能操作，用户可修改该参数，从而造成水平/垂直越权。

3. **修复方案:**

做好用户的身份判断，需判断当前用户是否具有权限做该操作，同时判断用户身份信息要从加密Cookie或Session中获取，而非通过取URL参数的方式判断当前用户身份。

4. **测试方法:**

需要结合自己的业务场景进行测试。

* **水平越权:** 例如存在一个查看订单信息的场景: A用户订单的订单号为1； B用户订单的订单号为2。A用户通过访问`.com/my?orderid=1` 查看自己订单号为1的订单信息。那么利用抓包工具，修改请求参数中的接口参数, 将A用户的`.com/my?orderid=1` 请求中的`orderid=1`修改为`orderid=2` ，查看能否获取B用户订单号为2的订单信息，如果能查看信息就存在水平越权漏洞。同理，除查看信息的场景外，增删修改类操作接口都是类似的测试方法。
* **垂直越权:** 例如存在一个修改信息的场景: A用户订单的订单号为1，但A用户不具备修改自己订单信息的权限；管理员B具有修改所有订单信息的权限。管理员B通过访问`.com/my?orderid=all` 接口的方式，能够查看所有的订单。A用户通过访问本来只有管理员能操作的接口`.com/my?orderid=all` , 查看能否获取到所有订单信息, 如果能获取就存在垂直越权的漏洞。同理查看信息、增删修改类操作接口场景都是类似的测试方法。

5. **测试结果：**

填写表格, 并附测试情况截图。

**要求: 所有接口都需进行测试，并且都不存在越权漏洞，但截图可仅提供部分接口的测试截图。**

**截图要求: 至少需要两张截图，一张A用户正常的请求，一张A用户修改了URL参数的请求。截图需能看出请求的URL及返回的内容。**

| **相关接口**                              | **功能描述**  | **备注**  |
| ------------------------------------- | --------- | ------- |
| \*\*\*\*.com/my?orderid=              | 查看订单信息的接口 | 不存在越权漏洞 |
| \*\*\*\*.com/my?UpdateOrderid=\&name= | 修改订单信息的接口 | 不存在越权漏洞 |

### NO.05 跨站脚本攻击漏洞（小程序可不进行此项测试)

1. **漏洞介绍:**

恶意攻击者往Web页面里插入恶意html代码，当用户浏览该页时，嵌入其中Web里面的html代码会被执行，从而达到恶意攻击用户的特殊目的。

2. **漏洞成因:**

造成XSS漏洞的原因就是，攻击者的输入没有经过严格的控制，最终显示给来访的用户，攻击者通过巧妙的方法注入恶意指令代码到网页，使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript，但实际上也可以包括Java，VBScript， ActiveX， Flash 或者甚至是普通的HTML。攻击成功后，攻击者可能得到更高的权限（如执行一些操作）、个人网页内容、会话和cookie等各种内容。

3. **修复方案:**

对XSS的防御需要根据实际情况对用户的输入进行严格的过滤，例如PHP使用`htmlspecialchars()`函数对用户输入的内容做HTML转义。同时在cookie中加入httponly属性可以在一定程度上保护用户的cookie，减少出现XSS时损失。

4. **测试方法:**

需要结合自己的业务场景进行测试。

例如存在A用户提交表单信息的场景，那么A用户在输入框内填写HTML代码，例如`"<img src=1 onerror=alert(123)/>`或`<script>alert(123)</script>`。A用户或管理员在查看已提交表单内容的页面，插入的HTML代码是否成功执行了，比如是否执行了弹框。如果执行了，则存在跨站漏洞。

5. **测试结果**

填写表格, 并附测试情况截图。

**要求: 所有存在输入内容的页面都需进行测试，并且都不存在跨站漏洞，但截图可仅提供部分接口的测试截图。**

**截图要求: 至少需要一张截图，查看内容被插入了HTML代码的页面。截图需能看出内容中的HTML代码被执行。**

| **存在输入输出内容的页面** | **功能描述**  | **备注**  |
| --------------- | --------- | ------- |
| \*\*\*\*.com/my | 修改个人信息的页面 | 不存在跨站漏洞 |
| \*\*\*\*.com/my | 查看个人信息的页面 | 不存在跨站漏洞 |

### NO.06 SQL注入漏洞

1. **漏洞成因:**

针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法，破坏原有SQL结构，达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的：

* 程序编写者在处理应用程序和数据库交互时，使用字符串拼接的方式构造SQL语句。
* 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

2. **修复方案:**

使用预编译的处理方式SQL语句，严禁使用拼接SQL语句的方式。例如Java使用MyBatis；Python使用SQLAlchemy。

若使用Ibatis，将var更换为#var#

若使用Mybatis，将\$\{var}更换为#\{var}

3. **测试结果**：

填写表格, 并附测试情况截图。

**截图要求: 将执行SQL语句相关的关键代码进行截图。使得能够看出来未使用拼接SQL语句的方式。**

| SQL操作的代码实现方式 | 备注            |
| ------------ | ------------- |
| 使用Mybatis    | 未使用拼接SQL语句的方式 |

### NO.07 跨站请求伪造漏洞

使用工具: 抓包工具

1. **漏洞成因:**

攻击者通过伪造来自受信任用户的请求，达到增加、删除、篡改网站内容的目的。

当用户点击攻击者构造的恶意链接后就“被”执行了相应的操作。

例如，一个银行的转账功能（将100元转到BOB的账上）是通过如下方式实现的：

`GET http://bank.com/transfer.do?acct=BOB&amount=100 HTTP/1.1`

当攻击者诱导用户点击下面的链接时，如果该用户登录该银行网站的凭证尚未过期，那么他便在不知情的情况下转给了MARIA 100000元钱：

`http://bank.com/transfer.do?acct=MARIA&amount=100000`

简单的身份验证只能保证请求发自某个用户的浏览器，却不能保证请求本身是用户自愿发出的。

2. **修复方案(任选其一):**

| 修复方案             | 说明                                                                                                                                                                   |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 验证HTTP Referer字段 | 在通常情况下，访问一个安全受限页面的请求来自于同一个网站， HTTP 头中的Referer字段记录了该HTTP请求的来源地址，如果Referer中的地址不是来源于本网站则可认为是不安全的请求，对于该请求应予以拒绝。这种方法简单易行，对于现有的系统只需再加上一个检查Referer值的过滤器，无需改变当前系统的任何已有代码和逻辑。 |
| 添加token          | CSRF攻击之所以能够成功是因为攻击者可以伪造用户的请求，对此最好的防御手段就是让攻击者无法伪造这个请求。因此，我们可以在HTTP请求中以参数的形式添加一个随机的token，并在服务器端检查这个token是否正确，如不正确或不存在 ，则可以认为是不安全的请求，拒绝提供相关服务。                          |
| 添加验证码            | 在用户提交数据之前，让用户输入验证码。                                                                                                                                                  |

3. **测试方法:**

例如修改信息的请求为:

```
GET my?username=BOB&age=18 HTTP/1.1
Host: ***.com
Referer: ***.com/my
......
```

利用抓包工具,将修改信息的请求中的`Referer: ***.com/my` 修改为其他内容，再次发送请求。

```
GET my?username=BOB&age=18 HTTP/1.1
Host: ***.com
Referer: ***111.com
......
```

如果执行修改操作成功，即存在跨站请求伪造漏洞。同理，如果使用的是随机token，那么将token值改掉，修改操作能够执行成功，如成功则存在漏洞。所有增删修改类操作接口都需进行测试。

4. **测试结果**

填写表格, 并附测试情况截图。

**要求: 所有接口都需进行测试，并且都不存跨站请求伪造漏洞，但截图可仅提供部分接口的测试截图。**

**截图要求: 至少需要两张截图，一张正常的Referer或token的请求，一张修改了Referer或token的请求。截图需能看出请求的内容及返回的内容。**

| **相关接口**                     | **功能描述**  | **备注**      |
| ---------------------------- | --------- | ----------- |
| \*\*\*.com/my?username=\&age | 修改个人信息的接口 | 不存在跨站请求伪造漏洞 |
| \*\*\*.com/my?delusername=   | 删除个人信息的接口 | 不存在跨站请求伪造漏洞 |

### NO.08 隐私安全

填写表格，描述获取权限&数据的使用场景。

**要求:**

**自采集填写：** 进入 **应用开发** > **基础信息** > **权限管理** 页面，单击 **用户信息使用说明，填写采集的用户信息及使用场景说明。钉钉会自行检测，已填写即可。如下图：**

![](https://img.alicdn.com/imgextra/i3/O1CN01cGaus2JdEdB43lUc_!!6000000001284-2-tps-2000-894.png)

完成填写后，在样例报告中填写获取隐私数据所需场景的描述。

| **隐私权限/数据**    | **数据来源** | **结果/场景描述**   | **备注** |
| -------------- | -------- | ------------- | ------ |
| 用户手机号          | 自采集      | 用于XXX场景的XXX功能 |        |
| 获取通讯录的头像、昵称等信息 | 钉钉同步     | 用户个人基础信息的展示   |        |

## burpsuite使用&导入证书

### 设置代理

如下图所示设置代理，端口可自定义。

**PC端**：

设置burpsuite代理监听地址及端口

默认监听127.0.0.1的8080端口，根据实际测试的需求可以新增或修改监听地址或者端口。![2](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6528091561/p436789.png)**移动端，以iOS为例:**

填写burpsuite的代理地址及端口。

**WIFI** > **HTTP代理** > **配置代理**

### 导入证书

手机端在浏览器内访问代理地址`http://ip:port`下载并导入证书。

Tips：在iOS下，有两处需要设置信任。

1. **设置** > **通用** > **关于本机** > **证书信任设置**
2. **设置** > **通用** > **描述文件与设备管理**

### 拦截数据包&修改数据包

1. 拦截数据包并发送到Repeater窗口。![2](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6528091561/p436808.png)
2. 在Repeater窗口修改数据包并重放。
3. 在左侧窗口直接修改请求包内容，然后通过`Go`按钮发送该请求；在右侧窗口可查看返回的内容。![3](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6528091561/p436802.png)
