朋友的洞我来挖,定叫他满载而归^ ^。
开始渗透
让我看看怎么个事奥,打开神秘小链接:
看上去是个上传点,能预传一个参数。
基础测试
先看看参数被传到哪了,随便传个payload:
可以看见一共有两处找到:
再看看字符转义,看看怎么转的,顺便检测下哪些被转义了。常用字符串一把梭先:
'"();//
可以看到单引号和括号倒确实被转义了,不过双引号和注释没有。由于这种转义并非普通的加斜线等操作,没有什么从转义手段上绕过的余裕。
于是我开始为了逃逸单引号疯狂努力(从现在的角度来看,又是一番白费功夫)。
单引号跑路计划
由于笔者对浏览器中的js执行真心不太了解,首先尝试的是通过换行来截断上一个语句然后在新的行里执行payload。后来发现浏览器会在发生错误时停止执行后续语句- -。
然后就是想办法弄出一个单引号来,比如用编码。但是实体编码本来就不解析,url编码没用,也没啥好办法。
其实测到这里已经没啥好测的了,闭合不了单引号就算能逃逸也没法避免解释器在报错时停下。
而我的朋友,跟我执着的点并不一样,他在看括号:
括号适应症
单引号这边没什么进展,转过来看看别的也好。
鉴于之前我对单引号的各种绕过尝试都宣告失败,这里就不额外尝试。我们直接绕过括号,寻找一个:
①不需要括号
②能一定限度造成危害
的payload。
首先,没有括号那么带有函数调用的payload都可以扔了,比如alert这类弹窗的。这并不意味着我们没有拳脚可施展——实际上,基于浏览器的JS运行会依赖很多全局变量,通过修改全局变量也可以达到劫持用户浏览器的效果。
比如说:
document.title="X" //修改页面标题document.location="X"//重定向页面document.cookie="X"//修改用户cookie
用处最大的应该还是第二句,可以直接将用户重定向到特制的钓鱼网站。
那么括号问题还是比较简单的解决了。
括号适应症v2
找到合适的payload之后,朋友又提醒我有一处注入点可以不使用单引号闭合:
但这里有一个问题:payload被注入在$.post(jquery post)方法内,想让它从这个post里出来还是需要补全})。
如果不想补全,避开这个问题,我一开始采用的是字符串拼接。但这很明显有问题。
JS特性讲解
熟悉JS特性的人可能知道,JS可以将绝大部分类型的数据与字符串进行拼接,这得益于JS万物皆对象(很泛滥的一个概念,JS是其中实现得最为鬼畜的一个之一)的特性。
那么当这个数据变成函数调用呢?比如从1+"a"
变成"a"+Math.pow(1,1)
呢?答案是还是可以拼接:
这是因为函数也有返回值,这里Math.pow()的返回值是一个数字。
但当我们使用(这里为了不跳转使用document.title代替)赋值语句呢?
这样看上去没什么毛病,这是因为哪怕赋值语句在JS里也是有返回值的。但两边元素换一下呢?
报错了,原因为“表达式左侧无效”。
但上一个等式中语句也在右边,却没有报错。这是因为()与=的算术优先级不同,()的优先级高于+,而=的优先级最低。
也就是说,当前方有字符串时,赋值表达式要生效应当写成"a"+(document.title="1")
这种形式,但这与我们上文得到的”不能使用括号“的结论并不相符。
综上所述,直接拼接payload与前方的字符串达到闭合的思路是不可行的。
如果我们不能拼接字符串,那么就要想办法提前结束$.post方法,将payload作为单独语句执行。但这很明显也不能做到,因为$.post是一个函数,既然是函数那它肯定会以)结束——如要补全方法,还是需要输入一个括号。
这样看下来,貌似所有方法都绕不过括号或单引号,真是让开发给限制死了。
但,真如此吗?
我去就山
要寻找破局点,恐怕还得从第二个点所在的函数也就是$.post下手。作为一个发包函数,它无疑有很多参数和可选参数(没使用过这个函数的读者可以用python里的request.post类比),它的原型如下所示:
https://api.jquery.com/jQuery.post/
而第二个注入点的代码如下所示:
$.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}
的参数呢?答案是可以:
绕不过括号?那就不绕辣!直接加个参数给json让它在提交请求包时自动跳转到钓鱼网站,十分之优雅~
payload为1%22,%22b%22:document.location=%22http://www.baidu.com
。
*由于劫持网址的具体效果不好演示,想看效果的读者可以把上文里代码直接放控制台执行。
后续
获得朋友们一致好评,下课!
. . . * . * 🌟 * . * . . .
由于很多人问我微信群的事情,所以我建了一个小微信群。现在可以在公众号菜单里选择合作交流->交流群获取交流群二维码,希望大家和谐交流,为更好更友善的行业环境贡献自己的力量。
如果喜欢我的文章,请点赞在看。网安技术文章、安卓逆向、渗透测试、吃瓜报道,尽在我的公众号:
原文始发于微信公众号(重生之成为赛博女保安):朋友的XSS我来挖,定叫他满载而归
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论