当前位置: 首页 > news >正文

安全测试理论

  • 安全测试理论

安全测试理论

  • 什么是安全测试?

安全测试:发现系统安全隐患的过程

  • 安全测试与传统测试区别

传统测试:发现bug为目的
安全测试:发现系统安全隐患

  • 什么是渗透测试

渗透测试:已成功入侵系统为目标的的攻击过程

  • 渗透测试与安全测试区别

渗透测试:攻击
安全测试:防护

  • 如何进行安全测试(安全测试常用方法)

1、代码走读:检查代码是否有安全隐患
2、动态渗透
3、扫描程序缓存问题

  • 安全测试方面(维度)

    安全测试方面(维度)

这里是引用

  • 客户端安全

常见分类:

  • XSS:跨站脚本攻击
  • CSRF:跨站请求伪造
  1. XSS

    XSS

  • 什么是XSS

跨站脚本(cross site script)为了避免与前端css混淆,改名为xss
攻击者通过改变前端页面元素请求地址注入JS,来获取非法数据(cookie)。
在这里插入图片描述

  • XSS可用攻击页面标签
    在这里插入图片描述
  • 攻击方式分类
  • 存储型:将攻击代码存储到数据库,每次打开指定的页面自动加载执行。
    • 场景:留言板、注册
  • 反射性:临时修改页面代码,用户打开页面中招。
    • 场景:图片、连接
  • XSS攻击步骤

XSS攻击步骤)

在这里插入图片描述

核心:查找是否有XSS漏洞
在这里插入图片描述
在这里插入图片描述

执行:<script>alert(123)</script>,证明可以执行JS或没有对<进行过滤。

目的:盗取敏感数据,如cookie

XSS防护策略:

  • 将cookie设置只读(HttpOnly)
  • 输入控制:禁止输入特殊符号(</>'等)
  • 输出控制:过滤或转义特殊符号的输出

总结:
XSS安全测试解决什么问题?

  • 避免客户端被注入恶意JS程序或修改标签链接地址,导致数据丢失或访问黑客网站。

XSS测试人员使用的步骤

  • 1、验证码页面是否屏蔽了JS的注入
  • 2、如果存在JS注入,提醒开发防护策略
  1. CSRF(跨站攻击)

    CSRF(跨站攻击

  • 什么是CSRF

CSRF(Cross-site request forgery)是指跨站请求伪造攻击

  • 目的
    在这里插入图片描述
  • 原理

这里是引用

  • 攻击操作步骤

1、获取删除或修改网站数据的接口
2、在黑客网站上生成一个删除或修改链接(领取优惠券)
3、黑客在要攻击的网站上生成一个跳转到黑客网站的链接(优惠活动)
4、用户在黑客网站上领取优惠券

  • 测试CSRF步骤

检查项目是否对请求头->HTTP Referer做校验。后台判断是操作请求来源只能是自己的网站。在这里插入图片描述

  • 防御

    CSRF(跨站攻击防御

在这里插入图片描述

HTTP Referer:请求头来源的显示,从哪个点击链接访问,会记录链接访问的地址。

  1. 网络安全

    网络安全

协议加密
数据加密
数据签名
DOS攻击

  • 协议加密:常用HTTPS协议(基于HTTP协议之上进行加密传输和证书策略)

    网络安全-协议加密

1、数据完整性
2、数据保密性
3、安全校验

  • 数据加密

    网络安全-数据加密

数据加密:md5/AES/DES/自定义

  • 数据签名

    网络安全-数据签名

1、 特点:对请求数据生成一个无法伪造的字符串,发送给服务器。
2、案例:在这里插入图片描述
3、签名的好处:
在这里插入图片描述

  • Dos攻击

    网络安全-Dos攻击

在这里插入图片描述

防御:

  • 1、请求添加访问时间戳,服务器进行判断是否在有效期内,如果在处理,否则不处理。
    在这里插入图片描述
  • 2、指定时间内控制请求次数(百度->1秒之内3次)

  • 3、流量限制(验证码->越模糊越好)

  1. 用户安全策略

    用户安全策略

  • 认证与会话管理

在这里插入图片描述

密码登录:

  • ①:session
    在这里插入图片描述
  • ②:token

在这里插入图片描述

其他登录

  • 密码
    在这里插入图片描述

提示:

  • 1、密码纯6位数字,有10**6
  • 2、密码纯8位数字,有10**8
  • session

    用户安全策略-session

在这里插入图片描述

  • 说明:

    • 密码登录成功后,服务器可以生成session|token|cookie等认证方式来进行后续认证处理。
  • 特点:

    • session:一次会话(会话结束session关闭
  • 危害:

    • 如果在session会话有效期内,session被盗取,那么后果是很可怕的(相当于账号密码泄露
  • 防护策略:

    • 一定时间后后台关闭session
    • 相同用户只能生成1个对象
    • 当用户客户端发生变化(浏览器、ip发生改变)时,要求用户重新登录
    • 养成好的习惯,用户退出后,及时清除session信息
  • 其他登录策略

    用户安全策略-其他登录策略

  • 多因素策略
    在这里插入图片描述

提示:多因素策略一般根据项目类型来定

  • 暴力破解
  • 说明:理论来说,是密码就一定可以通过多次尝试来进行破译,这种称为暴力破解。
  • 提示:暴力破解一般使用密码字典结合自动化程序来实施。
  • 防护:
    在这里插入图片描述
  • 权限安全漏洞
  • 危害:容易出现越权操作(查看别人信息、删除他人的信息、查看核心数据)
  • 分类:
    在这里插入图片描述
    在这里插入图片描述
  • 提示:权限漏洞主要验证垂直权限基于用户角色设置权限),水平权限暂时无法验证
  • 越权示例:
    • 张三删除李四的留言信息
  • 防护:
    • 服务端在执行操作之前,需要验证权限。
  1. 应用服务器安全
  • 安全漏洞分类
    • 1、SQL注入(项目数据库
    • 2、文件上传(针对应用服务器代码
  • SQL注入

    应用服务器安全-SQL注入

  • 说明:sql注入,顾名思义就是通过页面输入sql语句,达到特定的目的(输入框没有过滤sql语句)
  • 危害:数据库丢失,意味攻击者可以用任何人的账号进行违规操作
  • 原理
    在这里插入图片描述
  • 攻击步骤
    • 1、在页面输入框中查找注入点
      ' or 1=1 --空格(注意,--后面缺少空格不是sql的注释)
    • 2、注入sql语句
    • 3、通过sql语句获取项目库名、表名、字段名
      在这里插入图片描述
  • 4、通过Mysql数据库自己的库,获取项目库中所有的表、字段、数据
    在这里插入图片描述
  • 安全测试(sql注入),查找注入点
    • 方式1:手动,在输入框中输入',看提示信息。如果提示相关sql报错信息且是语句拼接方式,说明可以sql注入在这里插入图片描述
  • 方式2:使用专业的工具进行扫描
  • sql注入防护
    • 1、对用户的输入数据进行校验
    • 2、不要动态拼接SQL,使用参数化语句
      在这里插入图片描述
  • 3、不要使用管理员权限的数据库连接,为每个应用使用单独的权限进行数据库连接
  • 4、不要把敏感数据直接保存到数据库
  • 5、应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
  • 应用服务器(文件上传漏洞)

    应用服务器安全-文件上传漏洞

  • 危害: 获取正向web项目的目录和文件(源代码暴露)
  • 原理:
    • 1、利用上传功能,上传恶意文件
      在这里插入图片描述
  • 2、执行恶意文件
    在这里插入图片描述
  • 3、获取项目源代码
  • 防护:
    在这里插入图片描述
  1. 数据库安全

    数据库安全

  • 安全防护策略

数据库备份和恢复
敏感数据加密
审计追踪机制
认证和权限控制

  • 数据备份和恢复

数据库必须有备份,正常1天1个备份

  • 审计追踪机制

对数据库操作,尤其是(删除、修改、新增)操作,必须有日志记录

  • 认证和权限控制

不能给root权限
文件操作必须有权限控制

  1. 接口加解密

    接口加解密

  • 加解密说明
    在这里插入图片描述
  • 思考?如果要对加解密怎么做?

1、找开发拷贝加密和解密工作
2、确定工具如何使用(如何加密、如何解密)
3、明确请求示例(请求参数格式及使用)

  • 接口-案例
  • 案例

接口说明:登录接口
请求方法:POST
请求参数类型:form
url:“http://mobile-p2p-test.itheima.net/phone/member/login”
请求参数
data={
“member_name”:“13012345678”,
“password”:“test123”
}

  • 未加密解密
import requests
url="http://mobile-p2p-test.itheima.net/phone/member/login"
data={
    "member_name":"13012345678",
    "password":"test123"
}
result=requests.post(url,data=data)
print(result.json())

在这里插入图片描述

  • 加解密应用示例
  • 步骤

1、找开发拷贝加密和解密工具
2、确定工具如何使用(如何加密、如何解密
3、明确请求示例(请求参数格式及使用

  • 1、加解密工具
    在这里插入图片描述
  • 2、确定工具如何使用
    在这里插入图片描述
  • 3、明确请求示例
    在这里插入图片描述
  • 加解密应用示例:
    01-未加解密.py
import requests

url = "http://mobile-p2p-test.itheima.net/phone/member/login"
data = {
    "member_name": "13012345678",
    "password": "test123"
}

res = requests.post(url=url, data=data)
print(res)

在这里插入图片描述

EncryprtUtil.py

import base64
import hashlib
import json
import re

from Crypto.Cipher import AES


# 加解密工具类
class EncryptUtil:
    # 发送请求时,加密密码
    SEND_AES_KEY = ";3jm$>/p-ED^cVz_j~.KV&V)k9jn,UAH"
    # 发送请求时,签名密钥
    SEND_SIGN_KEY = "DY34fdgsWET@#$%wg#@4fgd345sg"
    # 接收数据时,解密密钥
    RECEIVE_AES_KEY = "54Ms5bkE6UEdyrRviJ0![OR]g+i79x]k"

    @staticmethod
    def padding_pkcs5(value):
        BS = AES.block_size
        return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))

    # 替换空字符
    @staticmethod
    def replace_blank(str_data):
        str_data = re.compile("\t|\r|\n").sub("", str_data)
        print("replace_blank str_data=", str_data)
        return str_data

    @staticmethod
    def aes_encrypt(key, data):
        """
        AES加密
        :param key: 密钥
        :param data: 待加密数据
        :return: 加密后数据
        """
        data = base64.encodebytes(data.encode()).decode()
        # 替换特殊字符
        data = EncryptUtil.replace_blank(data)
        print("data=", data)

        # 初始化加密器
        aes = AES.new(key.encode(), AES.MODE_ECB)

        # 加密
        padding_value = EncryptUtil.padding_pkcs5(data)
        encrypt_aes = aes.encrypt(padding_value)

        # 用base64转成字符串形式
        encrypted_text = base64.encodebytes(encrypt_aes).decode()
        return encrypted_text

    @staticmethod
    def aes_decrypt(key, data):
        """
        AES解密
        :param key: 密钥
        :param data: 待解密数据
        :return: 解密后数据
        """
        # 初始化加密器
        aes = AES.new(key.encode(), AES.MODE_ECB)
        # 优先逆向解密base64成bytes
        base64_decrypted = base64.decodebytes(data.encode())

        # 执行解密
        decrypted_bytes = base64.decodebytes(aes.decrypt(base64_decrypted))
        # 转换为字符串
        decrypted_text = str(decrypted_bytes, encoding="utf-8")

        # 把Unicode转成中文
        result = decrypted_text.encode().decode("unicode_escape")
        return result

    @staticmethod
    def md5value(data):
        print("md5value data=", data)
        md5 = hashlib.md5()
        md5.update(data.encode())
        return md5.hexdigest()

    # 加密调用
    @staticmethod
    def get_diyou(data):
        # 把字典转换为JSON字符串
        if isinstance(data, dict):
            data = json.dumps(data)
        aes_encrypt_data = EncryptUtil.aes_encrypt(EncryptUtil.SEND_AES_KEY, data)
        return EncryptUtil.replace_blank(aes_encrypt_data)

    # 签名调用
    @staticmethod
    def get_xmdy(data):
        return EncryptUtil.md5value(
            EncryptUtil.SEND_SIGN_KEY + EncryptUtil.replace_blank(data) + EncryptUtil.SEND_SIGN_KEY)

    # 解密调用
    @staticmethod
    def decrypt_data(data):
        return EncryptUtil.aes_decrypt(EncryptUtil.RECEIVE_AES_KEY, data)


if __name__ == '__main__':
    # 加密
    send_data = {}
    content = json.dumps(send_data)
    diyou = EncryptUtil.get_diyou(content)
    print("diyou=", diyou)
    xmdy = EncryptUtil.get_xmdy(diyou)
    print("xmdy=", xmdy)

02-加解密使用.py

import requests

from 加解密使用实例.EncryprtUtil import EncryptUtil

url = "http://mobile-p2p-test.itheima.net/phone/member/login"
data = {
    "member_name": "13012345678",
    "password": "test123"
}
# 1、对请求参数进行加密
diyou = EncryptUtil.get_diyou(data)

# 2、对加密后的数据进行签名
xmdy = EncryptUtil.get_xmdy(diyou)

# 3、调用请求参数格式 {"xmdy":"签名", "diyou":"加密后数据"}
result = requests.post(url=url, data={"xmdy": xmdy, "diyou": diyou})

# 4、响应数据解密
diyou = result.json().get('diyou')
print("--"*60)
print("解密后的数据:", EncryptUtil.decrypt_data(diyou))


  • 加密解密标准
  • 说明:加密标准常用美国联邦政府高级密码标准(AES)
  • 安装:
pip install pycryptodome==3.9.6 -i https://pypi.douban.com/simple

  • 提示:拿到工具如果报错提示缺少库,需要跟开发确定安装的依赖库。
    在这里插入图片描述

相关文章:

  • JavaScript 性能优化实战
  • 【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等
  • 【C++教程】setw()函数的使用方法
  • 深入理解Linux中的SCP命令:使用与原理
  • Hutool中的相关类型转换
  • 山东大学数据结构课程设计
  • linux--时区查看和修改
  • 动态规划-01背包
  • 牛客网【模板】二维差分(详解)c++
  • 分区表的应用场景与优化实践
  • 001-JMeter的安装与配置
  • 【操作系统笔记】操作系统的功能
  • 【Linux】线程库
  • 常见中间件漏洞攻略-Jboss篇
  • 多线程编程中什么时候使用锁和原子操作
  • Leetcode 3495. Minimum Operations to Make Array Elements Zero
  • 《基于Flask的态势感知系统》开题报告
  • Edge浏览器如何默认启动某个工作区 / 为工作区添加快捷方式
  • 设置GeoJSONVectorTileLayer中的line填充图片
  • C++-C++中的几种cast
  • 69岁朱自强被查,曾任南京地铁总经理
  • 华夏银行一季度营收降逾17%、净利降逾14%,公允价值变动损失逾24亿
  • 建行一季度净利833.51亿同比下降3.99%,营收降5.4%
  • “自己生病却让别人吃药”——抹黑中国经济解决不了美国自身问题
  • 朝鲜派兵库尔斯克是否有助于解决乌克兰危机?外交部回应
  • 视觉周刊|2025上海车展的科技范