我有一个使用Laravel 5.1框架编写的应用程序。最近,我的一个客户在应用程序上运行了Acunetix安全扫描,并在我的登录页面上找到了HTML form with no apparent CSRF protection。
但是,登录表单具有CSRF保护。具有CSRF令牌的元素的名称是“_token”。扫描结果显示“发现者:抓取者”。
所以我的问题是:
以下是HTML表单刀片模板的片段:
@section('content')
<form id="loginForm" class="form-signin" role="form" method="POST" action="{{ url('/auth/login') }}">
<h2 class="form-signin-heading"><img src="/images/J10_Logo_330x194.jpg" alt="{{ trans('content.image_alt.j10_logo') }}"></h2>
<input type="hidden" name="_token" value="">
<label for="username" class="">{{ trans('auth.login.username') }}</label>
<input type="username" class="form-control" name="username" value="{{ old('username') }}">
<label for="inputPassword" class="">{{ trans('auth.login.password') }}</label>
<input type="password" class="form-control" name="password" autocomplete="off">
<div class="forgot-password"><input type="checkbox" name="remember"> {{ trans('auth.login.remember_me') }}</div>
<div class="forgot-password"><a href="#">{{ trans('auth.login.forgot_password') }}</a></div>
<button type="submit" class="btn btn-lg btn-primary btn-block">{{ trans('auth.login.login') }}</button>
@if (count($errors) > 0)
<p class="text-danger">
@foreach($errors->all() as $error)
{{ $error }}<br />
@endforeach
</p>
@endif
</form>
@endsection
您可能会注意到在上面的代码段中,“_ token”元素值为空。这是故意的,因为我基本上试图通过仅使用javascript设置其值来“绕过”acunetix的检测,因为到目前为止我尝试的所有内容似乎都不起作用。
答案 0 :(得分:1)
提供的警报最有可能表明这可能是误报。 CSRF
警告通常需要人工干预来验证是否:
如果您已经使用了反CSRF令牌,那么您可以继续将该警报标记为误报。这将从受影响项目的任何未来扫描中省略它(例如userinfo.php,被视为项目)。
爬网程序模块会发现某些警报,例如您指定的警报。由于Acunetix漏洞扫描程序采用黑盒方法,因此它不具备扫描的应用程序的先验知识。
因此,它首先通过使用爬虫模块动态地映射应用程序的站点结构并同时发现特定警报(通常是中等或低警报)来开始。爬网完成后,实际的扫描仪模块将启动,以继续对爬网程序发现的所有项目运行每个安全测试(脚本)。
关于你的一条评论 - &#34;我假设acunetix抓取工具没有运行javascript而且不会填充_token元素。&#34;
抓取工具 perse 不会执行和分析Javascript,但DeepScan(阅读更多here)技术会执行,这会在抓取阶段发生。因此,扫描程序仍然能够理解客户端繁重的应用程序,例如SPAs利用AngularJS,ReactJS等框架。