Nicolas,

On Fri, Mar 13, 2009 at 6:56 PM, Nicolas Rotta <nicolasro...@gmail.com> wrote:
> List,
>        I've been working on this plug-in and it is now ready for your
> testing and comments.

    Thank you very much for your contribution, the plugin looks
*really* nice. Here are some comments:

- The plugin worked, but it had a bug, where it flagged something as
existant, when it really was not. So I added a 404 check:

            if relative_distance( response.getBody(),
original_response.getBody() ) < 0.70\
            and not self.is404( response ):

- I created a test script for the plugin (test scripts are located in
"scripts/"), to test the plugin against our test environment which is
available here [0]. If you are interested, I can send you a virtual
machine, with the test environment setup ready to run.

   The version I modified of slash.py is attached, together with the
"script-slash.w3af" file. Please review my changes, and commit these
two files to the SVN.

> It is my first contribution to the project, so don't
> be so harsh on me.

    We aren't harsh, we just try to keep high standards =)

> Please, pay special attention to the relative_distance
> function usage.

    The relative_distance method sucks, I'll replace it's name and
usage by something more meaningful like "are_different()".

    Regarding the next task, if you have any doubts, just start a new
thread right here :)

[0] https://w3af.svn.sourceforge.net/svnroot/w3af/extras/testEnv/

Cheers,
>
> Cheers,
> Nicolas Rotta
>
> ------------------------------------------------------------------------------
> Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
> powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
> easily build your RIAs with Flex Builder, the Eclipse(TM)based development
> software that enables intelligent coding and step-through debugging.
> Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
> _______________________________________________
> W3af-develop mailing list
> W3af-develop@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/w3af-develop
>
>



-- 
Andrés Riancho
http://www.bonsai-sec.com/
http://w3af.sourceforge.net/
'''
slash.py

Copyright 2006 Andres Riancho

This file is part of w3af, w3af.sourceforge.net .

w3af is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.

w3af is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with w3af; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

'''

import core.controllers.outputManager as om

# options
from core.data.options.option import option
from core.data.options.optionList import optionList

import core.data.kb.knowledgeBase as kb

from core.controllers.basePlugin.baseDiscoveryPlugin import baseDiscoveryPlugin
from core.controllers.w3afException import w3afException
from core.controllers.misc.levenshtein import relative_distance

from core.data.db.temp_persist import disk_list


class slash( baseDiscoveryPlugin ):
    '''
    Identify if the resource http://host.tld/spam/ and http://host.tld/spam are the same.
    
    @author: Nicolas Rotta ( nicolas.ro...@gmail.com )  
    '''
    
    def __init__( self ):
        baseDiscoveryPlugin.__init__( self )
        self._already_visited = disk_list()
        
    def discover( self, fuzzableRequest ):
        '''
        Generates a new URL by adding or substracting the '/' character.      
        @parameter fuzzableRequest: A fuzzableRequest instance that contains (among other things) the URL to test.
        '''     
        self._fuzzableRequests = []
        self.is404 = kb.kb.getData( 'error404page', '404' )
        
        url = fuzzableRequest.getURL()
        if url not in self._already_visited:
            self._already_visited.append( url )

            om.out.debug( 'slash plugin is testing: "' + fuzzableRequest.getURI() + '".' )
            
            fr = self._get_fuzzed_request( fuzzableRequest )
            original_response = self._urlOpener.GET( fuzzableRequest.getURL(), useCache = True )
                  
            targs = ( fr, original_response )
            self._tm.startFunction( target = self._do_request, args = targs , ownerObj = self )
           
            self._tm.join( self )
            self._already_visited.append( fr.getURI() )
                
        return self._fuzzableRequests

    def _get_fuzzed_request( self, fuzzableRequest ):
        '''
        Generate a new Url by adding or substracting the '/' character.
        @param fuzzableRequest: The original fuzzableRequest
        @return: The modified fuzzableRequest.
        '''
        fr = fuzzableRequest.copy()
        
        if ( fuzzableRequest.getURL().endswith( '/' ) ):
            fr.setURL( fuzzableRequest.getURL().rstrip( '/' ) )
        else:    
            fr.setURL( fuzzableRequest.getURL() + '/' )
            
        return fr
        
    def _do_request( self, fuzzableRequest, original_response ):
        '''
        Sends the request.
        @parameter fuzzableRequest: The fuzzable request object to modify.
        @parameter original_response: The response for the original request that was sent.
        '''
        try:
            response = self._urlOpener.GET( fuzzableRequest.getURI(), useCache = True )                                                           
        except KeyboardInterrupt, e:
            raise e
        else:
            if relative_distance( response.getBody(), original_response.getBody() ) < 0.70\
            and not self.is404( response ):
                self._fuzzableRequests.extend( self._createFuzzableRequests( response ) )
                om.out.debug( 'slash plugin found new URI: "' + fuzzableRequest.getURI() + '".' )
        
    def getOptions( self ):
        '''
        @return: A list of option objects for this plugin.
        '''
        ol = optionList()
        return ol
        
    def setOptions( self, OptionList ):
        '''
        This method sets all the options that are configured using the user interface 
        generated by the framework using the result of getOptions().
        
        @parameter OptionList: A dictionary with the options for the plugin.
        @return: No value is returned.
        ''' 
        pass
    
    def getPluginDeps( self ):
        '''
        @return: A list with the names of the plugins that should be runned before the
        current one.
        '''
        return []
    
    def getLongDesc( self ):
        '''
        @return: A DETAILED description of the plugin functions and features.
        '''
        return '''
        Identify if the resource http://host.tld/spam/ and http://host.tld/spam are the same.      
        '''

Attachment: script-slash.w3af
Description: Binary data

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
W3af-develop mailing list
W3af-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/w3af-develop

Reply via email to