第十五关,AngularJS 客户端文件/模板包含(ng-include)
在正式开始之前,需要了解一下内容:
①、Angular的ng-include
②、Angular的核心机制
③、Angular的底层逻辑、同源策略
(1)AngularJS的ng-include
用于在不刷新页面的情况下,把一个外部的HTML片断异步下载并挂载插入当前页面的DOM节点中。
语法格式:
属性方式:<div ng-include=”‘template.html'”></div>
类名方式:<span class=”ng-include: ‘template.html'”></span>
(2)AngualarJS的核心机制
ng-include接收的是一个Angular表达式,不是一个普通的字符串
①、如果不带单引号:ng-include: level1.php
AngularJS会将level1.php当作当前作用域中(在这里可以想象学习Java/Python/C的作用域的场景,就是局部变量和全局变量)的一个变量名去查找。
由于我们写的是一个文件名,显然这个作用域中不存在该变量名,就会导致解析结果为undefined,Angular就不会发起任何网络请求。
②、如果带上单引号:ng-include: ‘level1.php’
用单引号包裹后,Angular就会把它识别为常量字符串(在Angular中就是URL),此时会触发底层的HTTP请求去获取对应资源。
(3)AngularJS底层逻辑和同源策略
①、AngularJS底层逻辑
当AugularJS识别到URL字符后,会调用内部的服务,用于异步拉取(即,浏览器在后台发送一个AJAX (XMLHttpRequest/Fetch)GET请求去获取目标文件内容,举例:‘level1.php’,浏览器就回去获取同目录下的level1.php的内容,为什么是同目录,因为我们这里举例的路径就是在同一个目录下。)
②、同源策略
简单来说就是防止网站A.com获取网站B.com的内容,即跨域访问而产生的策略。
AJAX受同源策略严格约束,如果传入第三方域名,浏览器就会因为跨域(CORS)报错直接拦截响应,导致请求失败。
由于受到同源策略的影响,所以我们要使用同目录下的URL。
查看level15.php源码
头部区域调用了angular.js文件

接收前端传递过来的src后,用HTTP实体转以后,再拼接到ng-include:”的单引号中。

此时AngularJS识别到ng-include:”里面的URL,就会进行异步拉取,去获取该URL的内容。
解题方法:
由于是直接去获取URL的内容,所以我们可以选择一个关卡比较好绕过的。
level15.php?src=’level1.php?name=<script>alert()</script>’

可以看到通过AngularJS的异步拉取,我们获得了level1.php的内容
按F12检查还可以看到AngularJS生成的DOM结构

但是奇怪的是,明明成功动态插入了<script>标签,但是浏览器并没有执行。
经过查询,HTML5限制了通过异步加载、动态插入DOM的<script>标签自动执行。
所以我们要换一种自带触发器的HTML标签,例如<img>、<input>等。
payload:
tips:img里面的src属性可以是1也可是2或者在当前目录下不存在的图片,请勿写#,否则浏览器就不会返回执行onerroe属性。
http://靶场地址/level15.php?src=’level1.php?name=<img src=1 onerror=alert()>’
回车即可

