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

举报
肾透侧视攻城狮 发表于 2024/10/31 18:09:04 2024/10/31
【摘要】 CSRF+XSS漏洞的各类利用技巧等 具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!

欢迎各位彦祖与热巴畅游本人专栏与博客
你的三连是我最大的动力
以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现]


专栏跑道一

➡️网络空间安全——全栈前沿技术持续深入学习 

专栏跑道二

➡️ 24 Network Security -LJS

专栏跑道三

 ➡️ MYSQL REDIS Advance operation


专栏跑道四

➡️HCIP;H3C-SE;CCIP——LJS[华为、华三、思科高级网络]

专栏跑道五


➡️RHCE-LJS[Linux高端骚操作实战篇]​

专栏跑道六


➡️数据结构与算法[考研+实际工作应用+C程序设计]

专栏跑道七

➡️RHCSA-LJS[Linux初级及进阶骚技能]

上节回顾

2.1 CSRF攻击原理及防护

2.1.1CSRF是什么

    • 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。
      2. 步骤二 攻击者WebB通过在WebA中添加图片链接等方式诱导用户User访问网站WebB。
      3. 步骤三 在用户User被诱导访问WebB后,WebB会利用用户User的浏览器访问第三方网站WebA,并发出操作请求。
      4. 步骤四 用户User的浏览器根据WebB的要求,带着步骤一中产生的Cookie访问WebA。
      5. 步骤五 网站WebA接收到用户浏览器的请求,WebA无法分辨请求由何处发出,由于浏览器访问时带上用户的Cookie,因此WebA会响应浏览器的请求,如此一来,攻击网站WebB就达到了模拟用户操作的目的。

      2.1.4 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构造一个攻击界面
        <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难度

      • 看一下网页代码:
      <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,这时候,我们可以看一下源代码
      <·?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难度的那个文件内容相同:
        <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难度

      首先瞅一瞅网页代码:

      <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值!
      • 我们要先看一下源代码:
      • 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,由于有字符数限制,这里有两种方法:

      • 一是利用burp suite 进行抓包,然后改参数,运行获取token。

      • 二是利火狐浏览器打开xssstored)界面,点击浏览器中的设置->web开发者->查看器,找到和name框架有关的代码ctrl+f,输入txtname)

      • 我们将size和maxlength值改大一点,
      • 这样,我们就可以在name框中输入构造代码了,代码如下:
      • <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

      • 还要求用户输入原密码,这样在不知道原密码的情况下就无法构造参数。
      • 因此,本宝宝目前还无法破解。
      【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
      • 点赞
      • 收藏
      • 关注作者

      评论(0

      0/1000
      抱歉,系统识别当前为高风险访问,暂不支持该操作

      全部回复

      上滑加载中

      设置昵称

      在此一键设置昵称,即可参与社区互动!

      *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

      *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。