朋友的XSS我来挖,定叫他满载而归

admin 2025年2月18日19:34:23评论4 views字数 2352阅读7分50秒阅读模式

朋友的洞我来挖,定叫他满载而归^ ^。

朋友的XSS我来挖,定叫他满载而归

开始渗透

朋友的XSS我来挖,定叫他满载而归

让我看看怎么个事奥,打开神秘小链接:

朋友的XSS我来挖,定叫他满载而归

看上去是个上传点,能预传一个参数。

基础测试

先看看参数被传到哪了,随便传个payload:

朋友的XSS我来挖,定叫他满载而归

可以看见一共有两处找到:

朋友的XSS我来挖,定叫他满载而归
朋友的XSS我来挖,定叫他满载而归

再看看字符转义,看看怎么转的,顺便检测下哪些被转义了。常用字符串一把梭先:

'"();//

朋友的XSS我来挖,定叫他满载而归

可以看到单引号和括号倒确实被转义了,不过双引号和注释没有。由于这种转义并非普通的加斜线等操作,没有什么从转义手段上绕过的余裕。

于是我开始为了逃逸单引号疯狂努力(从现在的角度来看,又是一番白费功夫)。

单引号跑路计划

由于笔者对浏览器中的js执行真心不太了解,首先尝试的是通过换行来截断上一个语句然后在新的行里执行payload。后来发现浏览器会在发生错误时停止执行后续语句- -。

然后就是想办法弄出一个单引号来,比如用编码。但是实体编码本来就不解析,url编码没用,也没啥好办法。

其实测到这里已经没啥好测的了,闭合不了单引号就算能逃逸也没法避免解释器在报错时停下。

而我的朋友,跟我执着的点并不一样,他在看括号:

朋友的XSS我来挖,定叫他满载而归

括号适应症

单引号这边没什么进展,转过来看看别的也好。

鉴于之前我对单引号的各种绕过尝试都宣告失败,这里就不额外尝试。我们直接绕过括号,寻找一个:

①不需要括号

②能一定限度造成危害

的payload。

首先,没有括号那么带有函数调用的payload都可以扔了,比如alert这类弹窗的。这并不意味着我们没有拳脚可施展——实际上,基于浏览器的JS运行会依赖很多全局变量,通过修改全局变量也可以达到劫持用户浏览器的效果。

比如说:

document.title="X" //修改页面标题document.location="X"//重定向页面document.cookie="X"//修改用户cookie

用处最大的应该还是第二句,可以直接将用户重定向到特制的钓鱼网站。

那么括号问题还是比较简单的解决了。

括号适应症v2

找到合适的payload之后,朋友又提醒我有一处注入点可以不使用单引号闭合:

朋友的XSS我来挖,定叫他满载而归
朋友的XSS我来挖,定叫他满载而归

但这里有一个问题:payload被注入在$.post(jquery post)方法内,想让它从这个post里出来还是需要补全})。

如果不想补全,避开这个问题,我一开始采用的是字符串拼接。但这很明显有问题。

JS特性讲解

熟悉JS特性的人可能知道,JS可以将绝大部分类型的数据与字符串进行拼接,这得益于JS万物皆对象(很泛滥的一个概念,JS是其中实现得最为鬼畜的一个之一)的特性。

朋友的XSS我来挖,定叫他满载而归

那么当这个数据变成函数调用呢?比如从1+"a"变成"a"+Math.pow(1,1)呢?答案是还是可以拼接:

朋友的XSS我来挖,定叫他满载而归

这是因为函数也有返回值,这里Math.pow()的返回值是一个数字。

但当我们使用(这里为了不跳转使用document.title代替)赋值语句呢?

朋友的XSS我来挖,定叫他满载而归

这样看上去没什么毛病,这是因为哪怕赋值语句在JS里也是有返回值的。但两边元素换一下呢?

朋友的XSS我来挖,定叫他满载而归

报错了,原因为“表达式左侧无效”。

但上一个等式中语句也在右边,却没有报错。这是因为()与=的算术优先级不同,()的优先级高于+,而=的优先级最低。

也就是说,当前方有字符串时,赋值表达式要生效应当写成"a"+(document.title="1")这种形式,但这与我们上文得到的”不能使用括号“的结论并不相符。

综上所述,直接拼接payload与前方的字符串达到闭合的思路是不可行的。

如果我们不能拼接字符串,那么就要想办法提前结束$.post方法,将payload作为单独语句执行。但这很明显也不能做到,因为$.post是一个函数,既然是函数那它肯定会以)结束——如要补全方法,还是需要输入一个括号。

这样看下来,貌似所有方法都绕不过括号或单引号,真是让开发给限制死了。

朋友的XSS我来挖,定叫他满载而归

但,真如此吗?

我去就山

要寻找破局点,恐怕还得从第二个点所在的函数也就是$.post下手。作为一个发包函数,它无疑有很多参数和可选参数(没使用过这个函数的读者可以用python里的request.post类比),它的原型如下所示:

https://api.jquery.com/jQuery.post/

朋友的XSS我来挖,定叫他满载而归

而第二个注入点的代码如下所示:

 $.post("http://*****/file/xxx",{"id":data.values.id,"v2":"***"},function(text){   var data = mini.decode(text);   if(data.success){      layer.msg('删除成功',{icon:6});      uploader.removeFile(file);}else{      layer.msg(data.mesg,{icon:7});}})

可以看到注入点在data处,这里传入参数为json,也就是说,这里的参数是可以随意增加的!

那么我们是不是能构造一个形如{"a":"1","b":payload}的参数呢?答案是可以:

朋友的XSS我来挖,定叫他满载而归

绕不过括号?那就不绕辣!直接加个参数给json让它在提交请求包时自动跳转到钓鱼网站,十分之优雅~

朋友的XSS我来挖,定叫他满载而归

payload为1%22,%22b%22:document.location=%22http://www.baidu.com

*由于劫持网址的具体效果不好演示,想看效果的读者可以把上文里代码直接放控制台执行。

后续

获得朋友们一致好评,下课!

朋友的XSS我来挖,定叫他满载而归

. . . * . * 🌟 * . * . . .

由于很多人问我微信群的事情,所以我建了一个小微信群。现在可以在公众号菜单里选择合作交流->交流群获取交流群二维码,希望大家和谐交流,为更好更友善的行业环境贡献自己的力量。

如果喜欢我的文章,请点赞在看。网安技术文章、安卓逆向、渗透测试、吃瓜报道,尽在我的公众号:

原文始发于微信公众号(重生之成为赛博女保安):朋友的XSS我来挖,定叫他满载而归

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月18日19:34:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   朋友的XSS我来挖,定叫他满载而归https://cn-sec.com/archives/3755026.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息