通达OA 前台任意用户
伪造登录分析
看到最近报出来的通达前台任意用户伪造登录的漏洞,今天也尝试复现一下。
通达oa的php文件需要zend5 解密。
漏洞文件在 logincheck_code.php ,当UID为1时,用户默认为admin。
include_once "inc/session.php";session_start();ob_start();include_once "inc/conn.php";include_once "inc/td_core.php";include_once "inc/utility.php";include_once "inc/utility_cache.php";include_once "inc/TRedis/TRedis.php";$redis = TRedis::redis();$UID = intval($_POST["UID"]);$CODEUID = $_POST["CODEUID"];$login_codeuid = TD::get_cache("CODE_LOGIN" . $CODEUID);if (!isset($login_codeuid) || empty($login_codeuid)) { $databack = array("status" => 0, "msg" => _("参数错误!"), "url" => "general/index.php?isIE=0"); echo json_encode(td_iconv($databack, MYOA_CHARSET, "utf-8")); exit();}
来看下代码,前边包含了inc文件夹中的session.php,创建了session会话并且打开了数据缓冲,接下来加载了一些配置文件,变量redis 配置redis连接的内容,比较关键的就是UID参数的获取。可以看到$UID是通过post方法传递进来的,而且为整数。
然后我们往下看,会进行一次UID的查询。
![6a253b0f6e7ed03298236d900926e8ad.png](https://img-blog.csdnimg.cn/img_convert/6a253b0f6e7ed03298236d900926e8ad.png)
同时在180行左右,会把UID传递给$LOGIN_UID,同时$LOGIN_UID会直接传递给SESSION。
![d49ad0b34ff3d22f16bd302b6724198d.png](https://img-blog.csdnimg.cn/img_convert/d49ad0b34ff3d22f16bd302b6724198d.png)
现在就是要搞明白CODEUID 是怎么传递的了。找一下设置CODE_LOGIN的文件,跟进general\login_code.php。
![44e2dba9c39f38295c2aa581eb167f2c.png](https://img-blog.csdnimg.cn/img_convert/44e2dba9c39f38295c2aa581eb167f2c.png)
当$login_codeuid为空时会getUniqid()生成一个存入redis缓存并且在最后echo出来。所以我们可以通过直接get请求。
使用之前的CODEUID即可绕过if条件的exit()。
利用:
![c6b6f32ab2e906706ceb2855bd8b488d.png](https://img-blog.csdnimg.cn/img_convert/c6b6f32ab2e906706ceb2855bd8b488d.png)
22DB918D-DFA8-4A93-5AA1-B7E8040702AF
![eb2d2e726db7d74f1056ec4619b641b0.png](https://img-blog.csdnimg.cn/img_convert/eb2d2e726db7d74f1056ec4619b641b0.png)