YZM几经周折的积累(鸡肋)审计过程

admin 2021年5月10日01:30:16评论43 views字数 2344阅读7分48秒阅读模式

几经周折

内容繁多。如果不想看,请翻到最后总结。

天荒夜谈来注入,勿以成败论英雄

寻找的方法方法很简单,seay源码审计系统一把梭(我还在使用上古审计工具,哪位大佬有现代化审计工具求介绍)。

发现在应用/admin下的category控制器中, 变量无单引号注释

YZM几经周折的积累(鸡肋)审计过程
追踪该纪律发现是栏目编辑的方法,意味着如果有漏洞的存在 ,那么正常情况下需要后台操作。

发现该语句的执行来自于DB类的query方法。在该cms的核心目录寻找该DB类

YZM几经周折的积累(鸡肋)审计过程
继续追中execute方法

YZM几经周折的积累(鸡肋)审计过程
由上图可以看出,传入数据先放入lastsql 然后直接执行了。
mysql_query($sql)
$this->geterr($sql)
这两个方法只要其中一个执行成功就返回真
最后debug一下$sql查看是否出现错误

YZM几经周折的积累(鸡肋)审计过程
查看addms静态方法,发现只是输出一个错误信息。并不影响。
回头追踪与区别$this->geterr($sql)方法。

YZM几经周折的积累(鸡肋)审计过程
发现也是获取mysql错误的方法。那么就不用深究了

回到最初,追踪利用条件

YZM几经周折的积累(鸡肋)审计过程

发现可以利用的$_POST['arrparentid']引用了safe_replace()函数。 但是这不是一个PHP的函数。所以全局搜索获取到

YZM几经周折的积累(鸡肋)审计过程

但是

YZM几经周折的积累(鸡肋)审计过程

这里可以有方式绕过。但是我太菜了。
最后发现

YZM几经周折的积累(鸡肋)审计过程

变量$_POST['arrparentid']
会被重置为
放弃。

雨天过后是晴天,柳暗花明又一村

经过今天的翻找,终于在Yzmphp/core/class/databack.class.php(121行)
找到直接使用了$db_query的地方。如下图

YZM几经周折的积累(鸡肋)审计过程

但是该处有可控变量$table吗?搜索一下使用了该方法的地方

YZM几经周折的积累(鸡肋)审计过程
与之对应的$table是$tables[$id] 来自于控制器中

YZM几经周折的积累(鸡肋)审计过程
来自于$_session
(application/admin/controller/database.class.php(157行))
$_SESSION['backup_tables'] = $tables;
$session来自于$table
(application/admin/controller/database.class.php(126行))

YZM几经周折的积累(鸡肋)审计过程
$table的来自于POST方法。那么至此确定,输入完全可控。

刚才是向上追寻注入点,现在向下追寻是否过滤
由于内容过多只做结果说明。 “向下寻找并无过滤”。

床头屋漏无干处,但见彩虹风雨后

暴雨就是注入点的利用有点尴尬。
由最开始的地方可以知道。该数据的入口在yzm/core/class/databack/class.php的backup方法中(115行)。
而引用该方法的的地方在application/admin/controller/databases.class.php的export_list方法中(126行)。
那么寻找到使用该方法的后台路径。备份数据库处

YZM几经周折的积累(鸡肋)审计过程
数据包如下

YZM几经周折的积累(鸡肋)审计过程
表明处为注入点。尝试报错。
但是因为无回显的注入。所以先想别的方法验证
所以先查看备份配置文件application/admin/controller/databases.class.php

YZM几经周折的积累(鸡肋)审计过程
尝试payload
&tables%5B%5D=yzm_admin_log' and sleep(10) and 1='1

进入
$result = $db->fetch_array($db->query("SHOW CREATE TABLE{$table}"))
之后
其中的$db->query()变成
SHOW CREATE TABLE yzm_admin_log' and sleep(10) and 1='1

YZM几经周折的积累(鸡肋)审计过程

接下来就是验证环节
但是show create table我不知道该怎么利用注入

这时候出现问题了!!

YZM几经周折的积累(鸡肋)审计过程

但是数据备份已经创建

YZM几经周折的积累(鸡肋)审计过程
内容为空,仅仅执行了开始的头部。如下图

YZM几经周折的积累(鸡肋)审计过程
可以看到,没有执行到
@unlink($_SESSION['backup_config']['path'].'backup.lock');

YZM几经周折的积累(鸡肋)审计过程
锁文件还在
可以确定。执行到了
出错了之后就终止了
最后发现有个$start的传参决定了运行创建session还是运行sql语句。
如果$start 可控传参,那么就可以跳过
SHOW CREATE TABLE{$table}``
那么追踪$start

YZM几经周折的积累(鸡肋)审计过程
来自于get传参。那么试着伪造一个。
在这里有个坑, 如果有dosubmit就会进入初始化

YZM几经周折的积累(鸡肋)审计过程
所以修改数据包
删除dosubmit参数。

elseif (isset($_GET['id']) && isset($_GET['start'])) {
因为这里还会判断ID和start所以在用get方式传参ID和start
传参如下,红色地方为需要注意的点,两个get传参,一个post传参。最后查询的语句中$table为空,而且不执行

SHOW CREATE TABLE{$table}`
OK 。可以。查询下,为啥table为空

YZM几经周折的积累(鸡肋)审计过程

Table来自于上个if判断条件。因为没有赋值所以为空。

YZM几经周折的积累(鸡肋)审计过程

乱花渐欲迷人眼 浅草才能没马蹄

总结与POC

YZM几经周折的积累(鸡肋)审计过程
上面发现如何修改都不能到第二里面,并且设置$_session table
所以

YZM几经周折的积累(鸡肋)审计过程
先利用 157行设置$_session table

YZM几经周折的积累(鸡肋)审计过程
然后再使用第二个数据包
操作如下:
1、设置payload语句进入session

YZM几经周折的积累(鸡肋)审计过程
2、触发payload

YZM几经周折的积累(鸡肋)审计过程

总结

1、首先是sql注入找注入点。但是没成功
2、找到注入点,无回显,不知道如何利用
3、利用写文件两次触发。
上面的第一步为第二步找到了可能纯在注入的漏洞。
第二步解决了第三步如何触发的思路。

相关推荐: 社工攻击-BadUSB攻防研究

序言 随着”网络强国战略”的实施,越来越多的企业着重网络安全的建设,企业在维护企业网络安全上煞费苦心,开发人员定期的进行安全开发培训,尽可能的减少在软件开发时期漏洞的产生,还通过添加硬件防火墙,入侵检测系统、防御系统等安全设备防御外部对企业的威胁,这些有效的手…

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月10日01:30:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   YZM几经周折的积累(鸡肋)审计过程http://cn-sec.com/archives/246593.html