安全矩阵

 找回密码
 立即注册
搜索
查看: 2730|回复: 0

某达oa代码审计

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2022-2-27 17:23:18 | 显示全部楼层 |阅读模式
原文链接:某达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语句


漏洞点在webroot/general/system/approve_center/flow_data
/export_data.php文件中,post接受d_name参数,直接拼接到sql语句

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

首先构造payload:d_name=src

日志中可以看到执行

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

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

嗯?sleep被过滤了,试试benchmark

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

试一试笛卡尔积

Ok,可以,通过观察文件黑名单过滤字符串,可以知道ascii和ord函数被禁用,而且单引号被全局过滤,所以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’的ascii为116
当构造payload:(substr(DATABASE(),1,1))=char(116)时,成功延时

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

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_NAME和DEVICE_LIST,重点来了,DEVICE_LIST直接使用()包裹然后拼接到了下一条sql语句中

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

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

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

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

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

第二步,访问/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,最后还需要闭合括号

数据库已被修改

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

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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-24 04:46 , Processed in 0.017572 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表