XSS漏洞讲解与多篇实战讲解

跨站脚本攻击 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

页面返回内容为:

XSS漏洞讲解与多篇实战讲解_第1张图片

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

http://127.0.0.1:5000/?id=

页面返回内容为:

XSS漏洞讲解与多篇实战讲解_第2张图片

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

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

4个可能存在XSS的位置

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

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

HTML节点内容

我的头发呢?

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

我都头发呢

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

HTML属性

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


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


# src应该是图片的地址,onerror的意思是如果找不到图片或者加载失败,就执行的功能

如果图片存在,比如:

    

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

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

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

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

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

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

JS代码

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


网址中是这样的

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

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

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

富文本

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

转义

html中的转义:

显示结果:实体名称:实体编号
< : < : <
> : $gt; : >
" : "e; : "
' : %apos;  : '
( :(
) : )

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

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

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

127.0.0.1:5000/?id=
127.0.0.1:5000/?id=

常用绕过waf

1.

转义,即上面的标签转义,但是必须要用在标签里面

2.

改变大小写

3.

hex,url编码

4.

使用其他标签引用,比如onerror,onchange等

5.

使用js自带的函数编码

6.

使用 ` 代替括号

7.

使用svg标签插入,可以绕过注释

 

 

 

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

bypass xss[1]

权限维持

即如果你入侵成功后台后,修改登陆成功文件,利用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后台,就能实现反向入侵。

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

跨站脚本攻击靶场 XSS LEVEL 1

xss-labs是国内一个大佬开源的xss漏洞靶子,包含一些常见的xss攻击方法。

为了方便下载,已经保存到当前服务器下

下载地址[2]

LAVEL 1

进入第一关卡,发现在url中传递的参数为:

name=浪子

并且页面输出浪子

XSS漏洞讲解与多篇实战讲解_第3张图片

可以推断页面会直接输出name对应的值,那么替换成js代码即可完成。

XSS漏洞讲解与多篇实战讲解_第4张图片

过关方式为:

1. http://127.0.0.1/xss/level1.php?keyword=test
2. http://127.0.0.1/xss/level1.php?name=test
3. http://127.0.0.1/xss/level1.php?name=test
4. http://127.0.0.1/xss/level1.php?name=aaa

总结:可以通过/标签弹窗,可以通过标签里的onerror事件弹窗,可以通过javascript弹窗

LAVEL 2

这一关可以看到和第一关一样,也是直接输出内容,但是输出的内容在一个文本框里面。

XSS漏洞讲解与多篇实战讲解_第5张图片

通过查看页面的源代码,发现传递的参数输出的位置为:

XSS漏洞讲解与多篇实战讲解_第6张图片

因为输出的位置在一大段文字中,只需要闭合前后将js标签调用出来就行了

XSS漏洞讲解与多篇实战讲解_第7张图片

通过方式:

1. http://127.0.0.1/xss/level2.php?keyword="/>

过滤:输出点被一大段文字包围

绕过:输出点在文本框内,能够通过闭合文本框标签进行弹窗

LEVEL 3

这一关和第二关一样,都是在一大段文本中显示出你输入的参数,这个时候查看源代码,发现是单引号包围,尝试使用单引号闭合,方式:

http://127.0.0.1/xss/level3.php?keyword='/>

这个时候并没有想象中的弹窗,查看源代码,发现被转义了,被转义的是:

XSS漏洞讲解与多篇实战讲解_第8张图片

< : <
> : >

因为<和>被转义,那么尝试直接用被转义后的实体内容带入呢?

'><script>alert(1)<script>

还是不行,请原谅我都无知- -

查找资料

资料[3]:

两处输出都对双引号、尖括号和&进行了HTML实体编码,但前面的单引号可以被闭合,考虑使用input标签的某些事件执行脚本。

自动聚焦到输入框,打开就弹
http://47.94.13.75/test/level3.php?keyword=' onfocus='alert()' autofocus='
自动聚焦到输入框,打开就弹
http://127.0.0.1/xss/level3.php?keyword=' onfocus='alert()' autofocus='
点击页面非输入框的任何地方以移开焦点
http://127.0.0.1/xss/level3.php?keyword='  autofocus onblur='alert()
点击输入框
http://127.0.0.1/xss/level3.php?keyword=' onfocus='alert()
http://127.0.0.1/xss/level3.php?keyword='  onclick='alert()
在输入框输入
http://127.0.0.1/xss/level3.php?keyword=' oninput='alert()
输入然后点击搜索
http://127.0.0.1/xss/level3.php?keyword=' onchange='alert()
移动鼠标经过输入框
http://127.0.0.1/xss/level3.php?keyword=' onmousemove='alert()
http://127.0.0.1/xss/level3.php?keyword=' onmouseout='alert()
http://127.0.0.1/xss/level3.php?keyword=' onmouseover='alert()
点击输入框,进行按键操作
http://127.0.0.1/xss/level3.php?keyword=' onkeydown='alert()
http://127.0.0.1/xss/level3.php?keyword=' onkeyup='alert()
http://127.0.0.1/xss/level3.php?keyword=' onkeypress='alert()
双击输入框
http://127.0.0.1/xss/level3.php?keyword='  ondblclick='alert()
更多可用事件可以参考这里:https://www.w3schools.com/tags/ref_eventattributes.asp

收获:闭合标签属性的单引号并在标签中添加事件。

过滤:waf对双引号,尖括号,和&符号进行编码

绕过:此时通过标签里面的事件进行触发弹窗

收获:学到了许多在标签内的触发事件

LEVEL 4

通过上面三道题,逐渐掌握了做xss的套路,首先我们要明白,弹窗所需要的条件是什么,我梳理了一下:

1.<2.

 

3."4.'5.(6.)7.script,on*事件,alert8.:

 

以上是可以闭合前后标签,并且能弹窗的条件,如果没有任何拦截的话,直接弹窗就行,但是waf或者后台代码肯定会对这些标签要么转义,要么替换,这个有点类似sql注入,找到哪个标签被过滤,然后进行其他方式的绕过。

第四关中,我输入admin"和admin',然后查看页面的源代码,发现都没有被过滤,然后输入/,发现尖括号都被替换成空了,输入(aaa),发现()没有被过滤,整理一下:

过滤:<>

这样就没办法闭合标签,也没办法使用script标签或者img标签实现弹窗,但是因为在第三关中学到了在事件中on*事件触发弹窗,只需要闭合双引号即可。

http://127.0.0.1/xss/level4.php?keyword=" onclick="alert(1)

然后点击输入框,即可完成弹窗。

总结:通过输入一些弹窗的标签条件,查看源码哪些标签被过滤,然后组合其他没有被过滤的进行弹窗,这样就能诞生出自己挖掘xss的方法门路,具体实现在LEVEL 5中实现了

收获:很有必要检查闭合方式

LEVEL 5 (importance)

从level4中整理的经验,自己可以整理一下套路方法。尝试对一系列的标签进行检测,找到被过滤和没有被过滤的以及输入框的闭合形式:

闭合形式:

 双引号闭合

尝试输入下面的关键标签,找到过滤与没有过滤的:

1. addd"
2. ad'
3. (aaa)
4. 
5. 

在标签内事件弹窗:

 

 

 

通过js代码弹窗

  点我<>

 

 

收获:通过javascript可以实现在a标签内弹窗

LEVEL 6 (importance)

通过第五关,感觉自己发掘了自己的XSS弹窗秘诀呢,按照套路走一次,看看闭合方式以及被过滤的标签有哪些吧:

闭合方式:

 双引号闭合

过滤:

onerror会变成o\_error,

完成弹窗:

http://127.0.0.1/xss/level6.php?keyword=a">
http://127.0.0.1/xss/level6.php?keyword=admin" oNClick="alert(1)

宝贵的经验:

对LEVEL 5的套路上优化,步骤如下:

1.

首先找到输入口闭合方式

2.

找到被过滤的标签,尝试输入下面标签,然后看返回值哪些被过滤了:

 
        

然后点击添加友链:

http://127.0.0.1/xss/level9.php?keyword=http://www.langzi.fun/upload/xss.html

点击友情链接,虽然弹框了,但是并没有提示通关成功的通知,看来方向错了噢

XSS漏洞讲解与多篇实战讲解_第10张图片

所以说,人一旦方向错了,就成傻逼了,目标会检测输入框中有没有

    http://

这个关键词,那么只要输入的参数有这个关键词即可,直接用上一次的代码,把弹窗内容改成关键词不就行了吗,我真是个睿智啊哦我擦

http://127.0.0.1/xss/level9.php?keyword=javas%0dcript:alert('http://')

LEVEL 10

这一关比较细节,尝试使用keyword做关键词搜索,输出点在网页的文本:

http://127.0.0.1/xss/level10.php?keyword=1

按照套路走一波流程,运行上面的所有技巧都没办法在一大段文本中实现弹窗,只能把目光放在下面的参数中:

XSS漏洞讲解与多篇实战讲解_第11张图片

写过前端的小伙伴对这样一定不陌生,发现下面有三个输入点,分别进行尝试:

http://127.0.0.1/xss/level10.php?t_link=111
http://127.0.0.1/xss/level10.php?t_history=111
http://127.0.0.1/xss/level10.php?t_sort=111

发现第三个参数会在页面输出内容(要通过查看源代码),继续按照套路走一次:

闭合方式:

     双引号闭合

过滤:

    

在标签内事件弹窗:

    

    

    

通过js代码弹窗

    

常见的绕过

1.

大小写绕过

2.

重复文件名绕过,比如sscriptcript

3.

javascript中(利用空白符如水平制表符HT,换行符LF,回车键CR来截断关键字)

4.

如果页面的编码为gb*,即只要不是utf-8编码的,尝试宽字节注入

5.

使用 ` 代替括号

6.

HTML转义,在上面说到的实体名称和编号就是一个例子,比如:

 s

 

 

转义成:

    s

1.当js解释器在标识符名称(例如函数名,属性名等等)中遇到unicode编码会进行解码,并使其标志符照常生效。而在字符串中遇到unicode编码时会进行解码只会被当作字符串。注意:使用unicode编码之前要确定对方有没有过滤\。即:

将:

        

转成:

        

转载 技巧 1

来源[4]

    对付那种无任何过滤的
        
        
        
        GO

    输出在<script></script>之间的情况(意思就是你在script里面,得把前面的闭合了在注入语句,然后因为你在script里面直接输入语句即可)
        先闭合上一个script然后在注入恶意代码:

    2、编码绕过
    1.十六进制编码
    2.jsfuck编码
    3.url编码
    4.unicode编码
    <0x736372697074>alert('123')

    

    3、绕过magic_quotes_gpc
    

    4、标签
    闭合标签

    ">

    

    标签绕过

    

    

一些技巧

1.

如果页面没有输入框,但是又能触发xss,可以在标签中插入:

 type=button
 type=text

 

来自己构造输入框,按钮。

1.有的时候cookie,或者请求头会存在xss漏洞。

优质XSS教程[6]

secplus xss总结[7]

跨站脚本攻击靶场 XSS LEVEL 2

brutexss是一款自动检测xss漏洞的工具,开源地址[8]我稍微修改了一下,实现批量检测xss的功能。

虽然他的检测方式是对传入的url加载payload,然后查看返回的网页中是否存在payload,这种方式的误报会比较多,但是对我这种基础的小学生来说,能够掌握其中几个payload,结合实战获取宝贵的经验,就很满足了。

chapter 1

页面返回的内容为:

XSS漏洞讲解与多篇实战讲解_第12张图片

在搜索框中,如果没有结果则会直接输出传入的内容,即:

输入点:keyword
输出点:没有搜索到“aaaaaa”相关纪念币资料!

可以看到输出点在一段文本中,按照之前得到的宝贵经验,先测试一些必备的参数看看有无过滤,发现并没有....

检测:"

实现弹窗:

XSS漏洞讲解与多篇实战讲解_第13张图片

收获:搜索框返回的位置很敏感,输出位置多测试看看什么标签可以使用。

chapter 2

XSS漏洞讲解与多篇实战讲解_第14张图片

这个在页面中并没有结果显示,但是你访问这个网址是不会报错,通过查看页面的源代码,找到了输出点:

XSS漏洞讲解与多篇实战讲解_第15张图片

双引号闭合,按照宝贵的经验测试一下必备的参数看看有没有过滤:

alert被拦截了- -,哦霍弹窗我只会alert啊,看看有没有其他方法实现弹窗目的,查了下笔记,js有三个方法可以弹窗,学到了学到了

1.alert2.prompt3.confirm

链接[9]

XSS漏洞讲解与多篇实战讲解_第16张图片

通过onmousemove(鼠标移动事件)+confirm实现弹窗,美滋滋美滋滋

XSS漏洞讲解与多篇实战讲解_第17张图片

查看扫描器的payload,才发现自己的知识有多么浅薄...原来只是过滤了script+alert的组合...

XSS漏洞讲解与多篇实战讲解_第18张图片

总结:js的弹窗有三种方式可以实现。分别是alert,confirm,prompt。通过svg标签也可以实现弹窗。

chapter 3

首先页面没有显示传入的参数,并且参数接受的只能是数字,出现英文则会报错,弹出这个:

XSS漏洞讲解与多篇实战讲解_第19张图片

感觉是对传参判断,只能是数字类型,否则后端直接返回一个弹窗,就在我要放弃的时候,群里有个大佬告诉我可以通过错误页面输出导致的xss,即网址存在waf拦截,但是把,你加上敏感参数比如and 1=1的话,页面返回的内容就够意思了:

XSS漏洞讲解与多篇实战讲解_第20张图片

这下ok了,只需要在后面加上弹窗语句就能弹窗了,总的来说还是经验不够啊。学到老活到老。

XSS漏洞讲解与多篇实战讲解_第21张图片

总结:对于存在waf的网址,多观察他的输出内容,可以加上敏感参数触发更多的显示内容,然后进行弹窗测试。

chapter 4

显示的结果是这样的,可能存在xss噢

XSS漏洞讲解与多篇实战讲解_第22张图片

查看页面源码,找输出位置:

发现是尖括号好像都变了样子,以我现在的水平当然找不到怎么突破这个.....

XSS漏洞讲解与多篇实战讲解_第23张图片

尝试使用事件触发弹窗,发现还是不行,输出点绕不过去....

XSS漏洞讲解与多篇实战讲解_第24张图片

又到了思维死点了,这个时候我尝试搜索一些存在的物品,页面返回的源码惊呆我了

XSS漏洞讲解与多篇实战讲解_第25张图片

如果存在物品,在下面会返回物品的网址!!

好吧确实不能限于找输出点的时候输入aaaaaa的死胡同,搜索存在的物品可能会发现更多的信息。

这个时候闭合双引号然后弹窗就行了

XSS漏洞讲解与多篇实战讲解_第26张图片

总结:找输出点的时候,可以先搜索哪些存在,哪些不存在,有时候返回的信息是不一样的。

chapter 5

返回页面中存在输入点返回的内容

XSS漏洞讲解与多篇实战讲解_第27张图片

唯一输出点在这个js函数中,虽然我没学过js,但是我想试一试能不能尝试闭合这个js函数然后插入脚本,结果是失败了- -,好吧,这个挺简单的,直接闭合前面的script标签,然后中间插一个标签即可

XSS漏洞讲解与多篇实战讲解_第28张图片

总结:如果输出位置在js的函数中,可以直接闭合函数

chapter 6

这个一下就找到了输入点和输出点,但是有waf....

XSS漏洞讲解与多篇实战讲解_第29张图片

经过很多测试都没通过,最后测试svg标签发现成功弹窗,原来是waf没有过滤svg标签,看来很有必要多学学html中的事件触发了

XSS漏洞讲解与多篇实战讲解_第30张图片

总结:当一些标签事件被过滤的时候,要有耐心测试其他的标签,结合使用,所以很有必要整理html中的触发事件。

chapter 7

这个和上面一样,不过诱惑点很多,比如:

XSS漏洞讲解与多篇实战讲解_第31张图片

看到输出这么多aaaaaaa,就判断差不多有插入位置,但是测试了好久都没有找到 - -

想到上面那个卖药的例子,于是搜索了一下存在的物品,在网页源代码找到位置

直接截断输出:

XSS漏洞讲解与多篇实战讲解_第32张图片

XSS漏洞讲解与多篇实战讲解_第33张图片

chapter 8

这个在这里[10]看到的,过滤规则是把英文的>改成了中文的>,作者的思路是通过img标签的src错误引用触发弹窗,即


总结:多搜索一些物品,找到稳定的输出点。

 

跨站脚本攻击靶场 XSS LEVEL 3

这些资料都是在网上找到了,只有一小部分才是自己总结的知识点,为了把这些知识点变成自己的,需要反复的背与狂练习。

弹窗标签

a标签

点我啊
#javascript协议
点我
# data协议

# url编码的data协议

点我
# 另两种方式实现

script标签




# 直接弹窗

# javascript协议编码

# 如果输出是在setTimeout里,我们依然可以直接执行alert(1)

button标签


# 点击弹窗

p标签

点我

# 可以直接使用事件触发

img标签


# 可以使用事件触发

body标签


# 事件触发








































# 第二个没看懂...,百度后知道 onscroll 事件在元素滚动条在滚动时触发,即页面存在很多内容,需要滚动才能看到下面的内容的是偶,就会触发

var标签

M
# 事件触发,一般是用不需交互的事件比如鼠标移动等

div标签

X
# 事件触发

input标签

和button一样通过autofocus可以达到无需交互即可弹窗的效果。



select标签