环境说明:
系统:Windows 10
集成环境:phpstudy
php版本:7.3.4
mysql版本:5.7.25
cms版本:7.7.4
前言
现在cms一般都是基于MVC思想去开发,所以在审计这个cms时我是直接从控制器开始看的,thinkphp与laravel等开发框架会把控制器放在controller目录,这个cms的控制器是在lib目录。
目录结构
cmseasy/
|-- admin
|-- api
|-- apps
|-- cache
|-- cn
|-- common
|-- config
|-- data
|-- en
|-- html
|-- images
|-- install
|-- jp
|-- lang
|-- lib
|-- license
|-- readme
|-- sitemap
|-- sk
|-- template
|-- template_admin
|-- ueditor
|-- wap
`-- webscan360
开始审计
1.SQL注入
1.在文件lib/admin/database_admin.php的dorestore_action()方法接收到GET参数db_dir后会使用front::scan($dir)函数获取该目录下的文件名,然后将目录名与文件名传递给 tdatabase::getInstance()->restoreTables()函数,跟进该函数。
2.在文件lib/table/tdatabase.php的restoreTables函数可以看到,file_get_contents()函数读取文件内容后进行了字符替换与字符分割,文件内容被赋值给变量$sqls,然后赋值给$q,最终传递到$this->query()函数执行,继续跟进该函数。
3.在文件lib/inc/table.php的query函数,$sql语句被传递给了 $this->db->query() 函数。
4.在文件lib/inc/dbmysqli.php的query函数,$sql 被传递给 $this->mysqli->query() 函数执行了,而在这个文件中可以看到 $this->mysqli 是mysqli 类实例化的对象。一路跟下来从文件读取内容到被执行SQL语句没有做任何安全处理。
5.从以上代码分析可知该SQL注入需要配合文件上传。
6.首先上传一个文件,该文件写入 sql 语句,注意这个文件需要是目录下的第一个文件,否则sql语句可能会查询失败。
将静态文件目录设置为 /,点击保存。这样可以保证目录下的第一个文件就是我们上传的。
上传文件使用 burpsuite 抓包将内容修改为sql注入语句。
7.触发SQL注入漏洞,这里其实也存在文件读取漏洞。
2.任意文件写入getshell
1.在文件lib/admin/table_admin.php的edit_action() 函数下,存在 file_put_contents 函数进行写入操作,文件名后缀默认为 php,POST的所有内容会在序列化之后放到 $tag_config 变量,最后执行 file_put_contents 将$tag_config 变量内容写入 php 文件。虽然 POST 的内容有被过滤,但是 POST 的参数名没被过滤,也就是说我们可以通过参数名写入 webshell。
2.发送构造好的请求包写入 webshell,没有回显但是没有关系文件名是可预判的。
3.访问webshell
总结
SQL注入:从文件中获取SQL语句,如果文件名与内容可控那么就可能存在SQL注入。
任意文件写入getshell:虽然POST参数的值有被过滤,但是由于使用了序列化函数导致仍然可以通过参数名写入恶意代码。