熊海CMS 靶场
0x01 前言
初步了解cms,Content Management System 内容管理系统。它是一种用于创建、编辑、管理和发布内容的软件程序或工具。内容管理系统通常用于网站、博客、企业内部系统等各种应用中,可以帮助用户管理和发布各种类型的内容,如文章、图片、视频、文件等。
进行PHP代码审计,代码审计是一种白盒测试,以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。 软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。
0x02 网站的基本结构
在熊海CMS 站点中,由以下几个基础目录组成:
css : 存放样式文件
files:存放着站点的页面html文件
houtai: 存放着站点短肽管理页面html文件
images:存放着站点的图片文件
inc:存放用于重复使用的代码、函数、类或者其他需要在多个页面中引用的文件。
install: 存放网站的安装配置也买你html文件
seacmseditor:存放着扩展插件等文件
template: 存放着定义网页结构和外观的模板html文件
upload: 为上传文件夹。
index.php: 一般为网站的访问点,
0x03 初步审计
审计流程
-
准备阶段:确定审计的范围和目标,收集相关文档、代码和其他必要的信息。
-
静态代码分析:通过工具或人工的方式对源代码进行审查,识别潜在的安全漏洞、逻辑问题或者代码质量问题。
-
动态代码分析:利用黑盒测试方法,对应用程序进行实际测试,寻找潜在的漏洞、安全隐患和逻辑问题。
-
报告撰写:总结审计结果,编写详细的审计报告,包括发现的问题、风险评估、建议的修复措施等内容。
-
问题跟踪和验证:与开发团队合作,跟踪和验证问题的修复过程,确保问题被有效解决。
静态审计
由于漏洞一般都发生在代码功能的逻辑错误,所以审计的重点在files、houtai两个文件夹。
问题 1 文件包含
/index.php
index.php 网页入口文件存在文件包含漏洞。
-
使用GET方法传入的参数,输入使用了
addslashes()
函数验证,但是它只能过滤‘
、“
、\
等特殊符号假站点存在其他漏洞,攻击者可以利用文件包含漏洞非常容易的利用。
利用条件:
php.ini 中的allow_url_fopen = On(远端资源)、allow_url_include= On(本地资源) 两个参数任意一个是开启状态。一般情况建议关闭allow_url_fopen.
攻击通过任意方式,将恶意代码侵入网站中,若开启了allow_url_fopen ,其他恶意的URL也能导致被入侵。
修复方法:
增加收入验证、使用安全的文件包含、关闭不必要的配置。
/houtai/index.php
webshell只能在files文件夹内,才能利用
/template/header.php
原理和上面一样 没有对输入参数进行验证。
问题2 SQL 注入
addslashes()函数问题
使用了GET方法接收参数r
,并用addslashes()
对参数进行特殊符号过滤,可以减少SQL注入的可能,
addslashes()
函数也不一定安全,在一些特殊情况下也是可以绕过。
- 数据库字符集是宽字节:利用宽字节的特性,使用一个超过128的16进制,放在单引号前。
- SQL语句是数值类型:因为数值类型无需引号闭合。
- 使用特殊编码:前提条件后端需要对该参数进行相对于的解码操作。
- 双字节编码:用多个字节表示一个字符,例如unicode。
- magic_quotes_gpc: 在php5.4 之前的版本 可以开启magic_quotes_gpc参数来绕过
但是在resul变量中添加的 mysql_error()
,如果sql语法错误,则会在主页上显示sql错误,如果使攻击者绕过了addslashes()
就很容易进行sql注入。
/files/software.php
在software.php
文件中使用GET方法获取的cid
参数 未使用过滤函数,但是注释了mysql_error()
函数,所以这里就造成了SQL注入
使用POC进行爆破:
永真语句:
?cid=1' and 1=1 --+
页面正常显示。
永假语句:
?cid=1' and 1=2--+
页面图片不在显示
由此判断改页面存在SQL盲注
使用poc
?cid=1' and ascii(substr(database(),1,1))=120--+
由此poc可以判断该数据库的名字第一个字符为x
.后句也可以根据这个poc变形爆破出该数据库的更多信息。
/files/submit.php
留言板对昵称、邮箱、网站、内容都进行的html和特殊字符过滤,但是还有隐藏参数并未进行过滤,
可以从请求包中发现,未过滤的cid
参数进行了SQL插入的操作,也并未对其做出过滤验证措施,而且用了mysql_error 函数将SQL的错误回显到页面之上。所以此处存在SQL报错注入。
使用POC,进行报错注入测试
'%20or%20updatexml(1,concat(0x7e,(user()),0x7e),0)%20or'
直接爆出数据库用户名
/houtai/files/editwz.php
update SQL报错注入
未对POST参数进行过滤验证
/houtai/files/editsoft
insert注入
123' or updatexml(1,concat(0x7e,(user()),0x7e),0) or '
原理同上,未对POST传入的参数做限制
/houtai/wzlist.php
存在deleteSQL注入
点击删除使用bp抓包
delete参数未使用过滤验证函数。使得该参数变为用户可控,用户可以通过改参数删除任意文章。
`/houtai/files/softlist.php
存在deleteSQL注入问题
与wzlist.php 页面一样。未对delete参数进行过滤验证,导致该参数用户可控。
/houtai/editcolumn
存在selectSQL注入
使用order by 语句发现 查询了10个字段。应该使用了*通配符进行的条件查询。
使用POC
union select 1,2,3,4,5,6,7,8,9,10--+
后并未发现明显的回显位,所以采取报错注入进行爆破。
成功获取数据库信息
问题3 反射型XSS
/files/contact.php
这里使用GET方法接收了一个page
的参数,虽然做了addslashes()
的特殊符号过滤操作,但是对于XSS漏洞来说还是不够的,
在代码的139行 通过a标签在页面上为做任何验证直接在页面上输出了该变量
输入POC测试:
<img src=1 onerror=alert(123)>
在这里我使用了一个 图片标签 img
,源地址随便设一个值,在找不到源地址,使用js报错事件来触发我想执行的内容,由于该POC内没有addslashes()
过滤的特殊字符,所以addslashes()
形同虚设。
例如我想得到登录账户的cookie
/files/download.php
存在反射型漏洞
与之前contact.php 页面一样
/files/list.php
list.php 也存在反射性XSS
/houtai/files/wzlist
反射性xss,原理和之前一样。不在累述
/houtai/files/softlist
反射性xss,原理和之前一样。不在累述
问题4 存储型XSS
/houtai/wzlist.php
XSS存储漏洞
后台发布文章页面 标题、作者、关键字、描述都存在存储型XSS
由于关键字、描述在主页中没有回显位,所以无法利用
未对GET输入参数进行过滤验证。
/houtai/files/editsoft.php
原理与之前一样,未对POST传入的参数验证。
问题5 任意文件下载
/files/houtai/newsoft.php
如果获取到后台权限可以通过editsoft的发布下载功能中设置该服务器的任意文件路径,可以通过前端页面进行下载。导致服务器的敏感文件泄露