【安全漏洞】Easy代码审计

391 阅读2分钟

环境说明:

系统: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,然后赋值给sqls,然后赋值给q,最终传递到$this->query()函数执行,继续跟进该函数。

3.在文件lib/inc/table.php的query函数,sql语句被传递给了sql语句被传递给了this->db->query() 函数。

4.在文件lib/inc/dbmysqli.php的query函数,sql被传递给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的所有内容会在序列化之后放到 tagconfig变量,最后执行fileputcontents将tagconfig变量,最后执行fileputcontents将tag_config 变量内容写入 php 文件。虽然 POST 的内容有被过滤,但是 POST 的参数名没被过滤,也就是说我们可以通过参数名写入 webshell。

2.发送构造好的请求包写入 webshell,没有回显但是没有关系文件名是可预判的。

3.访问webshell

总结

SQL注入:从文件中获取SQL语句,如果文件名与内容可控那么就可能存在SQL注入。
任意文件写入getshell:虽然POST参数的值有被过滤,但是由于使用了序列化函数导致仍然可以通过参数名写入恶意代码。

最后

关注我-持续更新······

私我获取【网络安全学习资料·攻略