跨站脚本攻击 XSS攻击基础

变态和变态相遇,有一半的可能会情投意合,一般的可能会彼此恶心。这个变态把我恶心坏了。

概述

个人对XSS攻击的原理认知:

原理:对可以控制传参的位置,比如url链接中,输入框中,首先闭合输出参数位置前后网页标签,在闭合的中间加上JavaScript代码或者其他的html标签,使得网页能够执行你添加的参数功能。

危害:凡是js能做的,大部分xss漏洞都能利用,常见的比如获取当前cookie,获取浏览器保存的账号密码 、获取屏幕截图,获取页面的数据,改变页面的逻辑,向服务器发送数据请求等。

情景:在挖洞的情景下,只要保证能弹个窗,或者执行js代码即可。但是其中会涉及到很多前端相关的知识,比如如何在不同标签下触发弹窗,怎么绕过拦截等等。

分类

xss分三种,分别为反射型,存储型,DOM型。但是按照攻击代码来源可以分成两种:

  • 反射型:通过URL参数直接注入
  • 存储型:保存到网址数据库,在其他用户访问该数据的时候会被读取并执行,常在留言板,下单栏,文章频率,输入框等。

首先看第一种,通过源码来分析他的原理,首先写一个简单的flask后台,功能很简单,只负责返回输出用户输入的参数,代码如下:

from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def index():
    data = request.args.get('id')
    return data
if __name__ == '__main__':
    app.run()

使用火狐浏览器,打开网址:

http://127.0.0.1:5000/?id=langzi666

页面返回内容为:

因为传入的参数是可以控制的,并且没有任何的过滤机制,直接控制id的变量即可,访问:

http://127.0.0.1:5000/?id=<script>alert('浪子好帅啊~~要晕了')</script>

页面返回内容为:

但是这张插入在url中代码很长很可疑,可以做短网址处理。

第二种存储型,即网页提供一个输入框,你在其中填写js代码后,后台保存到数据库,当其他人或者管理员查看你输入的内容的时候,就会出发js代码。

4个可能存在XSS的位置

在下面这些点中可以存在xss注入点:

  1. HTML节点内容:网页的内容包含用户输入的信息
  2. HTML属性:网页的节点的属性是由用户输入的信息组成,跃出节点属性的范围
  3. JS代码:js代码中由后台注入的变量,或者包含用户输入的信息
  4. 富文本:一大段的html

HTML节点内容

<div>我的头发呢?</div>

比如这个的节点,中间输出用户输入的内容,那么能够控制输出的内容。变成这样:

<div>我都头发呢<script>alert(在我这里!)</script></div>

因为中间的变量是可以控制的,所里这里可能存在XSS攻击。

HTML属性

比如有一张图片,图片来自用户的输入(之前上传的图片地址,外部图片地址,等等),正常情况下应该是这样的结果:

<img src="http://www.langzi.fun/upload/my_girl.jpg"/>

但是因为节点变得可控,就有可能变成这样的结果:

<img src="1asd1a" onerror="alert(1)"/>
# src应该是图片的地址,onerror的意思是如果找不到图片或者加载失败,就执行的功能

如果图片存在,比如:

<img src="http://www.langzi.fun/upload/my_girl.jpg" onerror="alert(1)"/>

是不会触发弹窗的,那最上面的flask例子就能证明,分别访问下面两个网址:

http://127.0.0.1:5000/?id=<img src="http://www.langzi.fun/upload/my_girl.jpg" onerror="alert(1)"/>
http://127.0.0.1:5000/?id=<img src="阿斯顿撒法呃1asdy_girl.jpg" onerror="alert(1)"/>

前者不触发,后者触发。有些网站是通过如下方式获取图片的,比如:

http://www.langzi.fun/image/1

这样会调出第一张图,通过下面方式闭合img标签,填写错误不存在的图片即可完成xss

http://www.langzi.fun/image/1dasd122safqas" onerror="alert(1)

JS代码

后端传递过来的代码应该是这样:

<script>var data = 'hello'</script>

网址中是这样的

http://www.langzi.fun/?data=hello

因为参数可控,所以只需要和上面一样,进行闭合然后加上js代码即可

http://www.langzi.fun/?data=hello';alert(1)'

富文本

网址的编辑器都是富文本编辑器,富文本指在编辑的需求下,是需要允许部分HTML标签在渲染后有效的,但是又有部分诸如script这样的标签不应该有效,而且仅仅滤去script还不够,还有更多情况像img这样必不可少、看似安全的标签也会让人有机可乘。

转义

html中的转义:

显示结果:实体名称:实体编号
< : &lt; : &#60;
> : $gt; : &#62;
" : &quote; : &#34;
' : %apos;  : &#39;
( :&#x28;
) : &#x29;

xss防御会把这些html中用来闭合的位置进行转义,这些转义后的符号在html的内容中并不会出现异常效果和原来的一样。但是有些位置即使没有引号闭合,如果中间有空格也会造成xss。

如果后端代码会把单引号替换或者屏蔽,可以用上面的实体名称或者实体编号代替,可以简单的绕过拦截。

即访问上面flask的网址也会出现弹窗:

127.0.0.1:5000/?id=<img src=hello onerror='alert(1)'/>
127.0.0.1:5000/?id=<img src='hello'onerror='alert(1)'/>

常用绕过waf

  1. 转义,即上面的标签转义,但是必须要用在标签里面
  2. 改变大小写
  3. hex,url编码
  4. 使用其他标签引用,比如onerror,onchange等
  5. 使用js自带的函数编码
  6. 使用 ` 代替括号
  7. 使用svg标签插入,可以绕过注释

    <svg onload=";alert('插入svg标签成功~')">
    

这个网上有许多许多的资料,我对xss还并不是很熟,所以就不班门弄斧了。

bypass xss

权限维持

即如果你入侵成功后台后,修改登陆成功文件,利用js代码获取每次登陆成功后管理员的cookie,发送到你的服务器。

比如登陆后台地址为:

http://www.langzi.fun/admin.php

登陆成功后会跳转到:

http://www.langzi.fun/admin_manage.php

这个时候修改admin_manage.php代码的文件,就能持续获取管理员的cookie。

反入侵webshell箱子

一些目录文件会做后门,做后门的方式即获取该目录当前路径和密码,然后发送到箱子的服务器上面。

这个时候如果你能成功抓到数据库,将发送的数据进行篡改,改成一段获取cookie的js代码,这样就能获取到webshell箱子服务器后台的cookie,通过找到该webshell后台,就能实现反向入侵。

不过这是太理想化的情况,实际情况会复杂很多。

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%