詳解S-CMS企業(yè)建站v3幾處SQL注入
0x01 前言
有段時(shí)間沒有發(fā)文章了,主要沒挖到比較有意思的漏洞點(diǎn)。然后看最近爆了很多關(guān)于S-CMS的漏洞,下載了源碼簡(jiǎn)單挖了一下然后給大家分享一下。
0x02 目錄
Wap_index.php sql注入Form.php Sql注入Input、query
0x03 插曲
這里分享一下在審計(jì)的時(shí)候自用的一段代碼。
$debug=function(){
$logFile='C:\\Users\\DELL\\Desktop\\debug.txt'; //輸出的文件
$param=func_get_args(); //獲取傳入函數(shù)的參數(shù)
if (count($param)>0){
$str=serialize($param); //序列號(hào)
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都是要查看的變量。主要用這個(gè)的話個(gè)人感覺比較方便,平常測(cè)試都是var_dump();die;來查看。然后當(dāng)die后,頁面還是沒有打印內(nèi)容,用這個(gè)函數(shù)還是相對(duì)比較方便的。當(dāng)然用phpstorm下斷點(diǎn)挺好的,不過個(gè)人不太喜歡。主要還是我懶。
0x04 Wap_index.php sql注入
漏洞文件:\scms\wap_index.php這個(gè)文件的話不止這一處Sql注入,這里只寫這一個(gè)。漏洞行號(hào):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("菜單指向的簡(jiǎn)介已被刪除,請(qǐng)到“菜單管理”重新編輯", "back", "error");
} else {
$page_info = ReplaceLableFlag(ReplaceWapTag(CreateHTMLReplace(CreateText(ReplaceWapPart(LoadWapTemplate($style, $S_id)) , $S_id))));
}
break;S_id直接從GET獲取無單引號(hào)拼接進(jìn)了sql語句
if(isset($_GET["S_id"])){
$S_id = $_GET["S_id"];
}else{
$S_id = "0";
}這套CMS核心全帶全都加密處理了所以我們看不到他的過濾方法,不過當(dāng)出現(xiàn) union select 等的時(shí)候都直接退出了,沒有繼續(xù)往下執(zhí)行。研究發(fā)現(xiàn)當(dāng)傳入select(user())能正常執(zhí)行,不過嘗試union(select(1)) 的時(shí)候也沒有執(zhí)行,應(yīng)該是直接正則匹配的union這個(gè)單詞,而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

正常執(zhí)行了sql語句。S_id=1 and (select(user()) from sl_reply 同樣可以正常執(zhí)行,可通過盲注爆數(shù)據(jù)。
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("驗(yàn)證碼錯(cuò)誤!/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("請(qǐng)?zhí)钊珒?nèi)容后提交!/l/Please fill in the full content to submit!"),"back","error");
die();
}else{
if (!IsValidStr($_POST[$x])){
box(lang("您輸入的內(nèi)容有敏感字符,請(qǐng)重新輸入!/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("您的網(wǎng)站有新的表單提交","<h2>您的網(wǎng)站“".lang($C_webtitle)."”有新的表單提交</h2><hr>請(qǐng)進(jìn)入“網(wǎng)站后臺(tái)” - “表單系統(tǒng)” - “查看統(tǒng)計(jì)”查看詳情!",$C_email);
}
}這里簡(jiǎn)單看些邏輯,先判斷code驗(yàn)證碼是否錯(cuò)誤,如果為False不錯(cuò)誤,進(jìn)入foreach循環(huán),判斷$x(也就是 $_POST的key)>0這里就可以通過php弱類型比如1a>0 為True 這個(gè)不多介紹了,然后如果$_POST[$x] 不為空,繼續(xù)檢測(cè)$_POST[$x] 是否存在敏感字符,然后拼接sql語句。
整個(gè)流程就這樣了,漏洞觸發(fā)點(diǎn)就是$x,它檢測(cè)敏感字符只檢測(cè)了$_POST[$x]內(nèi)容,而沒檢測(cè)$x,而且直接拼接入了sql語句導(dǎo)致SQL注入。
漏洞演示:

http://127.0.0.1/scms/form.php?action=input&S_id=0code=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("驗(yàn)證碼錯(cuò)誤!/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);這個(gè)相對(duì)簡(jiǎn)單不多說,$Q_sort從post獲取,無過濾直接拼接進(jìn)sql語句導(dǎo)致sql注入。
Payload:http://127.0.0.1/scms/form.php?action=query&S_id=0code=t5o9&Q_sort=1 and 1=1
0x06 結(jié)束語
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
易優(yōu)eyoucms數(shù)據(jù)表結(jié)構(gòu)和字段說明(數(shù)據(jù)字典)
EyouCms是基于TP5.0框架為核心開發(fā)的免費(fèi)開源的企業(yè)內(nèi)容管理系統(tǒng),易優(yōu)基本包含了一個(gè)常規(guī)企業(yè)網(wǎng)站需要的一切功能。這篇文章主要介紹了易優(yōu)eyoucms數(shù)據(jù)表結(jié)構(gòu)和字段說明(數(shù)據(jù)字典),需要的朋友可以參考下2023-04-04
fastadmin使用學(xué)習(xí)中的常見問題匯總
fastadmin是thinkPHP開發(fā)框架整合了很多插件和技術(shù),后臺(tái)的前端頁面使用Bootstrap,還有RequireJs。總的來說,需要開發(fā)者前后端全棧技術(shù)程度較高,當(dāng)然也要看使用學(xué)習(xí)時(shí)間長(zhǎng)短,畢竟熟能生巧。這篇文章主要介紹了fastadmin使用學(xué)習(xí)中的常見問題匯總2022-12-12
wordpress?12個(gè)數(shù)據(jù)表結(jié)構(gòu)和字段說明
WordPress安裝的時(shí)候數(shù)據(jù)庫(kù)會(huì)有12個(gè)默認(rèn)的數(shù)據(jù)表,每張表的數(shù)據(jù)都包含了?WordPress?不同的功能。看看這些表的結(jié)構(gòu),你能很容易的了解網(wǎng)站不同的部分都是存在哪里的。這篇文章主要介紹了wordpress?12個(gè)數(shù)據(jù)表結(jié)構(gòu)和字段說明,需要的朋友可以參考下2023-04-04
DownPlus 安全補(bǔ)丁 2008-12-12 附修改方法
DownPlus 安全補(bǔ)丁 2008-12-12 修正內(nèi)容: 修正query.asp的跨站腳本漏洞.2008-12-12
phpcms數(shù)據(jù)表結(jié)構(gòu)和字段詳細(xì)說明
PHPCMS?V9可以輕松承載百萬級(jí)的訪問數(shù)據(jù),最大的功臣就是PHPCMS良好的數(shù)據(jù)庫(kù)結(jié)構(gòu)。學(xué)習(xí)一下PHPCMS的數(shù)據(jù)庫(kù)結(jié)構(gòu)。數(shù)據(jù)表的默認(rèn)表前綴是V9_?,表前綴的主要作用是數(shù)據(jù)庫(kù)中有不同系統(tǒng)的數(shù)據(jù)表存在時(shí),可以用表前綴來區(qū)分出來。2023-04-04
zblogphp、Z-Blog PHP數(shù)據(jù)庫(kù)結(jié)構(gòu)及表中的字段詳細(xì)說明
如果你是一位開發(fā)者,你一定知道Zblog-PHP。它是一款非常流行的開源博客系統(tǒng),許多人使用它來創(chuàng)建自己的博客。在使用Zblog-PHP的過程中,你可能會(huì)遇到一些數(shù)據(jù)庫(kù)字段,這些字段可能會(huì)導(dǎo)致一些困惑。因此,在本文中,我們將詳細(xì)解釋Zblog-PHP數(shù)據(jù)庫(kù)字段的含義和作用。2023-03-03

