安全基础之常见漏洞原理以及防御方式

  不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。

  攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该用户目标的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。

  存储型XSS又称为持久性XSS,攻击脚本将被永久的存放在目标服务器的数据库或文件中,具有很高的隐蔽性;

  这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久的被存放在服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。

  如果我们能够谨慎对待不明链接,反射性XSS将没有多大作为,但存储型XSS不同,它注入在一些我们信任的页面,难免受到攻击。

  DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式;

  DOM型XSS是一种特殊类型的反射型XSS,是基于DOM文档对象模型的一种漏洞;

  HTML的标签都是节点,这些节点组成了DOM的整体结构—节点树。通过HTML DOM,树中的所有节点均可通过Java进行访问。所有HTML元素(节点)均可被修改,也可以创建或删除节点。

  在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document Object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器交互,他只发生在客户端处理数据的阶段。

  攻击方式:用户请求一个经过专门设计的URL,澳门彩开奖现场直播,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

  因为JS触发的XSS就是DOM型XSS,而一般而言dom型的XSS都是反射性,很少有存储型。

  XSS插入的话,一般是动态页面,但是有些是静态页面,不会和数据库发生交互,这就大大提高了安全性,我们就很难XSS了,而考虑到这一点,很多开发也把动态页面假装弄成静态页面,这种页面称为:伪静态页面;

  控制台输入tModified区分动态和伪静态页面,如果时间一直是新的,那么就是动态或者伪静态,如果时间一直不变,那么就是静态,没什么好插的了。

  document支持native编码,那我们可以把我们的XSS代码进行转码,转成native再来XSS代码插入。

  编码:对用户输入的数据进行HTML Entity 编码。把字符转换成 转义字符。Encode的作用是将$var等一些字符进行转化,使得浏览器在最终输出结果上是一样的。

  若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。进行编码处理之后,L在浏览器中的显示结果就是这个文本,将变量作为纯文本进行输出,且不引起Java的执行。

  过滤:移除用户输入的和事件相关的属性。如可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)移除用户输入的Style节点、节点、Iframe节点。(尤其是节点,它可是支持跨域的呀,一定要移除)。

  校正:避免直接对HTML Entity进行解码。使用DOM Parse转换,校正不配对的DOM标签。(DOM Parse:它的作用是把文本解析成DOM结构)

  常见2种方法:a.第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。b.还有一种更简洁:首先是encode,如果是富文本,就白名单。

  常见攻击手段发送csrf的连接,通过伪造请求从而受害者点击后会利用受害者的身份发起这个请求。例如新增一个账号,修改用户密码等等。

  在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

  用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B(内含恶意代码);

  网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

  浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

  ①1.登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录),且cookies或者session 尚未过期;

  这里用户C生成的cookie保证了用户可以处于登录状态,但网站B其实拿不到cookie。

  检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

  并且随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。

  以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

  (Referer:在 HTTP 头中的一个字段,它记录了该 HTTP 请求的来源地址。)

  (Token:服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。)

  简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。

  Token通常使用的方法就是在每次页面加载时,使用 java 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。

  这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

  然而这种方法的局限性非常大。 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。管家婆正版四不像图刘博温

  SSRF(Server-Side Request Forgery):服务器端请求伪造,是一种由攻击者构造请求,由服务端发起请求的安全漏洞。

  一般情况下,SSRF攻击的目标是外网无法访问的内部系统(因为请求是由服务器端发送的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。

  SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。

  对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;

  攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(struts2、SQli等);

  Xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。Xml是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

  DTD用来描述xml文档的结构,一个DTD文档包含:元素的定义规则;元素之间的关系规则;属性的定义规则。

  其作用与DTD一样,也是用于验证xml文档的有效性,只不过它提供了比DTD更强大的功能和更细粒度的数据类型,另外Schema还可以自定义数据类型。此外,Schema也是一个xml文件,而DTD则不是。

  XSS,CSRF,SSRF三种常见的Web服务端漏洞均是由于,服务器端对用户提供的可控数据过于信任或者过滤不严导致的。

  XSS:是服务器对用户输入的数据没有进行足够的过滤,导致客户端浏览器在渲染服务器返回的html页面时,出现了预期值之外的脚本语句被执行。

  CSRF:是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。

  SSRF:是服务器对用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器。

  CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。(XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。)