zoukankan      html  css  js  c++  java
  • 审计一套CMS中的SQL注入

    漏洞分为系统漏洞和应用漏洞,系统漏洞以二进制漏洞为代表,其挖掘难度较高需要对反汇编和操作系统原理深入理解,而除了系统漏洞以外还有一些应用漏洞,包括不限MySQL,Apache,为代表的Web漏洞,这里我们就挖掘PHP代码层面的漏洞。

    漏洞的挖掘也分为,点对点挖掘漏洞,和分散式挖掘漏洞,这我们主要使用点对点挖掘,在挖掘是我们需要找一些关键字,漏洞本身就是两个条件,可控的函数,和可控的变量。

    1.首先打开about.php源代码,然后 $GET[r] 通过GET的方式接收一个传递参数,然后通过使用 addslashes 函数过滤,addslashes函数的作用是转义,将多余的单引号全部转义,转义以后交给llink变量保存结果,然后拼接SQL查询语句,由于拼接代码 $llink中存在单引号,那我们需要手动闭合单引号,一旦闭合单引号addslashes函数就起了作用,会自动过滤掉单引号,所以这里无法被绕过。

    <?php 
    require 'inc/conn.php';
    require 'inc/time.class.php';
    $query = "SELECT * FROM settings";
    $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $info = mysql_fetch_array($resul);
    $llink = addslashes($_GET['r']);
    $query = "SELECT * FROM nav WHERE link='$llink'";
    $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $navs = mysql_fetch_array($resul);
    ?>

    2.打开另一个 content.php 观察下方的PHP代码,虽然有很多处数据库的操作,但是带入查询时都是通过单引号括起来的,并且每一个语句都强制使用addslashes函数进行了不同程度的转义,这里并没有可利用的地方。

    <?php 
    require 'inc/conn.php';
    require 'inc/time.class.php';
    $query = "SELECT * FROM settings";
    $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $info = mysql_fetch_array($resul);
    
    $id=addslashes($_GET['cid']);
    $query = "SELECT * FROM content WHERE id='$id'";
    $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $content = mysql_fetch_array($resul);
    
    $navid=$content['navclass'];
    $query = "SELECT * FROM navclass WHERE id='$navid'";
    $resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $navs = mysql_fetch_array($resul);
    
    //浏览计数
    $query = "UPDATE content SET hit = hit+1 WHERE id=$id";
    @mysql_query($query) or die('修改错误:'.mysql_error());
    ?>
    <?php
    $query=mysql_query("select * FROM interaction WHERE (cid='$id' AND type=1 and xs=1)");
    $pinglunzs = mysql_num_rows($query)
    ?>
    

     3.打开 submit.php 文件,观察代码发现这里作者写遗漏了,这里并没有过滤函数的过滤,而且都是POST方式传递的参数,明显可以使用POST注入。

    <?php
    session_start();
    require 'inc/conn.php';
    $type=addslashes($_GET['type']);
    $name=$_POST['name'];
    $mail=$_POST['mail'];
    $url=$_POST['url'];
    $content=$_POST['content'];
    $cid=$_POST['cid'];
    $ip=$_SERVER["REMOTE_ADDR"];
    $tz=$_POST['tz'];
    if ($tz==""){$tz=0;}
    $jz=$_POST['jz'];

    将代码向下翻,可以看到  SELECT * FROM interaction WHERE( mail = '$mail') 这么一条查询语句,这条语句虽然 $mail  参数被加了单引号,但是由于没有进行有效的过滤,所以我们可以通过构建一些SQL语句巧妙地闭合它。

    //查询用户头像数据
    $query = "SELECT * FROM interaction WHERE( mail = '$mail')";
    $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $tx = mysql_fetch_array($result);
    if (!mysql_num_rows($result)){  
    $touxiang = mt_rand(1,100);
    }else{
    $touxiang = $tx['touxiang'];
    }

    继续向下找,同样的在最下方也发现了存在查询语句  SELECT * FROM download WHERE( id= $cid) 这个cid参数,也没有进行合法化的检查,也是一个SQL注入漏洞。

    if ($type==3){
    $query = "SELECT * FROM download WHERE( id= $cid)";
    $result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
    $wz = mysql_fetch_array($result);
    $title=$wz['title'];
    $body ='<div style="border:1px double #06f;">

    上方两处就是这个CMS系统的注入漏洞,虽然mail参数上有单引号,但是并没有检查合法化,这里我们只需要将其闭合掉就可以。

    这两个变量我们能够操作他,因为它带入到数据库查询了,我们只需要把前面的单引号闭合掉。

    4.上方的漏洞文件在  /files/submit.php,且文件的开头都是 $_POST['xxx']; 明显这是POST注入,这里如果直接使用 http://127.0.0.1/cms/files/submit.php 访问的话会报错,原因是包含不到 require 'inc/conn.php'; 这个文件,我们继续看下主 index.php 是怎么包含的,如下代码:

    <?php
    error_reporting(0); //关闭错误显示
    $file=addslashes($_GET['r']); //接收文件名
    $action=$file==''?'index':$file; //判断为空或者等于index
    include('files/'.$action.'.php'); //载入相应文件
    ?>

    如上:首先通过 $_GET['r] 接收一个参数,然后传递给file,action 如果为空则等于index,最终包含 files/.action.php,如果要访问  /files/submit.php 包含以后的写法是:?r=submit 或者完整写法 /index.php?r=submit

    5.为了方便演示,我们在 submit.php 文件中加入以行打印函数,echo $mail; 打印出mail里面的参数

    <?php
    session_start();
    require 'inc/conn.php';
    $type=addslashes($_GET['type']);
    $name=$_POST['name'];
    $mail=$_POST['mail'];
    echo $mail;                      < ------------------------
    $url=$_POST['url'];

    然后使用火狐浏览器的hackBar插件进行POST注入,如下图注入成功了。

    除此之外,login.php 文件中也存在一个注入漏洞  /cms/admin/?r=login ,我们可以直接写出他的exp ,但是这里没有地方可以完成回显,但漏洞是存在的。

    直接记下 http://127.0.0.1/cms/admin/?r=login 网址然后,我们打开SQLMAP跑一下。

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/LyShark/p/11313542.html
Copyright © 2011-2022 走看看