使用BurpSuite攻击JavaScript Web服务代理

JavaScript Web服务代理是用于与WCF Web服务交互的WSDL(Web服务描述语言)文件的一种选择。这个代理文件用作Web服务方法的描述,公开可用的服务方法及其参数。 JavaScript服务代理或者说JSWS(JavaScript Web服务),它们是AJAX框架的组件,通常可以用于代替相同Web服务的WSDL。JSWS使用JavaScript来对描述符文件进行建模,并且传输中的JSON使得它成为WSDL的XML的一个很好的替代,因为JavaScript和JSON被大量集成到所有浏览器中。客户端应用程序将根据需要加载JSWS或嵌入到页面中。JSWS包含将指示浏览器创建JSON请求的JavaScript代码。JSWS文件的示例在下面。

Type.registerNamespace('NewsSite.AdGroups');
NewsSite.AdGroups.Advertisement=function() {
NewsSite.AdGroups.Advertisement.initializeBase(this);
this._timeout = 0;
this._userContext = null;
this._succeeded = null;
this._failed = null;
}
NewsSite.AdGroups.Advertisement.prototype={
_get_path:function() {
 var p = this.get_path();
 if (p) return p;
 else return NewsSite.AdGroups.Advertisement._staticInstance.get_path();},
GetAds:function(SubsectionID,AdGroupID,Element,iCounter,succeededCallback, failedCallback, userContext) {
return this._invoke(this._get_path(), 'GetAds',false,{SubsectionID:SubsectionID,AdGroupID:AdGroupID,Element:Element,iCounter:iCounter},succeededCallback,failedCallback,userContext); }}
NewsSite.AdGroups.Advertisement.registerClass('NewsSite.AdGroups.Advertisement',Sys.Net.WebServiceProxy);
NewsSite.AdGroups.Advertisement._staticInstance = new NewsSite.AdGroups.Advertisement();
NewsSite.AdGroups.Advertisement.set_path = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_path(value); }
NewsSite.AdGroups.Advertisement.get_path = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_path(); }
NewsSite.AdGroups.Advertisement.set_timeout = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_timeout(value); }
NewsSite.AdGroups.Advertisement.get_timeout = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_timeout(); }
NewsSite.AdGroups.Advertisement.set_defaultUserContext = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultUserContext(value); }
NewsSite.AdGroups.Advertisement.get_defaultUserContext = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultUserContext(); }
NewsSite.AdGroups.Advertisement.set_defaultSucceededCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultSucceededCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultSucceededCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultSucceededCallback(); }
NewsSite.AdGroups.Advertisement.set_defaultFailedCallback = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_defaultFailedCallback(value); }
NewsSite.AdGroups.Advertisement.get_defaultFailedCallback = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_defaultFailedCallback(); }
NewsSite.AdGroups.Advertisement.set_enableJsonp = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_enableJsonp(value); }
NewsSite.AdGroups.Advertisement.get_enableJsonp = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_enableJsonp(); }
NewsSite.AdGroups.Advertisement.set_jsonpCallbackParameter = function(value) { NewsSite.AdGroups.Advertisement._staticInstance.set_jsonpCallbackParameter(value); }
NewsSite.AdGroups.Advertisement.get_jsonpCallbackParameter = function() { return NewsSite.AdGroups.Advertisement._staticInstance.get_jsonpCallbackParameter(); }
NewsSite.AdGroups.Advertisement.set_path("/AdGroups/Advertisement.asmx");
NewsSite.AdGroups.Advertisement.GetAds= function(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext) {NewsSite.AdGroups.Advertisement._staticInstance.GetAds(SubsectionID,AdGroupID,Element,iCounter,onSuccess,onFailed,userContext); }
var gtc = Sys.Net.WebServiceProxy._generateTypedConstructor;
if (typeof(NewsSite.AdGroups.AdGroupInfo) === 'undefined') {
NewsSite.AdGroups.AdGroupInfo=gtc("NewsSite.AdGroups.AdGroupInfo");
NewsSite.AdGroups.AdGroupInfo.registerClass('NewsSite.AdGroups.AdGroupInfo');
}

文件加载后,后续的请求将按以下方式格式化。

JSON-request.png

这个指示浏览器如何格式化请求的文件的一个副作用是这也可以帮助攻击者枚举Web服务方法和潜在注入点。 在这些可以利用之前,重要的是要了解JSWS何时使用,以及如何识别它。

识别JSWS

有多种不同的方法来识别这些服务何时在应用程序中使用。应用程序可以通过查找https://some.domaim.com/WebService.asmx/js来请求允许通过代理日志识别的JSWS文件。应用程序还可能请求具有调试信息的相同文件,https://some.domain.com/WebService.asmx/jsdebug。 jsdebug文件将包含有关所需参数的数据类型的附加信息,以及需要哪些参数。即使应用程序没有请求jsdebug文件,它很可能仍然可用。

或者,应用程序可能使用PageMethods技术,这意味着JSWS将直接嵌入到页面中。

这通常在aspx页面而不是asmx,但它可以与任何扩展一起。这个方法可以通过搜索服务器响应的“PageMethods”字符串,或通过检查代理日志的方法调用来识别(例如https://some.domain.com/WebService.aspx/GetInformation

JSWS扩展

在识别出这种技术正在使用之后,攻击者能够处理Web服务将接受的所有请求变化,但这需要时间,并且可能相当冗长乏味。开始在评估中经常看到JSWS之后,我决定创建一个Burp扩展来自动化这个过程。该工具是在Eric Gruber的Wsdler之后建模的,并且以相同的方式运行。JSWS扩展可以从https://github.com/NetSPI/JSWS下载,目前正在等待进入BApp商店。

要使用此工具,只需右键单击包含JSWS的请求或响应,然后单击Parse JSWS(解析JSWS)。如果应用程序正在加载JSWS文件,则该文件应已位于代理日志中。

parse-JSWS.png

建议解析jsdebug文件而不是js文件,因为它会给用户提供更多关于篡改哪些类型的参数的信息。

如果应用程序使用JSWS的PageMethods表示,请右键单击包含PageMethods代码的请求或响应,然后单击Parse JSWS。

然后,JSWS扩展将打开一个JSWS选项卡,以及一个用于刚刚解析的服务的子选项卡。 在此选项卡下有两个窗格,顶部包含所有可用的方法,底部包含JSON模板。

JSWS-tab.png

从这里,请求可以作为任何JSON请求处理,并可以发送到Repeater进行手动测试,或者Intruder和Scanner进行自动测试。

结论

该扩展程序当前不能通过被动扫描检测到JSWS的存在。这项功能正在实现将在未来的版本中发布。对于你可能发现的任何功能要求或错误,请给我发电子邮件或在Github提问。

标签: BurpSuite, JavaScript Web

添加新评论