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跑一下。

  • 相关阅读:
    OC与Swift的区别二(常量、变量、运算符)
    OC与Swift的区别一(文件结构)
    OC对象的归档及解档浅析
    OC单例模式的实现
    oc文件基本读写及操作
    IOS之沙盒(Sandbox)机制
    IOS开发之KVC与KVO简述
    SpringMVC控制器配置文件
    spring常用的连接池属性文件配置
    Struts2文件上传方式与上传失败解决方式
  • 原文地址:https://www.cnblogs.com/LyShark/p/11313542.html
Copyright © 2011-2022 走看看