Enter Search Query:

Xss – Damn Small Scanner

Xss – Damn Small Scanner
« en: Septiembre 20, 2018, 11:07:57 am »
Xss - Damn Small Scanner 1

Excelente y funcional Scanner de XSS que soporta parámetros POST y GET. Esta escrito enPython y no tiene más de 100 lineas de código.

Xss - Damn Small Scanner 2

Tiene también soporte para Proxys HTTP y se le pueden emplear algunas opciones como la de implementar User-Agent, Referer y Cookies.

Uso y Opciones:

Código: Bash
  1. $ python dsxs.py -h
  2. Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
  3.  by: Miroslav Stampar (@stamparm)
  4. Usage: dsxs.py [options]
  5. Options:
  6.   –version          show program’s version number and exit
  7.  -h, –help         show this help message and exit
  8.  -u URL, –url=URL  Target URL (e.g. «http://www.target.com/page.htm?id=1»)
  9.  –data=DATA        POST data (e.g. «query=test»)
  10.  –cookie=COOKIE    HTTP Cookie header value
  11.  –user-agent=UA    HTTP User-Agent header value
  12.  –referer=REFERER  HTTP Referer header value
  13.  –proxy=PROXY      HTTP proxy address (e.g. «http://127.0.0.1:8080»)

Ejemplo de uso:

Código: Bash
  1. $ python dsxs.py -u «http://testphp.vulnweb.com/search.php?test=query» –data=»s
  2. earchFor=foobar»
  3. Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
  4.  by: Miroslav Stampar (@stamparm)
  5. * scanning GET parameter ‘test’
  6. * scanning POST parameter ‘searchFor’
  7.  (i) POST parameter ‘searchFor’ appears to be XSS vulnerable («>.xss.<«, outside
  8.  of tags, no filtering)
  9. scan results: possible vulnerabilities found
Código: Bash
  1. $ python dsxs.py -u «http://public-firing-range.appspot.com/address/location.has
  2. h/replace»
  3. Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code) #v0.2d
  4.  by: Miroslav Stampar (@stamparm)
  5.  (i) page itself appears to be XSS vulnerable (DOM)
  6.   (o) …<script>
  7.       var payload = window.location.hash.substr(1);location.replace(payload);
  8.     </script>…
  9.  (x) no usable GET/POST parameters found
  10. scan results: possible vulnerabilities found

Requerimientos:

– Python 2.6.x o 2.7.x

SRC:

Código: Python
  1. #!/usr/bin/env python
  2. import cookielib, optparse, random, re, string, urllib, urllib2, urlparse
  3. NAME, VERSION, AUTHOR, LICENSE = «Damn Small XSS Scanner (DSXS) < 100 LoC (Lines of Code)», «0.2h», «Miroslav Stampar (@stamparm)», «Public domain (FREE)»
  4. SMALLER_CHAR_POOL    = (‘<‘, ‘>’)                                                           # characters used for XSS tampering of parameter values (smaller set – for avoiding possible SQLi errors)
  5. LARGER_CHAR_POOL     = (‘\», ‘»‘, ‘>’, ‘<‘, ‘;’)                                           # characters used for XSS tampering of parameter values (larger set)
  6. GET, POST            = «GET», «POST»                                                        # enumerator-like values used for marking current phase
  7. PREFIX_SUFFIX_LENGTH = 5                                                                    # length of random prefix/suffix used in XSS tampering
  8. COOKIE, UA, REFERER = «Cookie», «User-Agent», «Referer»                                     # optional HTTP header names
  9. TIMEOUT = 30                                                                                # connection timeout in seconds
  10. DOM_FILTER_REGEX = r»(?s)<!–.*?–>|\bescape\([^)]+\)|\([^)]+==[^(]+\)|\»[^\»]+\»|'[^’]+'»  # filtering regex used before DOM XSS search
  11. REGULAR_PATTERNS = (                                                                        # each (regular pattern) item consists of (r»context regex», (prerequisite unfiltered characters), «info text», r»content removal regex»)
  12.     (r»\A[^<>]*%(chars)s[^<>]*\Z», (‘<‘, ‘>’), «\».xss.\», pure text response, %(filtering)s filtering», None),
  13.     (r»<!–[^>]*%(chars)s|%(chars)s[^<]*–>», (‘<‘, ‘>’), «\»<!–.’.xss.’.–>\», inside the comment, %(filtering)s filtering», None),
  14.     (r»(?s)<script[^>]*>[^<]*?'[^<‘]*%(chars)s|%(chars)s[^<‘]*'[^<]*</script>», (‘\», ‘;’), «\»<script>.’.xss.’.</script>\», enclosed by <script> tags, inside single-quotes, %(filtering)s filtering», r»\\'»),
  15.     (r'(?s)<script[^>]*>[^<]*?»[^<«]*%(chars)s|%(chars)s[^<«]*»[^<]*</script>’, (‘»‘, ‘;’), «‘<script>.\».xss.\».</script>’, enclosed by <script> tags, inside double-quotes, %(filtering)s filtering», r’\\»‘),
  16.     (r»(?s)<script[^>]*>[^<]*?%(chars)s|%(chars)s[^<]*</script>», (‘;’,), «\»<script>.xss.</script>\», enclosed by <script> tags, %(filtering)s filtering», None),
  17.     (r»>[^<]*%(chars)s[^<]*(<|\Z)», (‘<‘, ‘>’), «\»>.xss.<\», outside of tags, %(filtering)s filtering», r»(?s)<script.+?</script>|<!–.*?–>»),
  18.     (r»<[^>]*=\s*'[^>’]*%(chars)s[^>’]*'[^>]*>», (‘\»,), «\»<.’.xss.’.>\», inside the tag, inside single-quotes, %(filtering)s filtering», r»(?s)<script.+?</script>|<!–.*?–>|\\»),
  19.     (r'<[^>]*=\s*»[^>»]*%(chars)s[^>»]*»[^>]*>’, (‘»‘,), «‘<.\».xss.\».>’, inside the tag, inside double-quotes, %(filtering)s filtering», r»(?s)<script.+?</script>|<!–.*?–>|\\»),
  20.     (r»<[^>]*%(chars)s[^>]*>», (), «\»<.xss.>\», inside the tag, outside of quotes, %(filtering)s filtering», r»(?s)<script.+?</script>|<!–.*?–>|=\s*'[^’]*’|=\s*\»[^\»]*\»»),
  21. )
  22. DOM_PATTERNS = (                                                                            # each (dom pattern) item consists of r»recognition regex»
  23.     r»(?s)<script[^>]*>[^<]*?(var|\n)\s*(\w+)\s*=[^;]*(document\.(location|URL|documentURI)|location\.(href|search)|window\.location)[^;]*;[^<]*(document\.write(ln)?\(|\.innerHTML\s*=|eval\(|setTimeout\(|setInterval\(|location\.(replace|assign)\(|setAttribute\()[^;]*\2.*?</script>»,
  24.     r»(?s)<script[^>]*>[^<]*?(document\.write\(|\.innerHTML\s*=|eval\(|setTimeout\(|setInterval\(|location\.(replace|assign)\(|setAttribute\()[^;]*(document\.(location|URL|documentURI)|location\.(href|search)|window\.location).*?</script>»,
  25. )
  26. _headers = {}                                                                               # used for storing dictionary with optional header values
  27. def _retrieve_content(url, data=None):
  28.     try:
  29.         req = urllib2.Request(«».join(url[i].replace(‘ ‘, «%20») if i > url.find(‘?’) else url[i] for i in xrange(len(url))), data, _headers)
  30.         retval = urllib2.urlopen(req, timeout=TIMEOUT).read()
  31.     except Exception, ex:
  32.         retval = ex.read() if hasattr(ex, «read») else getattr(ex, «msg», str())
  33.     return retval or «»
  34. def _contains(content, chars):
  35.     content = re.sub(r»\\[%s]» % re.escape(«».join(chars)), «», content) if chars else content
  36.     return all(char in content for char in chars)
  37. def scan_page(url, data=None):
  38.     retval, usable = False, False
  39.     url, data = re.sub(r»=(&|\Z)», «=1\g<1>», url) if url else url, re.sub(r»=(&|\Z)», «=1\g<1>», data) if data else data
  40.     original = re.sub(DOM_FILTER_REGEX, «», _retrieve_content(url, data))
  41.     dom = max(re.search(_, original) for _ in DOM_PATTERNS)
  42.     if dom:
  43.         print » (i) page itself appears to be XSS vulnerable (DOM)»
  44.         print »  (o) …%s…» % dom.group(0)
  45.         retval = True
  46.     try:
  47.         for phase in (GET, POST):
  48.             current = url if phase is GET else (data or «»)
  49.             for match in re.finditer(r»((\A|[?&])(?P<parameter>[\w\[\]]+)=)(?P<value>[^&#38;#]*)», current):
  50.                 found, usable = False, True
  51.                 print «* scanning %s parameter ‘%s'» % (phase, match.group(«parameter»))
  52.                 prefix, suffix = («».join(random.sample(string.ascii_lowercase, PREFIX_SUFFIX_LENGTH)) for i in xrange(2))
  53.                 for pool in (LARGER_CHAR_POOL, SMALLER_CHAR_POOL):
  54.                     if not found:
  55.                         tampered = current.replace(match.group(0), «%s%s» % (match.group(0), urllib.quote(«%s%s%s%s» % («‘» if pool == LARGER_CHAR_POOL else «», prefix, «».join(random.sample(pool, len(pool))), suffix))))
  56.                         content = (_retrieve_content(tampered, data) if phase is GET else _retrieve_content(url, tampered)).replace(«%s%s» % («‘» if pool == LARGER_CHAR_POOL else «», prefix), prefix)
  57.                         for regex, condition, info, content_removal_regex in REGULAR_PATTERNS:
  58.                             filtered = re.sub(content_removal_regex or «», «», content)
  59.                             for sample in re.finditer(«%s([^ ]+?)%s» % (prefix, suffix), filtered, re.I):
  60.                                 context = re.search(regex % {«chars»: re.escape(sample.group(0))}, filtered, re.I)
  61.                                 if context and not found and sample.group(1).strip():
  62.                                     if _contains(sample.group(1), condition):
  63.                                         print » (i) %s parameter ‘%s’ appears to be XSS vulnerable (%s)» % (phase, match.group(«parameter»), info % dict(((«filtering», «no» if all(char in sample.group(1) for char in LARGER_CHAR_POOL) else «some»),)))
  64.                                         found = retval = True
  65.                                     break
  66.         if not usable:
  67.             print » (x) no usable GET/POST parameters found»
  68.     except KeyboardInterrupt:
  69.         print «\r (x) Ctrl-C pressed»
  70.     return retval
  71. def init_options(proxy=None, cookie=None, ua=None, referer=None):
  72.     global _headers
  73.     _headers = dict(filter(lambda _: _[1], ((COOKIE, cookie), (UA, ua or NAME), (REFERER, referer))))
  74.     urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler({‘http’: proxy})) if proxy else None)
  75. if __name__ == «__main__»:
  76.     print «%s #v%s\n by: %s\n» % (NAME, VERSION, AUTHOR)
  77.     parser = optparse.OptionParser(version=VERSION)
  78.     parser.add_option(«-u», «–url», dest=»url», help=»Target URL (e.g. \»http://www.target.com/page.php?id=1\»)»)
  79.     parser.add_option(«–data», dest=»data», help=»POST data (e.g. \»query=test\»)»)
  80.     parser.add_option(«–cookie», dest=»cookie», help=»HTTP Cookie header value»)
  81.     parser.add_option(«–user-agent», dest=»ua», help=»HTTP User-Agent header value»)
  82.     parser.add_option(«–referer», dest=»referer», help=»HTTP Referer header value»)
  83.     parser.add_option(«–proxy», dest=»proxy», help=»HTTP proxy address (e.g. \»http://127.0.0.1:8080\»)»)
  84.     options, _ = parser.parse_args()
  85.     if options.url:
  86.         init_options(options.proxy, options.cookie, options.ua, options.referer)
  87.         result = scan_page(options.url if options.url.startswith(«http») else «http://%s» % options.url, options.data)
  88.         print «\nscan results: %s vulnerabilities found» % («possible» if result else «no»)
  89.     else:
  90. parser.print_help()

Repo: https://github.com/stamparm/DSXS

https://underc0de.org/foro/seguridad-en-servidores/damn-small-xss-scanner/

Comentarios

Comentarios

24 marzo, 2020

Related Posts

No posts were found for display

0 comentarios

Comentarios en: Xss – Damn Small Scanner

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *