某达oa代码审计

admin 2022年2月27日19:15:58评论324 views字数 2563阅读8分32秒阅读模式
某达oa代码审计
某达oa代码审计

0×00:前言

  近期公司内部举办了开源系统挖掘漏洞比赛,本菜前段时间刚学习了php代码审计,挖到了目标之一通达oa的一些漏洞,本文主要记录了不能调试的情况下如何审计网站漏洞,挖掘过程突破了通达oa内部的waf防御,蛮有意思的。

影响版本:某达OA11.10版服务端

0×01漏洞挖掘

SQL注入()

漏洞urlhttp://目标/general/system/approve_center/flow_data/export_data.php

Postdata:

d_name=src where d_id=1 and (substr(DATABASE(),1,1))=char(116) and (selectcount(*) from information_schema.columns A,information_schema.columns B)


漏洞详情:

某达oa使用zend加密,可以先使用seayDzend解密
某达oa使用的是自带的离线版的mysql,redis等,所以可以一键安装,但是这样不可以方便的动态调试,所以我开启了mysql日志,通过查看日志能了解到执行了哪些sql语句
某达oa代码审计
漏洞点在webroot/general/system/approve_center/flow_data

/export_data.php文件中,post接受d_name参数,直接拼接到sql语句

某达oa代码审计

通过查看通达oa数据库,发现存在data_src

某达oa代码审计

首先构造payload:d_name=src

某达oa代码审计

日志中可以看到执行

某达oa代码审计

构造payload:d_name=srcwhere d_id=1’,发现系统不会显示错误信息

某达oa代码审计

那么就用延时吧,payload:d_name=src where d_id=1 and sleep(3)

某达oa代码审计

嗯?sleep被过滤了,试试benchmark

某达oa代码审计

(吸气~)phpstorm全局搜索不安全的SQL语句,在/inc/conn.php中发现过滤了黑名单

某达oa代码审计

试一试笛卡尔积

某达oa代码审计

Ok,可以,通过观察文件黑名单过滤字符串,可以知道asciiord函数被禁用,而且单引号被全局过滤,所以ascii(substr(DATABASE(),1,1)=’a’这样的payload不可以被执行。但是注意到没有禁用char函数,构造(substr(DATABASE(),1,1))=char(116)替换以上payload

最终的payload:

d_name=sr cwhere d_id=1 and (substr(DATABASE(),1,1))=char(116) and (selectcount(*) from information_schema.columns A,information_schema.column sB)

通达oa的数据库名为td_oa,'t’ascii116
当构造payload:(substr(DATABASE(),1,1))=char(116)时,成功延时

某达oa代码审计

当构造payload:(substr(DATABASE(),1,1))=char(115)时,延时失败

某达oa代码审计

SQL注入()

这个漏洞本质上是一个二次注入,插入的时候进行了严格的过滤,但是读取的时候又没有进行过滤

漏洞url

/general/system/mobile_seal/insert.php
/general/system/mobile_seal/update.php
/pda/pad/settings/mobile_seal/get_seal.php?ID=1

漏洞详情:
/pda/pad/settings/mobile_seal/get_seal.php文件中,通过全局变量传入的id查询mobile_seal表中的SEAL_NAMEDEVICE_LIST,重点来了,DEVICE_LIST直接使用()包裹然后拼接到了下一条sql语句中

某达oa代码审计

那么找那里可以插入数据到mobile_seal表,全局搜索后发现在/general/system/mobile_seal/insert.php文件中调用了seal.php文件中的insert_seal方法

某达oa代码审计

seal.php文件中的insert_seal方法将传过来的数据插入到了mobile_seal表中,但是这里并没有将关键的DEVICE_LIST参数传入

某达oa代码审计

所幸,在/general/system/mobile_seal/update.php文件中发现可以通过id控制DEVICE_LIST,而这两个参数我们都可以随便控制

某达oa代码审计

那么思路就清晰了,漏洞利用步骤如下:
第一步,访问/general/system/mobile_seal/insert.php文件插入数据,这里直接访问提示参数出错,肯定要传参的,构造太麻烦,直接访问/general/system/mobile_seal填写表单

某达oa代码审计

提交后可以在数据库中发现数据已被添加,这时候我们可以控制的关键参数还没有值


某达oa代码审计

第二步,访问/general/system/mobile_seal/update.php修改DEVICE_LIST
payload:

http://localhost:809/general/system/mobile_seal/update.php?ID=3&DEVICE_LIST=2)%20and%20(select%20count(*)%20from%20information_schema.columns%20A,information_schema.columns%20B)and 1=(1

注意这里的id为数据表中的数据对应的id,这里为3,最后还需要闭合括号

某达oa代码审计

数据库已被修改

某达oa代码审计

第三步,访问/pda/pad/settings/mobile_seal/get_seal.php?ID=3,成功延时

某达oa代码审计


0×02总结

以前黑盒测试的时候只会用and1=1来判断,学习了代码审计,看懂了很多cms后台对sql注入的过滤和处理,也有了更多的测试方法,所以学好代码审计对以后的成长还是很有帮助的。


关注公众号

关于公众号投稿 

接受原创文章投稿

内容免杀 渗透实例 代码审计 溯源 经验技巧

要求 不能水文 从没发表 敏感内容打码

一经采纳根据文章质量给予作者 50-200的稿费。

投稿联系

某达oa代码审计



原文始发于微信公众号(moonsec):某达oa代码审计

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月27日19:15:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某达oa代码审计http://cn-sec.com/archives/806037.html

发表评论

匿名网友 填写信息