1.这里引用了angular.min.js javascript框架。关于这个框架
然后我在网上找到了这个框架的包含模块资料,也就是ng-include,类似于文件包含这么一个功能
ng-include可以包含一个html文件(但不限于html文件), 但只是加载一个静态页面显示在前端,不会加载里面的js, 使用时要在文件名要用单引号包起来,下面是一个实例
2.查看后台源码,发现src被ng-include引用了,根据ng-inculde的资料介绍,我们包含一个文件试试,因为默认情况下不允许包含其他域名的文件,那我们就包含一下这关的主页level15.php,注意单引号包起来
发现没有,出现了一个网页出现了两个主界面。
尝试包含第一关也包含成功,
3.那既然能够包含外部文件,如果我又对外部文件进行参数提交会怎样呢?
那我们在当前界面尝试对level1.php进行操作插入一个<p>标签,发现当前页面显示出来了,也就是说,ng-include不仅能引进其他文件显示在当前界面,对其的参数提交操作也能显示。
4.然后我尝试直接使用弹窗,发现代码插入了但是没有执行,因该是ng-include限制了不能加载自带的js,需要载入后二次触发才可以触发,那我们可以像前面的关卡一样,构造一个按钮或超链接,然后点击触发
5.我这里直接构造一个a标签,提交后发现连level1.php也没法显示,因该是使用了单引号破坏了闭合,致使代码不完整无法执行包含
那我们就使用 / 代替单引号,
提交后可以看到有反应了,显示出了我们的超链接
点击超链接后执行了href后面的javascript代码。
这样就完成了一次xss攻击,
6.分析:
原本的后端代码:
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
当我们提交src的值 'level1.php?name=<a href=javascript:alert(/xss/)>click here</a>'的时候,后端处理的实际操作时这样的:
echo '<body><span class="ng-include:'level1.php?name=<a href=javascript:alert(/1/)>click here!</a>'"></span></body>';
就会达到一种像sql注入时因闭合符号,而导致的语句发生改变的情况。实际上程序会认为这是一句ng-include命令,把ng-include:后面单引号包起的语句给进行包含显示在前端。
实例:
[…] xss-labs level 15 […]
1
1