身份验证
Web应用程序通常有一个仅供注册用户使用的部分。web应用程序的这一部分只能通过登录应用程序进行评估,登录的过程称为“认证”。AppSpider支持多种方式对应用程序进行身份验证。您可以在身份验证选项卡的扫描配置向导。
简单的表单验证
顾名思义,这种技术可以帮助您登录使用简单的基于表单的身份验证的网站。这些网站有一个由用户名字段、密码字段和提交按钮组成的登录表单。你可以参考这篇维基百科文章来了解更多关于基于表单的认证:https://en.wikipedia.org/wiki/HTTP%2BHTML_form-based_authentication.
如果您的web应用程序使用简单的表单认证,您可以使用以下步骤配置认证设置:
- 打开>简单表单身份验证选项卡。
- 选择站点需要表单身份验证复选框。
- 在相应的字段中输入您的用户名和密码。在“确认密码”字段中重新输入密码。
- 如果您使用像Okta这样的单点登录解决方案,并且登录页面存在于扫描设置的域限制之外,请在“SSO”字段中输入登录页面的URL。
宏观的身份验证
AppSpider有时可能无法到达您的应用程序的登录页面,或登录表单可能只有在您的网站上执行了特定的操作序列后才可用。例如,当从“Administration”窗口中按下“login”按钮时,登录表单可能在一个用Javascript动态生成的弹出窗口中。您可以通过记录宏来让AppSpider执行这一系列步骤。
宏是一系列动作,如点击按钮或在网页中输入文本。AppSpider以xml格式记录这些序列.rec
文件。在扫描过程中,AppSpider可以重放该文件中的动作来登录web应用程序。如果您希望使用宏身份验证,您可以使用以下步骤配置它:
- 打开认证>宏认证选项卡。
- 选择使用登录宏(用于表单认证)复选框。
- 如果您以前在这个系统上记录了一个登录宏,您可以通过使用省略号(…)按钮。如果您没有先前记录的宏,请执行下面的步骤。
- 单击记录按钮。这将打开浏览器宏记录器在新选项卡中。默认情况下,浏览器宏记录器将打开目标应用程序。
- 按照以下步骤登录到您的应用程序。将宏保存到本地系统的.rec文件中。默认情况下,AppSpider会将宏文件保存在AppSpider数据目录下的“macro”文件夹中。
请注意
由于AppSpider记录您的操作并将它们转换为XPath命令,因此在记录登录宏时,除了登录所需的操作外,不要执行任何操作。此外,我们建议您单击每个输入数据的字段,而不是使用“标签”或“返回”按钮。在扫描过程中,引擎将重播宏,然后在屏幕上的页面“Advanced Options > Logged-in Regex”字段中查找模式。一旦AppSpider确认身份验证成功,它将继续进行扫描。
如果登录状态的指示器隐藏在菜单项下,请展开它,以便AppSpider可以检查它并检查登录状态。如果你的应用程序是使用Angular、React或Ember等现代框架构建的,这一点尤其重要。通常情况下,这些框架会使用javascript来渲染这些字段,而这些字段在文档对象模型(DOM)中是看不到的。如果你在获取“Logged-in Regex”工作时遇到问题,我们建议你启用流量日志,并检查宏末尾返回的html响应。这将允许您看到扫描仪正在看到的内容,并帮助您创建一个工作的正则表达式。
- 关闭“浏览器宏记录”工具并返回“扫描配置”向导。
- 控件重新播放宏来测试宏测试按钮。
- 如果您的宏不能正常工作,而您希望调试它,您可以选择显示宏观重播复选框。在扫描过程中,会打开一个浏览器窗口,显示AppSpider在重放宏时所执行的所有步骤。这将让您找出引擎在哪里出现问题,并相应地修复宏记录。
- 确定Chrome或Internet Explorer浏览器是否正确显示您的网站,并从“浏览器”下拉框中选择相应的条目。默认浏览器为Chrome。
请注意
浏览器设置配置用于回放宏的浏览器。如果您希望更改用于记录宏的浏览器,请单击选项菜单栏的菜单,然后转到选项>环境>宏记录>浏览器引擎.
HTTP身份验证
HTTP协议支持使用用户名和密码进行认证。你可以使用这篇参考文章来了解更多关于HTTP身份验证的信息:https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/understanding-http-authentication
AppSpider支持HTTP认证的基本协议、NTLM协议和Kerberos协议。如果你的目标应用使用HTTP认证,你可以使用以下步骤配置认证过程:
- 打开认证> HTTP认证选项卡。
- 选择站点需要HTTP身份验证(基本、NTLM或Kerberos)复选框启用HTTP身份验证。
- 在相应的字段中输入您的用户名和密码。如果用户名和密码与在Simple Form Authentication部分中输入的用户名和密码相同,则启用使用表格凭证复选框。
请注意
NTLM身份验证将需要用户帐户的域和用户名,这两者都是区分大小写的。忘记包含域或使用不正确的情况将导致身份验证操作失败
扫描引导
许多现代web应用程序使用双因素身份验证等安全措施,在登录应用程序时需要手动干预。例如,假设您的应用程序要求您输入通过SMS发送给您的一次性密码,或CAPTCHA框中的文本。在这些情况下,可以使用Scan Bootstrap(通常称为Bootstrap)身份验证。
在扫描期间,一个浏览器窗口将打开,并允许您手动引导扫描仪到登录区域,并完成所有步骤,以登录扫描仪进入网站。在登录过程完成后,AppSpider可以继续以自动化的方式扫描应用程序的漏洞。如果扫描引擎在扫描期间注销,它将触发引导身份验证以重新对应用程序进行身份验证。在这种情况下,浏览器窗口将再次弹出,以便您可以手动登录到应用程序。您可以使用以下步骤配置Bootstrap身份验证:
- 打开认证>扫描引导选项卡。
- 选择允许扫描引导复选框。
- 设置登录应用程序所需的时间(以秒为单位)。缺省值是60秒。
请注意
在扫描过程中,只执行登录到应用程序所需的步骤。在登录过程完成后,保持浏览器窗口打开,因为AppSpider会自动关闭它。AppSpider将在浏览器打开的网页中从“Advanced Options > Logged-in Regex”字段中寻找模式。如果登录状态指示器隐藏在菜单项下,请展开它,以便AppSpider可以检查它并检查登录状态。一旦确认身份验证成功,它将继续进行扫描。
硒脚本验证
Selenium是一个用于web应用程序自动化测试的框架。用户可以记录诸如在表单中输入数据和使用Selenium点击按钮等操作,并按需重放这些操作,以确保web应用程序的行为符合要求。
AppSpider支持使用Selenium文件进行身份验证,因此可以在Selenium脚本中记录登录到应用程序所需的操作。在扫描过程中,AppSpider可以重放该脚本中的动作来登录web应用程序。
使用以下步骤来使用Selenium脚本进行身份验证:
- 打开认证> Selenium Script认证选项卡。
- 选择使用Selenium脚本(用于表单身份验证)复选框。
- 选择Web驱动程序(参考:https://www.seleniumhq.org/docs/03_webdriver.jsp)用于您的Selenium脚本。AppSpider安装在Chrome浏览器的web驱动程序中,这将是默认使用的。
- 单击省略号(…)按钮旁边的硒脚本文件文本框中。这将打开文件资源管理器。导航到支持的格式的Selenium文件并选择它。
- 可以通过使用测试按钮。如果身份验证成功,您将看到一个弹出窗口,显示“Selenium Login执行成功”。
下面是一些不同格式的Selenium身份验证脚本示例:
请注意
您必须为Selenium身份验证脚本使用端口32768。
HTML - Selenium Script
xml
1<?xml version = " 1.0 " encoding = " utf - 8 " ?>2<!文档类型超文本标记语言公共-//W3C//DTD XHTML 1.0 Strict//EN"“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>3.<超文本标记语言xmlns="http://www.w3.org/1999/xhtml"xml:朗="在"朗="在">4<头配置文件="http://selenium-ide.openqa.org/profiles/test-case">5<元http-equiv="内容类型"内容="text / html;utf - 8字符集="/>6<链接rel="selenium.base"href="http://webscantest.com/"/>7<标题>硒标题>8头>9<身体>10<表格单元格边距="1"单元格间距="1"边境="1">11<thead>12<tr><道明行宽="1"colspan="3.">硒道明>tr>13thead><tbody>14<tr>15<道明>开放道明>16<道明>/道明>17<道明>道明>18tr>19<tr>20.<道明>clickAndWait道明>21<道明>链接=登录道明>22<道明>道明>23tr>24<tr>25<道明>类型道明>26<道明>的名字=登录道明>27<道明>管理道明>28tr>29<tr>30.<道明>类型道明>31<道明>的名字=passwd道明>32<道明>管理道明>33tr>34<tr>35<道明>clickAndWait道明>36<道明>的名字=submit_login道明>37<道明>道明>38tr>39tbody>表格>40身体>41超文本标记语言>4243
Java Selenium脚本
java
1包automationFramework;23.进口java.跑龙套.并发.TimeUnit;4进口org.openqa.硒.通过;5进口org.openqa.硒.键;6进口org.openqa.硒.代理;7进口org.openqa.硒.WebDriver;8进口org.openqa.硒.铬.ChromeDriver;9进口org.openqa.硒.铬.ChromeOptions;1011公共类TestCase{12公共静态无效主要(字符串[]arg游戏)抛出InterruptedException{13ChromeOptions选项=新ChromeOptions();14代理代理=新代理();15代理.setHttpProxy(“127.0.0.1:32768”);16代理.setSslProxy(“127.0.0.1:32768”);17选项.setProxy(代理);18WebDriver司机=新ChromeDriver(选项);19司机.管理().超时().implicitlyWait(60,TimeUnit.秒);20.司机.导航().来(“http://webscantest.com/login.php”);21司机.findElement(通过.cssSelector(“输入name =登录”)).sendKeys(“admin”);22司机.findElement(通过.cssSelector(“输入(name = passwd)”)).sendKeys(“admin”);23司机.findElement(通过.cssSelector(“输入(name = passwd)”)).sendKeys(键.输入);24线程.睡眠(3000);25司机.辞职();26}27}
Exe - c#硒脚本
csharp
1使用系统;2使用OpenQA.硒;3.使用OpenQA.硒.支持.用户界面;4使用OpenQA.硒.铬;5/ /用户名test_user6/ /密码1234567名称空间Selenium_Demo8{9类程序10{11静态的空白主要(字符串[]arg游戏)12{13字符串URL=“http://hackazon.webscantest.com/user/login”;14ChromeOptions选项=新ChromeOptions();15ChromeOptions headlessOptions=新ChromeOptions();16字符串appSpider_port=“32768”;17代理代理=新代理18{19HttpProxy=”127.0.0.1:“+appSpider_port,20.SslProxy=”127.0.0.1:“+appSpider_port21};22选项.代理=代理;23headlessOptions.代理=代理;24//检查登录脚本是否在appspider中运行(仅限chrome)25headlessOptions.AddArguments(“无头”);26IWebDriver司机=新ChromeDriver(headlessOptions);27司机.Url=URL;28如果(司机.PageSource.=(“< html xmlns = \“http://www.w3.org/1999/xhtml \“> <头> < /头> <身体> < /身体> < / html >”))29{30.选项.代理=零;31}32司机.辞职();33//检查登录脚本是否在appspider中运行(仅限chrome)34司机=新ChromeDriver(选项);35司机.Url=URL;36司机.管理().超时().ImplicitWait=时间间隔.FromSeconds(60);37/ / / /收集你的元素38IWebElement用户名=司机.FindElement(通过.Id(“用户名”));39IWebElement密码=司机.FindElement(通过.CssSelector(“输入(占位符= '密码']”));40/ / / /收集你的元素41/ / / /执行登录42用户名.SendKeys(“test_user”);43密码.SendKeys(“123456”);44密码.SendKeys(键.输入);45/ / / /执行登录46////等待登录时出现的元素47IWebElement loggedInElement=司机.FindElement(通过.LinkText(“注销”));48////等待登录时出现的元素49司机.辞职();50}51}
代理登录身份验证
您可以验证到您的应用程序使用web代理工具,如流量记录仪.使用代理工具,您可以在代理文件中记录前端应用程序和后端服务器之间的交互(例如HTTP GET和POST请求)。AppSpider可以重放这些交互以在应用程序中进行身份验证。代理日志文件有以下几种格式:
- 流量文件(*.trec)
- 打嗝文件(* . xml)
- 帕罗斯岛文件(* . txt)
- WebScarab文件(conversationlog)
- 文件(*.har)
- 提琴手文件(* .saz)
使用以下步骤对Traffic文件进行身份验证:
- 打开认证>宏认证选项卡。
- 选择使用代理日志(用于表单身份验证)复选框。
- 如果您还没有代理文件,请使用流量记录仪用于记录登录过程中涉及的交互的工具。
- 单击省略号(…)旁边的按钮代理日志文件文本框。这将打开文件资源管理器。导航到支持的格式的代理文件并选择它。
- 控件重新播放代理日志验证来测试代理日志验证测试按钮。如果身份验证成功,您将看到一个弹出窗口,显示“代理登录执行成功”。
会话劫持
如果您的web应用程序使用会话cookie来维持登录状态,您可以捕获此cookie并使用session Hijacking方法进行认证。使用以下步骤设置此身份验证方法:
- 使用浏览器的开发人员工具捕获与身份验证相关的会话cookie。
- 打开认证>会话劫持(不支持重新登录)选项卡。
- 选择会话劫持复选框。
- 单击利用捕获的会话Cookie链接。“会话设置”窗口将出现。
- 步骤1中的会话cookie会话Cookie字段。多个cookie之间用分号分隔。例如,考虑以下捕获的cookiehttp://webscantest.com:
- 如果在整个扫描过程中需要维护这些cookie值,您可以选择在扫描期间锁定cookie值复选框。属性将此设置应用于所有cookie适用于所有cookies复选框,或在表中输入特定的cookie。
- 点击好吧返回“认证”界面。
这是最不可取的身份验证方法,因为扫描器在扫描过程中丢失会话时不能重新身份验证。
OAUTH
OAuth (https://oauth.net/)是一种授权方法,应用程序使用它向客户端授予细粒度访问权。AppSpider支持OAuth 2.0,这是行业标准的授权协议。OAuth 2.0专注于客户端开发人员的简单性,同时为web应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流程。如果您的应用程序已授予AppSpider访问某些功能的权限,您可以在> OAUTH身份验证选项卡。当开始扫描时,AppSpider可以向您的应用程序提供这些细节,并接收访问令牌。
根据您的用例,您将需要使用不同的OAuth流。“授予类型”属性决定了应用程序正在使用的OAuth流。你可以在此了解更多奖助金类型:https://oauth.net/2/grant-types/.
AppSpider支持以下拨款类型:
以下图表可以帮助您为您的申请选择合适的拨款类型。
设置OAuth认证
如果您想扫描使用OAuth的应用程序,您需要知道应用程序使用的授权类型。您通常可以从应用程序开发人员那里获得这些信息。如果您检查来自连接的流量,通常还可以在URL中看到授予类型。
的> OAUTH身份验证屏幕有许多选项来配置应用程序的OAuth属性。您需要选择OAuth启用选项以启用OAuth身份验证,然后根据授权类型提供所需的值。
- 资源服务器URL- API服务器的标识符。在应用程序获得访问令牌后,资源服务器处理经过身份验证的请求
- 授权服务器URL-授权服务器URL,从您的身份提供者获得(参考:https://en.wikipedia.org/wiki/Identity_provider)
- 重定向的URI—授权服务器将用户重定向回的URL, URL中包含授权码或访问令牌。如果资源服务器URL为空将被使用
- 客户范围-一个或多个空格分隔的字符串,表示应用程序正在请求哪些权限。您使用的特定OAuth API将定义它所支持的作用域
- 客户机Id-从您的身份证明提供者获得的申请的公共识别码
- 客户的秘密-应用程序的客户端秘密,从您的身份提供者获得。这确保仅从应用程序发出获取访问令牌的请求
- 客户端状态—应用程序生成一个随机字符串并将其包含在请求中。然后,它应该检查用户授权应用程序后返回的值是否相同。这是用来防止CSRF攻击的
- 用户名—使用“资源所有者密码凭据”或“客户端凭据”授予类型时,最终用户的用户名
- 密码—使用“资源所有者密码凭证”或“客户端凭证”授予类型时,最终用户的密码
OAuth格兰特类型
以下部分描述了根据授予类型需要向AppSpider提供哪些OAuth属性。
授权代码
授权码授权类型用于web和移动应用程序。它与大多数其他授权类型的不同之处是,首先需要应用程序启动一个浏览器来启动流程。在较高的级别上,流程有以下步骤:
- 应用程序打开浏览器将用户发送到OAuth服务器
- 用户看到授权提示符并批准应用程序的请求
- 用户被重定向回具有查询字符串中的授权代码的应用程序
- 应用程序用授权代码交换访问令牌
授权代码流最好由源代码未公开的服务器端应用程序使用。应用程序应该是服务器端,因为交换令牌授权代码的请求需要一个客户端机密,而这个机密必须存储在您的客户端中。然而,服务器端应用程序需要终端用户,因为它依赖于与终端用户的web浏览器的交互,后者将重定向用户,然后接收授权代码。看到https://developer.okta.com/authentication-guide/auth-overview/#authorization-code-flow和https://developer.okta.com/authentication-guide/implementing-authentication/auth-code为更多的信息。
强制性的属性
- 资源服务器URL
- 客户机Id
隐式的
隐式授权类型是一个可由公共客户端使用的简化流,其中访问令牌立即返回,而不需要额外的授权代码交换步骤。
通常不建议使用隐式流(有些服务器完全禁止此流)。自从最初编写规范以来,行业最佳实践已经改变,建议公共客户端应该使用带有PKCE扩展的授权代码流。
强制性的属性
- 资源服务器URL
- 客户机Id
注意:目前还不支持PKCE
资源所有者密码凭据
资源所有者密码凭据授予类型适合于资源所有者与客户端具有信任关系的情况,例如设备操作系统或具有高度特权的应用程序。授权服务器在启用这种授权类型时应该特别小心,并且只在其他流不可用时才允许它。看到https://tools.ietf.org/html/rfc6749#4.3为更多的信息。
强制性的属性
- 资源服务器URL
- 用户名
- 密码
客户端凭证
当应用程序请求访问令牌以访问其自己的资源时(而不是代表用户),将使用客户机凭据授予。客户端需要对这个请求进行身份验证。通常,服务将允许附加的请求参数客户端Id和客户端秘密,或者接受HTTP基本身份验证头中的客户端Id和客户端秘密。
强制性的属性
- 资源服务器URL
附加的OAuth属性
除了身份验证屏幕的OAuth部分中的属性外,还有一些高级选项可以帮助您配置应用程序的OAuth流。
- 资源所有者URL—能够授权访问受保护资源的实体。可选,在大多数情况下应该等于资源服务器URL
- UsernameForm / PasswordForm-用户名和密码,用于应用程序上额外的表单认证流程
- ExtensionGrant-此时可以忽略
- AuthorizationGrantType-支持的拨款类型的数字表示
- NeverDoBasicAuth防止AppSpider在使用“资源所有者密码凭据”或“客户端凭据”的情况下发送HTTP基本认证头(base65编码的用户名和密码值)。默认启用(值为0)
- JsonPostBodies-支持JSON格式的OAuth授权服务器请求和响应
- Azure* -所有在Azure开始时的属性都是过时的,不应该使用
- OAuthCustomField—支持应发送到授权服务器的任何附加参数
请注意
在大多数情况下,除了隐式授权类型外,可以使用宏绕过OAuth身份验证。如果你用AppSpider配置OAuth有困难,你应该试试宏观的身份验证.
SSL证书
您可能需要在客户端对应用程序进行身份验证,以便可以扫描在SSL后面找到的页面。这种身份验证方法可以用于云和内部扫描引擎。
可以证明格式
SSL证书必须为。pfx文件。
配置SSL身份验证
- 去> SSL身份验证.
- 在类型下拉选择证书。
- 选择您的SSL .pfx文件。
- 3 .可选:如果需要输入密码,请在提供的框中输入。
ADAL
您可以使用Azure Active Directory身份验证库(ADAL)对InsightAppSec扫描进行身份验证。
配置ADAL
配置ADAL身份验证,必须进入身份验证> ADAL屏幕,并设置以下选项:
- 资源ID-这取决于Azure Active Directory (AD)的使用情况。如果你正在使用Azure Native AD,这应该是两个默认值之一,graph.windows.net或graph.microsoft.com。如果您没有使用原生Azure AD,您的AD管理员可能会帮助您为实例获取正确的ID。
- 租户—Azure AD租户的域名,例如example.onmicrosoft.com。这可以在Azure Active Directory概述屏幕上找到。
- 客户机ID—已注册应用程序下的应用程序(客户端)ID。
- 权威的URL——默认为https://login.microsoftonline.com/如果空着,这个就会被忽略。
- 用户名-如果您使用客户端ID、用户名和密码认证流程,这将是您的帐户的用户名。
- 密码-密码不是你的用户帐户的密码,而是在“证书和秘密”部分创建的秘密密钥。您可以将ADAL与OAuth结合使用作为您的身份验证协议(参考:https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-implicit-grant-flow).
HMAC
HMAC是一个MAC(消息验证码),它使用加密哈希函数和密钥进行验证。要了解更多关于HMAC的信息,请参见https://en.wikipedia.org/wiki/HMAC.
配置HMAC身份验证,
- 去验证> HMAC.
- 使用切换按钮使HMAC.
- 输入如下信息:
- 用户名-哈希算法的用户名。
- 秘钥-用于计算HMAC的唯一代码。发送方和接收方都知道它。
- 哈希算法-选择哈希算法类型。
- Md5
- Sha1
- Sha256
- 头生成DLL文件名-创建的用户DLL文件,其中包含加密哈希函数。只有在使用内部引擎时才需要这样做。如果不提供文件,系统将使用引擎提供的DLL。
HMAC头,代
随AppSpider附带的HMACHeaderGenerator.dll是用于生成HMAC头文件的默认文件。它被编码为。dll,这样想要使用自定义方案生成HMAC头文件的第三方可以为此目的编写自定义的.dll,然后配置AppSpider使用它而不是默认的HMACHeaderGenerator.dll。
在HMAC配置扫描中,AppSpider使用HMAC .dll生成包含在它生成的每个请求中的头文件。
以下3个数据结构是在HMAC函数中传递数据所必需的。它们被特别地编码为尽可能地简单,以最小化主进程和。dll之间的内存分配差异:
1模板struct FUNCTORIZER 2{3.bool (*m_pfnCompareOrOrder)(const T& o1, const T& o2); / / const const4// ---5inline FUNCTORIZER(bool (*pfnCompareOrOrder)(const T& o1, const T& o2)):6m_pfnCompareOrOrder (pfnCompareOrOrder)7{8}9内联bool操作符()(const T& o1, const T& o2)10{11返回m_pfnCompareOrOrder (o1、o2);12}13};
1模板struct SIMPLELIST 2{3.模板inline static void PlacementDestructor(T& p) 4{5p ~ T ();6}7// ---8SIMPLELIST < T > * m_plNext;9T m_tObject;10// ---11内联SIMPLELIST T < > ():12m_plNext (nullptr)13{14}15inline SIMPLELIST(const SIMPLELIST & o): 16m_plNext (nullptr)17{18运算符= (o);19}20.inline SIMPLELIST(const T& tObject): 21m_plNext (nullptr),22m_tObject (tObject)23{24}25内联~ SIMPLELIST T < > ()26{27重置();28}29内联空白重置()30.{31SIMPLELIST < T > * plCurrent,32* plNext;3334plNext = m_plNext;35而(plNext)36{37plCurrent = plNext;38plNext = plCurrent - > m_plNext;39plCurrent - > m_plNext = nullptr;40// ---41PlacementDestructor < SIMPLELIST < T > > (* plCurrent);42免费(plCurrent);43}44m_plNext = nullptr;45}46内联SIMPLELIST < T > *第()47{48返回m_plNext;49}50内联SIMPLELIST < T > * Next ()51{52返回m_plNext;53}54内联bool添加(const T& tObjectToCopy)55{56SIMPLELIST < T > * plThat;5758plThat =;59而(plThat - > m_plNext)60{61plThat = plThat - > m_plNext;62}63plThat->m_plNext = new SIMPLELIST(tObjectToCopy); 64如果(plThat - > m_plNext)65{66plThat = plThat - > m_plNext;67// ---68返回true;69}70// ---71返回错误;72}73内联T* addhead (const T& tObjectToCopy)74{75SIMPLELIST < T > * plThat;7677plThat = m_plNext;78m_plNext = (SIMPLELIST < T > *) malloc (sizeof (SIMPLELIST < T >));79新(m_plNext) SIMPLELIST < T > (tObjectToCopy);80如果(m_plNext)81{82m_plNext - > m_plNext = plThat;83// ---84返回&m_plNext - > m_tObject;85}86m_plNext = plThat;87// ---88返回nullptr;89}90内联T* AddUnique(const T& tObjectToCopy, bool (*pfnCompare)(const T& o1, const T& o2), bool bFailIfExists = false)91{92返回AddUnique(tObjectToCopy, FUNCTORIZER(pfnCompare), bFailIfExists); 93}94模板inline T* AddUnique(const T& tObjectToCopy, FUNCTOR& pfnCompare, bool bFailIfExists = false) 95{96SIMPLELIST < T > * plThat;9798plThat =;99while (plThat->m_plNext && !pfnCompare(plThat->m_plNext->m_tObject, tObjectToCopy)))One hundred.{101plThat = plThat - > m_plNext;102}103如果(plThat - > m_plNext)104{105如果(! bFailIfExists)106{107//保留旧的,返回指向它的指针。108返回&plThat - > m_plNext - > m_tObject;109}110}111其他的112{113plThat - > m_plNext = (SIMPLELIST < T > *) malloc (sizeof (SIMPLELIST < T >));114新(plThat - > m_plNext) SIMPLELIST < T > (tObjectToCopy);115如果(plThat - > m_plNext)116{117返回&plThat - > m_plNext - > m_tObject;118}119}120// ---121返回nullptr;122}123};
1struct STRINGPAIR2{3.TCHAR m_szFirst [1024],4m_szSecond [1024];5// ---6STRINGPAIR ()7{8}9STRINGPAIR(LPCTSTR szFirst, LPCTSTR szSecond)10{11_tcscpy_s < sizeof (m_szFirst) / sizeof (* m_szFirst) > (m_szFirst szFirst);12_tcscpy_s < sizeof (m_szSecond) / sizeof (* m_szSecond) > (m_szSecond szSecond);13}14};
替换默认DLL
以下函数必须在任何将替换默认HMACHeaderGenerator.dll的.dll中实现。
得到最后一个错误
由以下函数生成的任何向用户提供信息的错误或异常情况都应存储在一个全局变量中,并由该函数返回。AppSpider将以处理任何错误的相同方式报告错误。
1extern "C" int __declspec(dllexport) WINAPI getlastmacerror (IN int nSizeofError, OUT LPSTR szError)2{3.// nSizeofError = szError的大小限制。4// szError =接收错误的字符缓冲区指针。5}
生成头文件
这是生成HMAC HTTP报头的核心函数。
1extern "C" bool __declspec(dllexport) WINAPI GenerateHMACHeader(IN ALG_ID ehashalgorithms, IN LPCWSTR wszHttpVerb, IN DATE dtExpireDate, IN LPCWSTR wszUrl, IN LPCWSTR wszUsername, IN LPCWSTR wszSecretKey, IN BYTE* pbtContent, IN DWORD dwContentLength, OUT SIMPLELIST& lpszHeaders) 2{3.//下面是填充lpszHeaders的代码示例:4lpszHeaders。Add (STRINGPAIR(“CustomHMACField1”,szValue1));5lpszHeaders。Add (STRINGPAIR(“CustomHMACField2”,szValue2));6//如果szValue1 = "foo"和szValue2 = "bar",则产生的HTTP请求将7//像这样:8GET / somepage.html HTTP / 1.19主持人:server.example.com10CustomHMACField1: foo11CustomHMACField2:酒吧12< >其他头13}
ALG_ID来自wincrypt.h并指定要使用的加密哈希算法。在自定义实现中,它可以是任何需要的内容,包括忽略它,例如总是使用MD5的场景。其余的输入参数在HMACHeaderGenerator.dll中以标准的HMAC方式组合,生成头文件“Authorization”和“Date”以及lpszHeaders中的值。类似地,任何自定义方案都将接受输入参数(算法、日期、字符串参数和可选的二进制内容(pbtContent、dwContentLength),并按照自定义方法的规定组合它们,以创建lpszHeaders中所需的任意多的名称-值对,当爬行和攻击时,AppSpider会将其包含在请求头中。
一个清晰的标题列表
1extern "C" void __declspec(dllexport) WINAPI FreeTheHeadersList(IN SIMPLELIST& lpszHeaders) 2{3.//使用与GenerateHMACHeader()相同的方案释放lpszHeaders4//分配它。可能只是lpszHeaders.Reset()。5}
生成任意头文件(未使用)
1extern "C" bool __declspec(dllexport) WINAPI GenerateArbitraryHeaders(IN SIMPLELIST& lpszInputs, OUT SIMPLELIST & lpszHeaders) 2{3.//当前未使用此函数。这是事先写好的4//未来的功能。然而,存根应该包含在任何5//自定义HMAC .dll。6}
高级设置
当尝试通过身份验证扫描应用程序时,AppSpider需要一种方法来了解身份验证已经成功。它试图通过检查网页的标题和正文来推断应用程序的登录状态。Authentication > Advanced选项卡中的字段可用于训练AppSpider识别应用程序的登录状态。你可以使用正则表达式构建器在AppSpider中使用正则表达式之前测试它们。
- 配置SSL证书link—打开SSL配置窗口,用户可以在此配置SSL证书
- 登录的正则表达式-如果你的页面上的文本匹配这个正则表达式,AppSpider假设你仍然登录。这个regex通常与“Sign out”链接匹配,因为Sign out选项只有在用户仍然登录时才可用。
- 假设好登录-有时你可能无法找到一个正则表达式匹配的登录状态的应用程序。可能有多个登录链接导致产品的不同区域,AppSpider可能尝试相同的凭证到处导致帐户锁定。您可以启用假设好登录复选框,指示AppSpider在首次登录后不检查登录状态。