一、前端SQL注入 - ad_js.php

漏洞点在如下位置:没有进行过滤或防护直接拼接sql语句

image-20241029211002359

但是在上面包含文件/include/common.inc.php中,存在对GET、POST、COOKIE使用addslashes 进行的统一过滤

1
2
3
4
5
6
7
8
9
10
11
function deep_addslashes($str){
if(is_array($str)){
foreach($str as $key=>$val){
$str[$key] = deep_addslashes($val);
}
}
else{
$str = addslashes($str);
}
return $str;
}

因此,单引号、双引号、反斜杠在get、post、cookie中将被转义。

此时的绕过方式也有很多:

  1. 使用十六进制编码
  2. 此cms使用了gbk编码,通过宽字节来绕过

在$db->getone()的底层使用的是mysql_query

1
2
3
4
5
6
7
8
9
10
11
12
13
function query($sql){
if(!$query=@mysql_query($sql, $this->linkid)){
$this->dbshow("Query error:$sql");
}else{
return $query;
}
}

function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}

二、insert型SQL注入

/inlude/common.inc.php 中,发现get、post、cookie 都经过了addslashes 的过滤,作为白盒测试的我们,发现数据库中存储了IP的信息,会不会有存储IP的地方没有经过addslashes 的过滤呢?全局搜索ip

image-20241029220853676

果然,找到一个getip 的函数,顺着往上找

comment.php中,存在一个insert 的SQL语句,其中使用了getip()函数,

image-20241029221309873

三、用户登陆SQL注入

看用户登陆的user.php$act == 'index_login'内容,登陆校验在user.fun.php文件中,重点代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
function login($user_name,$pwd){
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name'");
if($row['num']==0){
$result = 0;
}else{
$sql = "SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name' and pwd=md5('$pwd')";
$user_num = $db->getone($sql);
if($user_num['num']){
$result = 1;
}else $result = -1;
}
return $result;
}

当我们知道用户名之后,在密码的位置可以使用万能密码进行登陆,这里使用宽字节绕过addslashes 函数

1
user_name=test&pwd=%df') or 1=1 %23&x=26&y=8

image-20241030213746125

四、文件包含漏洞至Getshell

user.php的750行中,如:

1
2
3
4
5
6
7
8
9
10
elseif ($act == 'pay'){
include 'data/pay.cache.php';
$price = $_POST['price'];
$id = $_POST['id'];
$name = $_POST['name'];
if (empty($_POST['pay'])) {
showmsg('对不起,您没有选择支付方式');
}
include 'include/payment/'.$_POST['pay']."/index.php";
}

这里post提交的pay 没有进行任何的过滤,则可通过目录穿越和截断实现任意文件包含

如果php版本低于5.3.4magic_quotes_gpc=off则可以使用%00截断。还可以使用系统文件路径长度限制来进行截断

image-20241029225134497

这里已经包含了根路径下的index.php 文件,现在来包含根路径下的1.txt,使用系统文件路径长度限制来绕过。这里依然有个前提,我看很多博客上面都没有提到系统文件路径长度绕过的限制,导致复现不成功,这里的php版本需要小于5.2.8

image-20241029233325335

这样,我们可以联合图片上传来getshell

image-20241029233758459

找到图片位置进行包含并执行命令

image-20241029234359404

五、任意文件删除

database.php文件中存在该漏洞

image-20241029234847190

很明显,漏洞原因是没有对$file_name做充足的校验

删除前根目录

image-20241029235035386

访问:http://192.168.137.48/bluecms/admin/database.php?act=del&file_name=../../../../../../../../1.txt

删除后根目录

image-20241029235249890

六、存储型XSS

这个有点多,简单分析一处

user.php新增文章这里

image-20241029235619966

不过这里使用了一个filter_data 函数做了一个过滤

1
2
3
4
5
function filter_data($str)
{
$str = preg_replace("/<(\/?)(script|i?frame|meta|link)(\s*)[^<]*>/", "", $str);
return $str;
}

但是这个正则是可以绕过的,如使用img标签

1
<img src=1 onerror=alert(1)>

七、总结

这个bluecms有博主共计74处漏洞,更多的漏洞就暂时不看了,这里贴上这位博主的文章:Bluecms 1.6 代码审计过程(共计 74 个漏洞)-CSDN博客