常见Web漏洞修复

常见web漏洞加固策略

​ Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了SQL语句原有逻辑,攻击者可以利用该漏洞执行任意SQL语句,如查询数据、下载数据、写入webshell、执行系统命令以及绕过登录限制等。

​ 代码层最佳防御sql漏洞方案:使用预编译sql语句查询和绑定变量。

  • 使用参数化查询接口
  • 对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。
  • 确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。
  • 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
  • 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
  • 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限
  • 避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
  • 过滤危险字符,例如:采用正则表达式匹配union、sleep、and、select、load_file等关键字,如果匹配到则终止运行。

​ Web程序代码中对用户提交的参数未做过滤或过滤不严,导致参数中的特殊字符破坏了HTML页面的原有逻辑,攻击者可以利用该漏洞执行恶意HTML/JS代码、构造蠕虫、篡改页面实施钓鱼攻击、以及诱导用户再次登录,然后获取其登录凭证等。

​ XSS漏洞本质上是一种html注入,也就是将html代码注入到网页中。那么其防御的根本就是在将用户提交的代码显示到页面上时做好一系列的过滤与转义

  • 过滤输入的数据,对例如:“ ‘ ”,“ “ ”,” < “,” > “,” on* “,script、iframe等危险字符进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
  • 不仅验证数据的类型,还要验证其格式、长度、范围和内容。
  • 不仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
  • 对输出到页面的数据进行相应的编码转换,如HTML实体编码、JS编码等。

​ XXE漏洞全称XML External Entity Injection即XML外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。XEE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

  • 检查所使用的底层XML解析库,默认禁止外部实体的解析
  • 是若使用第三方应用代码,需要及时升级补丁
  • 是对用户提交的XML数据进行过滤,如关键词:<!DOCTYPE和<!ENTITY或者SYSTEM和PUBLIC等

​ CSRF是跨站请求伪造,不攻击网站服务器,而是冒充用户在站内的正常操作。通常由于服务端没有对请求头做严格过滤引起的。CSRF会造成密码重置,用户伪造等问题,可能引发严重后果。绝大多数网站是通过 cookie 等方式辨识用户身份,再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。CSRF攻击会令用户在不知情的情况下攻击自己已经登录的系统。

  • 验证请求的Referer是否来自本网站(但可被绕过)
  • 在请求中加入不可伪造的token,并在服务端验证token是否一致或正确,不正确则丢弃拒绝服务。

​ SSRF(Server-Side Request Forgery,服务器端请求伪造):通俗的来说就是我们可以伪造服务器端发起的请求,从而获取客户端所不能得到的数据。SSRF漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤。

​ 这个漏洞造成的危害有:

(1)可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息; (2)攻击运行在内网或本地的应用程序(比如溢出); (3)对内网Web应用进行指纹识别,通过访问默认文件实现; (4)攻击内外网的Web应用,主要是使用Get参数就可以实现的攻击(比如Struts2漏洞利用,SQL注入等); (5)利用File协议读取本地文件。

  • 禁用不需要的协议,只允许HTTP和HTTPS请求,ban掉php伪协议如file://, gopher://, ftp://
  • 白名单的方式限制访问的目标地址,禁止对内网发起请求
  • 过滤或屏蔽请求返回的详细信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
  • 验证请求的文件格式
  • 禁止跳转
  • 限制请求的端口为http常用的端口,比如 80、443、8080、8000等
  • 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

​ 命令或代码执行漏洞是指代码未对用户可控参数做过滤,导致直接带入执行命令和代码,通过漏洞执行恶意构造的语句,执行任意命令或代码。

  • 严格过滤用户输入的数据,禁止执行非预期系统命令。
  • 减少或不使用代码或命令执行函数
  • 客户端提交的变量在放入函数前进行检测
  • 减少或不使用危险函数

 文件上传漏洞通常由于代码中对文件上传功能所上传的文件过滤不严或web服务器相关解析漏洞未修复而造成的,如果文件上传功能代码没有严格限制和验证用户上传的文件后缀、类型等,攻击者可通过文件上传点上传任意文件,包括网站后门文件(webshell)控制整个网站。

  • 对上传文件类型进行验证,除在前端验证外在后端依然要做验证,后端可以进行扩展名检测
  • MIME类型检测以及限制上传文件的大小等限制来防御
  • 限制相关上传文件目录的执行权限,防止木马执行
  • 严格限制上传的文件路径
  • 文件扩展名在服务端白名单校验
  • 文件内容服务端校验
  • 隐藏上传文件路径
  • 将上传的文件其他文件存储服务器中
  • 重命名上传的文件

文件下载或获取文件显示内容页面由于未对传入的文件名进行过滤,利用路径回溯符../跳出程序本身的限制目录,来下载或显示任意文件。

  • 对传入的文件名参数进行过滤
  • 判断是否是允许获取的文件类型
  • 过滤回溯符../

  本地文件包含是指程序在处理包含文件的时候没有严格控制。利用这个漏洞,攻击者可以先把上传的文件、网站日志文件等作为代码执行或直接显示出来,或者包含远程服务器上的恶意文件,进而获取到服务器权限。

  • 严格检查变量是否已经初始化
  • 对所有输入提交可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现./和../等目录跳转符
  • 严格检查文件包含函数中的参数是否外界可控

​ 于没有对登录页面进行相关的人机验证机制,如无验证码、有验证码但可重复利用以及无登录错误次数限制等,导致攻击者可通过暴力破解获取用户登录账号和密码。

  • 如果用户登录次数超过设置的阈值,则锁定帐号(有恶意登录锁定帐号的风险)
  • 如果某个 IP登录次数超过设置的阈值,则锁定IP
  • 增加人机验证机制
  • 验证码必须在服务器端进行校验,客户端的一切校验都是不安全的。

​ 由于没有对用户访问角色的权限进行严格的检查及限制,导致当前账号可对其他账号进行相关操作,如查看、修改等。对低权限对高权限账户的操作为纵向越权,相同权限账户之间的操作成为横向越权也称水平越权。

  • 对用户访问角色的权限进行严格的检查及限制
  • 在一些操作时可以使用session对用户的身份进行判断和控制

​ 由于没有对网站敏感页面进行登录状态、访问权限的检查,导致攻击者可未授权访问,获取敏感信息及进行未授权操作。

  • 页面进行严格的访问权限的控制以及对访问角色进行权限检查
  • 可以使用session对用户的身份进行判断和控制

​ 有的Web 应用程序中使用URL参数中的地址作为跳转链接的功能 ,攻击者可实施钓鱼、恶意网站跳转等攻击。

  • 在进行页面跳转前校验传入的URL是否为可信域名
  • 白名单规定跳转链接

​ 在页面中或者返回的响应包中泄露了敏感信息,通过这些信息,给攻击者渗透提供了非常多的有用信息。

  • 如果是探针或测试页面等无用的程序建议删除,或者修改成难以猜解的名字。
  • 不影响业务或功能的情况下删除或禁止访问泄露敏感信息页面。
  • 在服务器端对相关敏感信息进行模糊化处理。
  • 对服务器端返回的数据进行严格的检查,满足查询数据与页面显示数据一致。

【参考资料】:

腾讯云开发者社区-《【漏洞加固】常见Web漏洞修复建议》