美丽的神话 发表于 5 天前

安全测试理论

安全测试理论



[*] 什么是安全测试?
安全测试:发现系统安全隐患的过程

[*] 安全测试与传统测试区别
传统测试:发现bug为目的
安全测试:发现系统安全隐患

[*] 什么是渗透测试
渗透测试:已成功入侵系统为目标的的攻击过程

[*] 渗透测试与安全测测似区别
渗透测试:攻击
安全测试:防护

[*] 怎样进行安全测试(安全测试常用方法)
1、代码走读:检查代码是否有安全隐患
2、动态渗透
3、扫描程序缓存问题

[*] 安全测试方面(维度)
https://i-blog.csdnimg.cn/blog_migrate/1c569931005a446e229fa65f438249de.png
客户端安全



[*] 常见分类
XSS:跨站脚本攻击
CSRF:跨站请求伪造

XSS



[*] 什么是XSS
       跨站脚本(cross site script)为了避免与前端css混淆,改名为xss
    攻击者通过改变前端页面元素请求地址或注入JS,来获取非法数据(cookie)。

[*] XSS攻击原理
https://i-blog.csdnimg.cn/blog_migrate/48e69c20ec2b38c15396f35cc147134f.png


[*] XSS可用攻击页面标签
https://i-blog.csdnimg.cn/blog_migrate/3b18e42aedb756aed13d3157f58d60b3.png
[*] 攻击方式分类

[*] 存储型:将攻击代码存储到数据库,每次打开指定的页面自动加载执行。
场景:留言板、注册

[*] 反射性:临时修改页面代码,用户打开页面中招。
场景:图片、连接


[*] XSS攻击步骤


[*] 核心:查找是否有XSS漏洞
执行:<script>alert(123)</script>,证明可以执行JS或没有对<进行过滤。

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


[*] XSS防护策略

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

[*] 总结

[*] XSS安全测试办理什么题目?
避免客户端被注入恶意JS程序或修改标签链接地址,导致数据丢失或访问黑客网站

[*] XSS测试职员利用的步骤
1、验证码页面是否屏蔽了JS的注入
2、如果存在JS注入,提醒开发防护策略


CSRF(跨站攻击)



[*]什么是CSRF
CSRF(Cross-site request forgery)是指跨站请求伪造攻击


[*]目的
https://i-blog.csdnimg.cn/blog_migrate/2533218d03a087af692357b9e6848dd1.png


[*]原理
https://i-blog.csdnimg.cn/blog_migrate/aa3b1604c549e9a9180607782ef18e0a.png


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


[*]测试CSRF步骤
检查项目是否对请求头->HTTP Referer做校验。后台判断是操作请求来源只能是自己的网站。


[*]防御
https://i-blog.csdnimg.cn/blog_migrate/39bd203b6043e8058c41eb3d257785e1.png
HTTP Referer:请求头来源的显示,从哪个点击链接访问,会记录链接访问的地址。
网络安全

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


[*]协议加密:常用HTTPS协议(基于HTTP协议之上进行加密传输和证书策略)
1、数据完整性
2、数据保密性
3、安全校验


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


[*]数据署名
特点:对请求数据生成一个无法伪造的字符串,发送给服务器。
https://i-blog.csdnimg.cn/blog_migrate/babdf64923d2db9079f4535b7add074e.png


[*]Dos攻击
https://i-blog.csdnimg.cn/blog_migrate/8b2da688d39b9db0cd2119f3c703c0c1.png
目的:让目标盘算机或网络无法提供正常的服务或资源访问,使目标体系停止响应乃至瓦解。
https://i-blog.csdnimg.cn/blog_migrate/4a3078b370b773f5511e37986dac28b4.png
防御:
1、请求添加访问时间戳,服务器进行判断是否在有效期内,如果在处理,否则不处理。
2、指定时间内控制请求参数(百度->1秒之内3次)
3、流量限制(验证码->越模糊越好)
用户安全策略

密码登录:
        ①:session
        ②:token
其他登录


[*]密码
https://i-blog.csdnimg.cn/blog_migrate/8c4c604313d51148c8812285fa859a17.png
提示:
1、密码纯6位数字,有10**6
2、密码纯8位数字,有10**8


[*] session

[*]说明:密码登录成功后,服务器可以生成session|token|cookie等认证方式来进行后续认证处理。
[*]特点:session:一次会话(会话竣事session关闭)
[*]危害:如果在session会话有效期内,session被盗取,那么后果是很可怕的(相称于账号密码泄漏)
   

[*]防护策略:

[*]在肯定时间后后台关闭session
[*]雷同用户只能生成1个对象
[*]当用户客户端发生变化(浏览器、ip发生改变)时,要求用户重新登录
[*]养成好的习惯,用户退出后,及时扫除session信息


其他登录策略



[*]多因素策略
https://i-blog.csdnimg.cn/blog_migrate/8657330617f65a039068291200cfaf01.png
提示:多因素策略一般根据项目类型来定
暴力破解



[*]说明:理论来说,是密码就肯定可以通过多次尝试来进行破译,这种称为暴力破解。
[*]提示:暴力破解一般利用密码字典联合自动化步伐来实行。
[*]防护:
https://i-blog.csdnimg.cn/blog_migrate/d60289bb258915255b09d745e5442b18.png
权限安全漏洞



[*] 危害:容易出现越权操作(检察别人信息、删除他人的信息、检察核心数据)
[*] 分类
https://i-blog.csdnimg.cn/blog_migrate/310bebb2b5dcc242df651062481414fb.png

提示:权限漏洞主要验证垂直权限(基于用户角色设置权限),水平权限暂时无法验证


[*]越权示例:
张三删除李四的留言信息


[*]防护
服务端在执行操作之前,需要验证权限。
应用服务器安全



[*]安全漏洞分类
1、SQL注入(项目数据库)
2、文件上传(针对应用服务器代码)
SQL注入



[*]说明:sql注入,顾名思义就是通过页面输入sql语句,到达特定的目的
[*]危害:数据库丢失,意味攻击者可以用任何人的账号进行违规操作
[*]原理:
https://i-blog.csdnimg.cn/blog_migrate/84a97349fed8537087c2af03b84d36f6.png


[*]攻击步骤
1、在页面输入框中查找注入点
2、注入sql语句
3、通过sql语句获取项目库名、表名、字段名
4、通过Mysql数据库自己的库,获取项目库中所有的表、字段、数据


[*]安全测试(sql注入),查找注入点
1、方式1:手动,在输入框中输入',看提示信息。如果提示相关sql报错信息且是语句拼接方式,说明可以sql注入
2、方式2:使用专业的工具进行扫描


[*]sql注入防护
1、对用户的输入数据进行校验
2、不要动态拼接SQL,使用参数化语句
3、不要使用管理员权限的数据库连接,为每个应用使用单独的权限进行数据库连接
4、不要把敏感数据直接保存到数据库中
5、应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
应用服务器(文件上传漏洞)



[*]危害: 获取正向web项目的目录和文件(源代码暴露)
[*]原理:

[*]1、利用上传功能,上传恶意文件
[*]2、执行恶意文件
[*]3、获取项目源代码

[*]防护:
https://i-blog.csdnimg.cn/blog_migrate/ef42600e5a6c4c74bfb3675dd92a3a98.png
数据库安全



[*]安全防护策略
数据库备份和恢复
敏感数据加密
审计追踪机制
认证和权限控制


[*]数据备份和恢复
数据库必须有备份,正常1天1个备份


[*]敏感数据加密
用户数据在传输和存储过程都需要进行加密


[*]审计追踪机制
对数据库操作,尤其是(删除、修改、新增)操作,必须有日志记录


[*]认证和权限控制
不能给root权限
文件操作必须有权限控制
接口加解密



[*]加解密说明
https://i-blog.csdnimg.cn/blog_migrate/255fb4ea685362f70c40a29422e70d75.png


[*]思考?如果要对加解密怎么做?
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())
https://i-blog.csdnimg.cn/blog_migrate/1f72523c1a54396f6e8862d6920fe40d.png
加解密应用示例



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


[*]1、加解密工具
https://i-blog.csdnimg.cn/blog_migrate/c3f2f3c21e66f6c11661183890457303.png


[*]2、确定工具怎样利用
https://i-blog.csdnimg.cn/blog_migrate/2d7ee5739188db12e6c0f94e508e5851.png


[*]3、明确请求示例
https://i-blog.csdnimg.cn/blog_migrate/d166e478b491857d7bc2522a682ea61e.png


[*]加解密应用示例:
import requests
from EncryptUtil 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,data={"xmdy":xmdy,"diyou":diyou})
# 4、响应数据解密
diyou =result.json().get("diyou")
print("--" * 50)
print("解密后的数据",EncryptUtil.aes_decrypt(diyou))


[*]EncryptUtil.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!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)
加密解密标准



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


[*] 提示:拿到工具如果报错提示缺少库,须要跟开辟确定安装的依赖库。
https://i-blog.csdnimg.cn/blog_migrate/7ac869fac0b975ae60836ce96a00ba72.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 安全测试理论