如何对子域名下的网页注入脚本

2021-11-22 10:20:59 +08:00
 SSang

我搞了一个登录页面,用来给一些没有鉴权的第三方的网页做鉴权网关,用 nginx 的 auth_request 做的。 实现的效果是,第三方网页接入 nginx 后,访问反向代理地址如果未登录就跳转到登录页面(有点像是 basicAuth )。

但是登录成功,重定向会第三方网页后,没有登出按钮,只能手动地址栏输入 ..../logout 来登出。

我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?

主要是不想改第三方的代码,也改不动。

(我大概了解了 XSS 注入,但感觉这个得利用网页表单提交等漏洞,而且没有通用性。)

2793 次点击
所在节点    JavaScript
17 条回复
IvanLi127
2021-11-22 10:32:17 +08:00
以前运营商通过 iframe 给 HTTP 站点投广告,你可以如法炮制
metalbitch
2021-11-22 10:33:27 +08:00
nginx 返回网页的时候,进行字符串替换。搜一下 nginx 的字符串替换模块。顺便看一下其他模块有没有更好的解决方案。
2i2Re2PLMaDnghL
2021-11-22 10:53:11 +08:00
见过把用户信息栏全部做成 iframe 的,登录登出按钮

不过鉴于 JavaScript 完全可以在同一个页面上组装,你直接手动添加一段 JS 添加按钮就行,当自己在写用户脚本,脏就完事儿了
Saxton
2021-11-22 10:54:53 +08:00
反向代理可以替换文本, 找个合适的地方替换下就行, 我之前为了方便插入统计代码,直接在反代上插入到 head 里
zjsxwc
2021-11-22 11:01:09 +08:00
楼主的需求仅仅只是
“我想知道对子域下的网页理论上是否能实现注入一个登出按钮?有什么限制?”

加个登出按钮而已,登出按钮使用 get 请求,插入 js 很容易实现啊,最多处理下跨域问题。
SSang
2021-11-22 11:02:43 +08:00
```
location / {
index index.html index.htm index.php;
sub_filter '</head>' '</head> <body><a href="http://xxxxxx/logout">logout</a></body>';
sub_filter_once on;
}
```

感谢各位,简单验证了一下,替换文本可以。
SSang
2021-11-22 11:04:42 +08:00
@2i2Re2PLMaDnghL
@IvanLi127
iframe 是不是得改第三方网页的代码呀?
metalbitch
2021-11-22 11:10:28 +08:00
@SSang 应该谢谢我
SSang
2021-11-22 11:11:43 +08:00
@zjsxwc 我不是很懂,不改第三方代码的情况下,比如我 302 跳转到 baidu ,能在百度的页面添加按钮吗?
SSang
2021-11-22 11:17:23 +08:00
噢,iframe 的我大概理解了,应该是指 iframe 包装第三方页面再发送回去吧
metalbitch
2021-11-22 11:17:32 +08:00
@SSang html 过了你的服务器,你就可以修改内容。不过你的服务器,你就没法修改内容。他说的插入 js ,插在哪里啊?你的 302 是返回给浏览器看的,客户浏览器直接请求了 baidu ,你怎么干涉啊?有点儿现实感。
SSang
2021-11-22 11:27:01 +08:00
@metalbitch 我知道,过了服务器,我就可以替换,我要给百度添加按钮就得让百度成为我的子域反代到百度,这个用你说的文本替换就能实现。但是我没理解他说的插入 js 很容易实现是指什么?
metalbitch
2021-11-22 11:34:04 +08:00
@SSang 他瞎说呗,跨域问题,也是指两个网站都在你掌握下。因为浏览器安全策略阻止,调试两个网站来完成跨域。你明显说了有第三方网站的问题,所以他瞎说,跟 get 请求更没毛线关系。
SSang
2021-11-22 11:39:58 +08:00
感觉我的场景 sub_filter 会比 iframe 好一点,sub_filter 配置比较无脑,懂一点 html/js 基本就能配了,iframe 用户体验和原本稍微有点不一样了,而且实现起来相对复杂点。

iframe 看起来能实现的功能会比 sub_filter 更强大,不过配置成本也更高。
SSang
2021-11-22 11:42:36 +08:00
@metalbitch 噢,谢谢。我就觉得跨域应该没啥希望,除非每个网页都有表单之类的,还不防 xss 注入,所以我问的时候还特意说了子域下。感觉还是你说的文本替换靠谱点。
metalbitch
2021-11-22 12:01:24 +08:00
顺便提一下,nginx 是个服务器软件。你可以自己用 php ,java 写登录页面(页面可以想怎么美化就怎么美化),登录成功后使用 php ,java 等代理第三方网站(估计就一行代码),返回给用户。这样就可以脱离自己不熟悉的技术,nginx 就只剩下了常用的配置。
Saxton
2021-11-22 14:43:26 +08:00
@SSang 真没必要 iframe ,sub_filter 是最好的解决方案,按照这样如果没登录就退出,其实完全可以做到自动退出而无需让用户在点一下,插入一段 js 去判断即可,这段改成 sub_filter '</head>' '这里写你的脚本内容或者引入脚本</head>'; 然后在这个 js 里可以做你想做的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817047

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX