|
原文链接:某达oa代码审计
某达oa代码审计
 
0×00:前言 近期公司内部举办了开源系统挖掘漏洞比赛,本菜前段时间刚学习了php代码审计,挖到了目标之一通达oa的一些漏洞,本文主要记录了不能调试的情况下如何审计网站漏洞,挖掘过程突破了通达oa内部的waf防御,蛮有意思的。
影响版本:某达OA11.10版服务端0×01:漏洞挖掘SQL注入(一)
漏洞url:http://目标/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注入的过滤和处理,也有了更多的测试方法,所以学好代码审计对以后的成长还是很有帮助的。
|
|