ToB企服应用市场:ToB评测及商务社交产业平台

标题: 安全测试理论 [打印本页]

作者: 美丽的神话    时间: 2024-11-8 17:37
标题: 安全测试理论
安全测试理论



客户端安全


XSS






CSRF(跨站攻击)


  1. CSRF(Cross-site request forgery)是指跨站请求伪造攻击
复制代码





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

  1. 检查项目是否对请求头->HTTP Referer做校验。后台判断是操作请求来源只能是自己的网站。
复制代码


  1. HTTP Referer:请求头来源的显示,从哪个点击链接访问,会记录链接访问的地址。
复制代码
网络安全

  1. 协议加密
  2. 数据加密
  3. 数据签名
  4. DOS攻击
复制代码

  1. 1、数据完整性
  2. 2、数据保密性
  3. 3、安全校验
复制代码

  1. 数据加密:md5/AES/DES/自定义
复制代码

  1. 特点:对请求数据生成一个无法伪造的字符串,发送给服务器。
复制代码



目的:让目标盘算机或网络无法提供正常的服务或资源访问,使目标体系停止响应乃至瓦解。

  1. 防御:
  2. 1、请求添加访问时间戳,服务器进行判断是否在有效期内,如果在处理,否则不处理。
  3. 2、指定时间内控制请求参数(百度->1秒之内3次)
  4. 3、流量限制(验证码->越模糊越好)
复制代码
用户安全策略

  1. 密码登录:
  2.         ①:session
  3.         ②:token
  4. 其他登录
复制代码


  1. 提示:
  2. 1、密码纯6位数字,有10**6
  3. 2、密码纯8位数字,有10**8
复制代码

其他登录策略



  1. 提示:多因素策略一般根据项目类型来定
复制代码
暴力破解



权限安全漏洞




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

  1. 张三删除李四的留言信息
复制代码

  1. 服务端在执行操作之前,需要验证权限。
复制代码
应用服务器安全


  1. 1、SQL注入(项目数据库)
  2. 2、文件上传(针对应用服务器代码)
复制代码
SQL注入




  1. 1、在页面输入框中查找注入点
  2. 2、注入sql语句
  3. 3、通过sql语句获取项目库名、表名、字段名
  4. 4、通过Mysql数据库自己的库,获取项目库中所有的表、字段、数据
复制代码

  1. 1、方式1:手动,在输入框中输入',看提示信息。如果提示相关sql报错信息且是语句拼接方式,说明可以sql注入
  2. 2、方式2:使用专业的工具进行扫描
复制代码

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



数据库安全


  1. 数据库备份和恢复
  2. 敏感数据加密
  3. 审计追踪机制
  4. 认证和权限控制
复制代码

  1. 数据库必须有备份,正常1天1个备份
复制代码

  1. 用户数据在传输和存储过程都需要进行加密
复制代码

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

  1. 不能给root权限
  2. 文件操作必须有权限控制
复制代码
接口加解密




  1. 1、找开发拷贝加密和解密工作
  2. 2、确定工具如何使用(如何加密、如何解密)
  3. 3、明确请求示例(请求参数格式及使用)
复制代码
接口-案例


  1. 接口说明:登录接口
  2. 请求方法:POST
  3. 请求参数类型:form
  4. url:"http://mobile-p2p-test.itheima.net/phone/member/login"
  5. 请求参数
  6. data={
  7. "member_name":"13012345678",
  8. "password":"test123"
  9. }
复制代码

  1. import requests
  2. url="http://mobile-p2p-test.itheima.net/phone/member/login"
  3. data={
  4.     "member_name":"13012345678",
  5.     "password":"test123"
  6. }
  7. result=requests.post(url,data=data)
  8. print(result.json())
复制代码

加解密应用示例


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







  1. import requests
  2. from EncryptUtil import EncryptUtil
  3. url="http://mobile-p2p-test.itheima.net/phone/member/login"
  4. data={
  5.     "member_name":"13012345678",
  6.     "password":"test123"
  7. }
  8. # 1、对请求参数进行加密
  9. diyou =EncryptUtil.get_diyou(data)
  10. # 2、对加密后的数据进行签名
  11. xmdy = EncryptUtil.get_xmdy(diyou)
  12. # 3、调用请求 参数格式("xmdy":"签名","diyou":"加密后的数据")
  13. result=requests.post(url,data={"xmdy":xmdy,"diyou":diyou})
  14. # 4、响应数据解密
  15. diyou =result.json().get("diyou")
  16. print("--" * 50)
  17. print("解密后的数据",EncryptUtil.aes_decrypt(diyou))
复制代码

  1. import base64
  2. import hashlib
  3. import json
  4. import re
  5. from Crypto.Cipher import AES
  6. # 加解密工具类
  7. class EncryptUtil:
  8.     # 发送请求时,加密密码
  9.     SEND_AES_KEY = ";3jm$>/p-ED^cVz_j~.KV&V)k9jn,UAH"
  10.     # 发送请求时,签名密钥
  11.     SEND_SIGN_KEY = "DY34fdgsWET@#$%wg#@4fgd345sg"
  12.     # 接收数据时,解密密钥
  13.     RECEIVE_AES_KEY = "54Ms5bkE6UEdyrRviJ0![OR]g+i79x]k"
  14.     @staticmethod
  15.     def padding_pkcs5(value):
  16.         BS = AES.block_size
  17.         return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))
  18.     # 替换空字符
  19.     @staticmethod
  20.     def replace_blank(str_data):
  21.         str_data = re.compile("\t|\r|\n").sub("", str_data)
  22.         print("replace_blank str_data=", str_data)
  23.         return str_data
  24.     @staticmethod
  25.     def aes_encrypt(key, data):
  26.         """
  27.         AES加密
  28.         :param key: 密钥
  29.         :param data: 待加密数据
  30.         :return: 加密后数据
  31.         """
  32.         data = base64.encodebytes(data.encode()).decode()
  33.         # 替换特殊字符
  34.         data = EncryptUtil.replace_blank(data)
  35.         print("data=", data)
  36.         # 初始化加密器
  37.         aes = AES.new(key.encode(), AES.MODE_ECB)
  38.         # 加密
  39.         padding_value = EncryptUtil.padding_pkcs5(data)
  40.         encrypt_aes = aes.encrypt(padding_value)
  41.         # 用base64转成字符串形式
  42.         encrypted_text = base64.encodebytes(encrypt_aes).decode()
  43.         return encrypted_text
  44.     @staticmethod
  45.     def aes_decrypt(key, data):
  46.         """
  47.         AES解密
  48.         :param key: 密钥
  49.         :param data: 待解密数据
  50.         :return: 解密后数据
  51.         """
  52.         # 初始化加密器
  53.         aes = AES.new(key.encode(), AES.MODE_ECB)
  54.         # 优先逆向解密base64成bytes
  55.         base64_decrypted = base64.decodebytes(data.encode())
  56.         # 执行解密
  57.         decrypted_bytes = base64.decodebytes(aes.decrypt(base64_decrypted))
  58.         # 转换为字符串
  59.         decrypted_text = str(decrypted_bytes, encoding="utf-8")
  60.         # 把Unicode转成中文
  61.         result = decrypted_text.encode().decode("unicode_escape")
  62.         return result
  63.     @staticmethod
  64.     def md5value(data):
  65.         print("md5value data=", data)
  66.         md5 = hashlib.md5()
  67.         md5.update(data.encode())
  68.         return md5.hexdigest()
  69.     # 加密调用
  70.     @staticmethod
  71.     def get_diyou(data):
  72.         # 把字典转换为JSON字符串
  73.         if isinstance(data, dict):
  74.             data = json.dumps(data)
  75.         aes_encrypt_data = EncryptUtil.aes_encrypt(EncryptUtil.SEND_AES_KEY, data)
  76.         return EncryptUtil.replace_blank(aes_encrypt_data)
  77.     # 签名调用
  78.     @staticmethod
  79.     def get_xmdy(data):
  80.         return EncryptUtil.md5value(
  81.             EncryptUtil.SEND_SIGN_KEY + EncryptUtil.replace_blank(data) + EncryptUtil.SEND_SIGN_KEY)
  82.     # 解密调用
  83.     @staticmethod
  84.     def decrypt_data(data):
  85.         return EncryptUtil.aes_decrypt(EncryptUtil.RECEIVE_AES_KEY, data)
  86. if __name__ == '__main__':
  87.     # 加密
  88.     send_data = {}
  89.     content = json.dumps(send_data)
  90.     diyou = EncryptUtil.get_diyou(content)
  91.     print("diyou=", diyou)
  92.     xmdy = EncryptUtil.get_xmdy(diyou)
  93.     print("xmdy=", xmdy)
复制代码
加密解密标准


  1. pip install pycryptodome==3.9.6 -i https://pypi.douban.com/simple
复制代码


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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4