专栏首页网络攻防实战知识交流从二次注入,到报错注入注入,再到正则表达式绕过

从二次注入,到报错注入注入,再到正则表达式绕过

0x01前言

回顾了下以前的代码审计

三个白帽,很经典

现在估计都没有了吧。

0x02 分析

<?php
include 'db.inc.php';
foreach(array('_GET','_POST','_COOKIE') as $key){
    foreach($$key as $k => $v){
        if(is_array($v)){
            errorBox("hello,sangebaimao!");
        }else{
            $k[0] !='_'?$$k = addslashes($v):$$k = "";
        }
    }
}

function filter($str){
    $rstr = "";
    for($i=0;$i<strlen($str);$i++){
        if(ord($str[$i])>31 && ord($str[$i])<127){
            $rstr = $rstr.$str[$i];
        }
    }
    $rstr = str_replace('\'','',$rstr);
    return $rstr;
}


if(!empty($message)){
    if(preg_match("/\b(select|insert|update|delete)\b/i",$message)){
        die("hello,sangebaimao!");
    }
    if(filter($message) !== $message){
        die("hello,sangebaimao!");
    }

    $sql="insert guestbook(`message`) value('$message');";
    mysql_query($sql);
    $sql = "select * from guestbook order by id limit 0,5;";
    $result = mysql_query($sql);
    if($result){
        while($row = mysql_fetch_array($result)){
            $id = $row['id'];
            $message = $row['message'];
            echo "|$id|=>|$message|<br/>";
        }
    }

    $message = stripcslashes($message);
    $sql = "delete from guestbook where id=$id or message ='$message';";
    if(!mysql_query($sql)){
        print(mysql_error());
        $sql = "delete from guestbook where id=$id";
        mysql_query($sql);
    };
}
?>

源码如题, 在我本地间的构造了一个数据库,然后就运行了。

  • 不难看出,有两个过滤的地方,一个是filter函数,另外一个是正则绕过。这是对输入的绕过。
  • 代码的逻辑也很简单,插入,显示,取出,删除。
  • 我们插入的数据,进入第二次的查询,这就存在二次注入了。二次注入的逻辑也很简单,只要插入的数据经过过滤之后可以正常查询就好了。
  • 然后就是回显的问题了,有一个print(mysql_error());那么就可以直接使用报错注入了

以上是对程序的简单分析。

0x03 绕过

  1. 关于单引号的绕过,这个地方比较特别,程序中有一个 message=stripcslashes(message);关于这个函数的作用可以简要要说明一下: 反引用一个使用 [addcslashes()](https://www.php.net/manual/zh/function.addcslashes.php) 转义的字符串 返回反转义后的字符串。可识别类似 C 语言的 *\n*,*\r*,... 八进制以及十六进制的描述。 stripcslashes('H\xaello') == 'H'.chr(0xAE).'llo' 既然可以转义,直接让他来转义\x27 就可以使用单引号了。
  2. 关于正则的绕过 可以看出正则表达式中有\b 先来看看\b的作用,\b的作用是匹配单词的边界。所谓的单词的边界就是特殊符号的边界。 绕过的思路就来了,假设我们想使用select 在select前后加点单词就可以了。 这里提一个mysql的tips /*!*/ 只在mysql中有用,在别的数据库中这只是注释,但是在mysql,/*!select 1*/可以成功执行,在语句前可以加上5位数字,代表版本号,表示只有在大于该版本的mysql中不作为注释. mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.9-log | +-----------+ 1 row in set (0.00 sec) mysql> select /*!50709version()*/; +-----------+ | version() | +-----------+ | 5.7.9-log | +-----------+ 1 row in set (0.00 sec)
  3. 关于报错注入
UpdateXML(xml_target, xpath_expr, new_xml)
updatexml函数有三个参数,作用是xml替换,把xml_target中被xpath_expr匹配到的部分使用new_xml替换

这个报错注入的原理是利用updatexml的参数错误,首先不能有语法错误,要不然注入的语句根本无法执行,语法正确后,先去执行concat(0x27,(/*!00000select version()*/)),得到'5.5.42-log,作为第二个参数传入updatexml函数中,而updatexml第二个参数为xml的匹配表达式,单引号为非法字符,因此报错,输出错误内容'5.5.42-log, 因此得到了你想要得到的数据

payload

?message=aaa\x27 and updatexml(0,concat(0x27,(/*!00000select version()*/)),0)%23

本文分享自微信公众号 - 无级安全(wujisec)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 短URL服务的设计与实现

    作者:呼延十原文:https://juejin.im/post/5d10ecab518825795a4d380e

    黄泽杰
  • 彻底解决access_token有效时间不稳定问题

    错误码是不会变得,报错内容也不变,唯一就最后那一段变了,所以完全不考虑,所以,简单写一个判断,如下图

    许坏
  • CentOS 7配置LNMP开发环境及配置文件管理详解

    本篇文章主要介绍了CentOS 7配置LNMP开发环境及配置文件管理,详细的介绍了MySQL 5.6,PHP 5.6,Nginx的安装与配置,有兴趣的可以了解一...

    习惯说一说
  • 编程方式重启 ASP.NET Core 网站

    常言道,多喝热水,重启试试。有时候当应用工作不正常,重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启...

    Edi Wang
  • ASP.NET Core IP 请求频率限制

    在网站或API应用中,我们为了防止无聊人士或恶意攻击,通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中,限制IP请求频率非常简单,我们来看...

    Edi Wang
  • php解决新浪图床防盗链接口

    将以上6行代码复制然后在你服务器上新建一个php文件,内容就是这6行代码,使用的时候在你文件的远程路径后加?url=图片链接:

    许坏
  • 【笔记】宝塔面板配置laravel

    http://www.bt.cn/bbs/thread-19376-1-1.html

    许坏
  • 腾讯云最新优惠活动和学生服务器

    腾讯云学生服务器优惠套餐 1.注册腾讯云帐号 2.完成个人认证 3.购买套餐 4.填写学生信息体验版云服务器优惠套餐

    用户5789651
  • 小白如何领取腾讯云代金券及使用?

    腾讯云代金券是腾讯云专用的一种代金券,也可以称为腾讯云优惠券。在购买腾讯云的时候,可获得相应的优惠折扣。一般购买腾讯云的时候,建议使用腾讯云代金券,这样可以节省...

    勤劳的小蜜蜂
  • access_token获取和缓存进行2小时刷新

    做微信相关开发,基本上离不开access_token,只要是使用它的资源类api基本上必不可少,之前都是直接存进数据库了,但随着做的产品过多,使用数据库得办法很...

    许坏

扫码关注云+社区

领取腾讯云代金券