渗透测试怎么做,看完这个我也学会了【宝藏教程】

01、信息收集

1、域名、IP、端口

  • 域名信息查询:信息可用于后续渗透

  • IP信息查询:确认域名对应IP,确认IP是否真实,确认通信是否正常

  • 端口信息查询:NMap扫描,确认开放端口

    发现:一共开放两个端口,80为web访问端口,3389为windows远程登陆端口,嘿嘿嘿,试一下

    发现:是Windows Server 2003系统,OK,到此为止。

2、指纹识别

其实就是网站的信息。比如通过可以访问的资源,如网站首页,查看源代码:

  • 看看是否存在文件遍历的漏洞(如图片路径,再通过../遍历文件)

  • 是否使用了存在漏洞的框架(如果没有现成的就自己挖)

02、漏洞扫描

1、主机扫描

  • Nessus
    经典主机漏扫工具,看看有没有CVE漏洞:
     

2、Web扫描

  • AWVS(Acunetix | Website Security Scanner)扫描器

    PS:扫描器可能会对网站构成伤害,小心谨慎使用。

03、渗透测试

1、弱口令漏洞

  • 漏洞描述
    目标网站管理入口(或数据库等组件的外部连接)使用了容易被猜测的简单字符口令、或者是默认系统账号口令。

  • 渗透测试
    ① 如果不存在验证码,则直接使用相对应的弱口令字典使用burpsuite 进行爆破
    ② 如果存在验证码,则看验证码是否存在绕过、以及看验证码是否容易识别

  • 风险评级:高风险

  • 安全建议

    ① 默认口令以及修改口令都应保证复杂度,比如:大小写字母与数字或特殊字符的组合,口令长度不小于8位等
    ② 定期检查和更换网站管理口令
     

2、文件下载(目录浏览)漏洞

  • 漏洞描述
    一些网站由于业务需求,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意的文件,可以是源代码文件、敏感文件等。

  • 渗透测试
    ① 查找可能存在文件包含的漏洞点,比如js,css等页面代码路径
    ② 看看有没有文件上传访问的功能
    ③ 采用../来测试能否夸目录访问文件

  • 风险评级:高风险

  • 安全建议
    ① 采用白名单机制限制服务器目录的访问,以及可以访问的文件类型(小心被绕过)
    ② 过滤【./】等特殊字符
    ③ 采用文件流的访问返回上传文件(如用户头像),不要通过真实的网站路径。

示例:tomcat,默认关闭路径浏览的功能:

<param-name>listings</param-name>
<param-value>false</param-value>

3、任意文件上传漏洞

  • 漏洞描述
    目标网站允许用户向网站直接上传文件,但未对所上传文件的类型和内容进行严格的过滤。

  • 渗透测试
    ① 收集网站信息,判断使用的语言(PHP,ASP,JSP)
    ② 过滤规则绕过方法:文件上传绕过技巧

  • 风险评级:高风险

  • 安全建议
    ① 对上传文件做有效文件类型判断,采用白名单控制的方法,开放只允许上传的文件型式;
    ② 文件类型判断,应对上传文件的后缀、文件头、图片类的预览图等做检测来判断文件类型,同时注意重命名(Md5加密)上传文件的文件名避免攻击者利用WEB服务的缺陷构造畸形文件名实现攻击目的;
    ③ 禁止上传目录有执行权限;
    ④ 使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件。
     

4、命令注入漏洞

  • 漏洞描述
    目标网站未对用户输入的字符进行特殊字符过滤或合法性校验,允许用户输入特殊语句,导致各种调用系统命令的web应用,会被攻击者通过命令拼接、绕过黑名单等方式,在服务端运行恶意的系统命令。

  • 渗透测试

  • 风险评级:高风险

  • 安全建议
    ① 拒绝使用拼接语句的方式进行参数传递;
    ② 尽量使用白名单的方式(首选方式);
    ③ 过滤危险方法、特殊字符,如:【|】【&】【;】【'】【"】等
     

5、SQL注入漏洞

  • 漏洞描述
    目标网站未对用户输入的字符进行特殊字符过滤或合法性校验,允许用户输入特殊语句查询后台数据库相关信息

  • 渗透测试
    ① 手动测试:判断是否存在SQL注入,判断是字符型还是数字型,是否需要盲注
    ② 工具测试:使用sqlmap等工具进行辅助测试

  • 风险评级:高风险

  • 安全建议
    ① 防范SQL注入攻击的最佳方式就是将查询的逻辑与其数据分隔,如Java的预处理,PHP的PDO
    ② 拒绝使用拼接SQL的方式

6、跨站脚本漏洞

  • 漏洞描述
    当应用程序的网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。

    三种XSS漏洞:
    ① 存储型:用户输入的信息被持久化,并能够在页面显示的功能,都可能存在存储型XSS,例如用户留言、个人信息修改等。
    ② 反射型:URL参数需要在页面显示的功能都可能存在反射型跨站脚本攻击,例如站内搜索、查询功能。
    ③ DOM型:涉及DOM对象的页面程序,包括:document.URL、document.location、document.referrer、window.location等

  • 渗透测试
    存储型,反射型,DOM型

  • 风险评级:高风险   

  • 安全建议

    ① 不信任用户提交的任何内容,对用户输入的内容,在后台都需要进行长度检查,并且对【<】【>】【"】【'】【&】等字符做过滤
    ② 任何内容返回到页面显示之前都必须加以html编码,即将【<】【>】【"】【'】【&】进行转义。
     

7、跨站请求伪造漏洞

  • 漏洞描述
    CSRF,全称为Cross-Site Request Forgery,跨站请求伪造,是一种网络攻击方式,它可以在用户毫不知情的情况下,以用户的名义伪造请求发送给被攻击站点,从而在未授权的情况下进行权限保护内的操作,如修改密码,转账等。

  • 渗透测试

  • 风险评级:中风险(如果相关业务极其重要,则为高风险)

  • 安全建议
    ① 使用一次性令牌:用户登录后产生随机token并赋值给页面中的某个Hidden标签,提交表单时候,同时提交这个Hidden标签并验证,验证后重新产生新的token,并赋值给hidden标签;
    ② 适当场景添加验证码输入:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串;
    ③ 请求头Referer效验,url请求是否前部匹配Http(s)://ServerHost
    ④ 关键信息输入确认提交信息的用户身份是否合法,比如修改密码一定要提供原密码输入
    ⑤ 用户自身可以通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie;
     

8、内部后台地址暴露

  • 漏洞描述
    一些仅被内部访问的地址,对外部暴露了,如:管理员登陆页面;系统监控页面;API接口描述页面等,这些会导致信息泄露,后台登陆等地址还可能被爆破。

  • 渗透测试
    ① 通过常用的地址进行探测,如login.html,manager.html,api.html等;
    ② 可以借用burpsuite和常规页面地址字典,进行扫描探测

  • 风险评级:中风险

  • 安全建议
    ① 禁止外网访问后台地址
    ② 使用非常规路径(如对md5加密)
     

9、信息泄露漏洞

  • 漏洞描述
    ① 备份信息泄露:目标网站未及时删除编辑器或者人员在编辑文件时,产生的临时文件,或者相关备份信息未及时删除导致信息泄露。
    ② 测试页面信息泄露:测试界面未及时删除,导致测试界面暴露,被他人访问。
    ③ 源码信息泄露:目标网站文件访问控制设置不当,WEB服务器开启源码下载功能,允许用户访问网站源码。
    ④ 错误信息泄露:目标网站WEB程序和服务器未屏蔽错误信息回显,页面含有CGI处理错误的代码级别的详细信息,例如SQL语句执行错误原因,PHP的错误行数等。
    ⑤ 接口信息泄露:目标网站接口访问控制不严,导致网站内部敏感信息泄露。

  • 渗透测试
    ① 备份信息泄露、测试页面信息泄露、源码信息泄露,测试方法:使用字典,爆破相关目录,看是否存在相关敏感文件
    ② 错误信息泄露,测试方法:发送畸形的数据报文、非正常的报文进行探测,看是否对错误参数处理妥当。
    ③ 接口信息泄露漏洞,测试方法:使用爬虫或者扫描器爬取获取接口相关信息,看目标网站对接口权限是否合理

  • 风险评级:一般为中风险,如果源码大量泄漏或大量客户敏感信息泄露。

  • 安全建议
    ① 备份信息泄露漏洞:删除相关备份信息,做好权限控制
    ② 测试页面信息泄露漏洞:删除相关测试界面,做好权限控制
    ③ 源码信息泄露漏洞:做好权限控制
    ④ 错误信息泄露漏洞:将错误信息对用户透明化,在CGI处理错误后可以返回友好的提示语以及返回码。但是不可以提示用户出错的代码级别的详细原因
    ⑤ 接口信息泄露漏洞:对接口访问权限严格控制

10、失效的身份认证

  • 漏洞描述
    通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌, 或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。

  • 渗透测试
    ① 在登陆前后观察,前端提交信息中,随机变化的数据,总有与当前已登陆用户进行绑定的会话唯一标识,常见如cookie
    ② 一般现在网站没有那种简单可破解的标识,但是如果是跨站认证,单点登录场景中,可能为了开发方便而简化了身份认证

  • 风险评级:高风险

  • 安全建议
    ① 使用强身份识别,不使用简单弱加密方式进行身份识别;
    ② 服务器端使用安全的会话管理器,在登录后生成高度复杂的新随机会话ID。会话ID不能在URL中,可以安全地存储,在登出、闲置超时后使其失效。


11、失效的访问控制

  • 漏洞描述
    未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。

  • 渗透测试
    ① 登入后,通过burpsuite 抓取相关url 链接,获取到url 链接之后,在另一个浏览器打开相关链接,看能够通过另一个未登入的浏览器直接访问该功能点。
    ② 使用A用户登陆,然后在另一个浏览器使用B用户登陆,使用B访问A独有的功能,看能否访问。

  • 风险评级:高风险

  • 安全建议
    ① 除公有资源外,默认情况下拒绝访问非本人所有的私有资源;
    ② 对API和控制器的访问进行速率限制,以最大限度地降低自动化攻击工具的危害;
    ③ 当用户注销后,服务器上的Cookie,JWT等令牌应失效;
    ④ 对每一个业务请求,都进行权限校验。
     

12、安全配置错误

  • 漏洞描述
    应用程序缺少适当的安全加固,或者云服务的权限配置错误。
    ① 应用程序启用或安装了不必要的功能(例如:不必要的端口、服务、网页、帐户或权限)。
    ② 默认帐户的密码仍然可用且没有更改。
    ③ 错误处理机制向用户披露堆栈跟踪或其他大量错误信息。
    ④ 对于更新的系统,禁用或不安全地配置最新的安全功能。
    ⑤ 应用程序服务器、应用程序框架(如:Struts、Spring、ASP.NET)、库文件、数据库等没有进行相关安全配置。

  • 渗透测试
    先对应用指纹等进行信息搜集,然后针对搜集的信息,看相关应用默认配置是否有更改,是否有加固过;端口开放情况,是否开放了多余的端口;

  • 风险评级:中风险

  • 安全建议
    搭建最小化平台,该平台不包含任何不必要的功能、组件、文档和示例。移除或不安装不适用的功能和框架。在所有环境中按照标准的加固流程进行正确安全配置。

13、使用含有已知漏洞的组件

  • 漏洞描述
    使用了不再支持或者过时的组件。这包括:OS、Web服务器、应用程序服务器、数据库管理系统(DBMS)、应用程序、API和所有的组件、运行环境和库。

  • 渗透测试
    ① 根据前期信息搜集的信息,查看相关组件的版本,看是否使用了不在支持或者过时的组件。一般来说,信息搜集,可通过http返回头、相关错误信息、应用指纹、端口探测(Nmap)等手段搜集。
    ② Nmap等工具也可以用于获取操作系统版本信息
    ③ 通过CVE,CNVD等平台可以获取当前组件版本是否存在漏洞

  • 风险评级:按照存在漏洞的组件的安全风险值判定当前风险。

  • 安全建议
    ① 移除不使用的依赖、不需要的功能、组件、文件和文档;
    ② 仅从官方渠道安全的获取组件(尽量保证是最新版本),并使用签名机制来降低组件被篡改或加入恶意漏洞的风险;
    ③ 监控那些不再维护或者不发布安全补丁的库和组件。如果不能打补丁,可以考虑部署虚拟补丁来监控、检测或保护。


【软件测试资源免费分享】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走: 

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…… 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为你设计一个基于命令行的冒险小游戏,具体规则和故事情节如下: 游戏规则: 1. 游戏中有多个场景,玩家需要在场景中进行探索,并且根据提示进行决策。 2. 玩家需要在规定的时间内完成任务,否则游戏失败。 3. 玩家可以收集物品,这些物品可以帮助他们完成任务。 4. 在游戏的不同阶段,玩家会遇到不同的敌人,需要与其进行战斗。 5. 游戏中有多个结局,玩家的选择会影响游戏的结局。 游戏故事: 故事发生在一个古老的城堡中,玩家扮演一名年轻的勇士,需要寻找并摧毁城堡深处的邪恶魔王,拯救被其控制的公主。 下面是代码实现: ```python import random import time # 定义游戏场景和敌人 scenes = { "entrance": "城堡入口", "hall": "大厅", "kitchen": "厨房", "tower": "城堡塔楼", "dungeon": "城堡地牢", "throne_room": "王座厅", "treasure_room": "宝藏房" } monsters = { "goblin": {"name": "哥布林", "health": 30, "attack": 5}, "orc": {"name": "兽人", "health": 50, "attack": 10}, "demon": {"name": "恶魔", "health": 100, "attack": 20}, "dragon": {"name": "巨龙", "health": 200, "attack": 30} } # 定义任务物品和玩家属性 items = { "key": "宝藏房的钥匙", "potion": "恢复药水", "sword": "宝剑", "armor": "盔甲", "torch": "火把" } player = { "name": "勇士", "health": 100, "attack": 10, "defense": 5, "items": [] } # 定义战斗函数 def fight(enemy): print("你遇到了一只%s!" % enemy["name"]) while enemy["health"] > 0 and player["health"] > 0: print("你的生命值:%d,攻击力:%d,防御力:%d" % (player["health"], player["attack"], player["defense"])) print("%s的生命值:%d,攻击力:%d" % (enemy["name"], enemy["health"], enemy["attack"])) action = input("请选择你的行动(攻击、逃跑):") if action == "攻击": enemy["health"] -= player["attack"] print("你发起了攻击,对%s造成了%d点伤害!" % (enemy["name"], player["attack"])) if enemy["health"] > 0: player["health"] -= enemy["attack"] - player["defense"] print("%s反击,对你造成了%d点伤害!" % (enemy["name"], enemy["attack"] - player["defense"])) else: print("你选择了逃跑!") return False if enemy["health"] <= 0: print("你打败了%s!" % enemy["name"]) return True else: print("你被%s打败了!" % enemy["name"]) return False # 定义场景函数 def enter_scene(scene): print("你来到了%s。" % scenes[scene]) if scene == "entrance": print("门被锁住了,你需要找到钥匙才能进入城堡。") return "key" elif scene == "hall": print("你在大厅发现了一把宝剑。") player["items"].append("sword") return None elif scene == "kitchen": print("你在厨房发现了一瓶恢复药水。") player["items"].append("potion") return None elif scene == "tower": print("你来到了城堡塔楼,发现了一件盔甲。") player["items"].append("armor") return None elif scene == "dungeon": print("你看到了一只哥布林,准备与其战斗。") if fight(monsters["goblin"]): print("你打败了哥布林,继续你的冒险吧!") return None else: print("你被哥布林打败了,游戏结束!") return "end" elif scene == "throne_room": print("你来到了王座厅,恶魔正在等待你的到来。") if fight(monsters["demon"]): print("你打败了恶魔,但是公主不在这里,你需要继续寻找。") return None else: print("你被恶魔打败了,游戏结束!") return "end" elif scene == "treasure_room": print("你成功找到了宝藏房,并且拿到了公主的救赎。") print("你获得了游戏的胜利!") return "end" # 定义游戏函数 def play_game(): print("欢迎来到城堡冒险游戏!") print("你的任务是摧毁城堡深处的邪恶魔王,拯救被其控制的公主。") print("你有60秒的时间完成任务,否则游戏失败。") print("你可以在不同的场景中探索和收集物品,与敌人进行战斗。") print("在游戏中,你可以输入help获取帮助,输入exit退出游戏。") print("祝你好运!") start_time = time.time() current_scene = "entrance" while True: current_time = time.time() if current_time - start_time > 60: print("时间到了,游戏失败!") return action = input("> ") if action == "help": print("你可以输入go [场景名称]前往不同的场景。") print("你可以输入take [物品名称]收集物品。") print("你可以输入fight与敌人进行战斗。") print("你可以输入items查看已收集的物品。") print("你可以输入exit退出游戏。") elif action == "exit": print("游戏结束。") return elif action.startswith("go "): scene = action.split()[1] if scene in scenes: item = enter_scene(scene) if item: player["items"].append(item) if scene == "treasure_room": return current_scene = scene else: print("无法前往该场景!") elif action.startswith("take "): item = action.split()[1] if item in items: print("你收集了%s。" % items[item]) player["items"].append(item) else: print("无法收集该物品!") elif action == "fight": if current_scene in ["dungeon", "throne_room"]: if fight(monsters["demon"]): enter_scene(current_scene) else: return else: print("该场景没有敌人!") elif action == "items": if len(player["items"]) == 0: print("你还没有收集任何物品!") else: print("你已经收集了以下物品:") for item in player["items"]: print(items[item]) else: print("无法识别的命令!") play_game() ``` 这个游戏还可以进行很多扩展,比如增加场景、增加任务、增加敌人等等。希望这个小游戏能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值