<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6939273544240553551</id><updated>2024-09-14T14:26:01.753+03:00</updated><category term="scanner"/><category term="web application security"/><category term="crawler"/><category term="dns"/><category term="google"/><category term="information gathering"/><category term="cookie"/><category term="fingerprinting"/><category term="technology detection"/><category term="web server"/><title type='text'>Automated Scanning</title><subtitle type='html'>A blog on security scan automation, web security scanner development, web application security and penetration testing.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-934262360024619965</id><published>2009-11-04T14:03:00.005+02:00</published><updated>2011-10-15T17:16:55.646+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fingerprinting"/><category scheme="http://www.blogger.com/atom/ns#" term="scanner"/><category scheme="http://www.blogger.com/atom/ns#" term="technology detection"/><category scheme="http://www.blogger.com/atom/ns#" term="web application security"/><category scheme="http://www.blogger.com/atom/ns#" term="web server"/><title type='text'>Web server technology detection by using known filetypes</title><content type='html'>Web servers use server-side scripting engines to support web applications. Using the web server configuration, dynamic pages are identified by filename extensions and processed by their relevant processors.&lt;br /&gt;&lt;br /&gt;Below is an example of IIS 6.0 application configuration. As you can see, asp files are processed by asp.dll and php files are processed by php-cgi application. Other web servers also use similar methods.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijWLC_o6lBnyxhlsxsN3s4HZfTl2-evRYSw2iB8jGY7shXBqqGQAkwQP9Wa3yZB8267uQud4Y0DWlJjtJFRR3lnrpx0BD5hLcSelSm-6XeONu4yNoT8-xzUY0HzXR_oZlUG920i4QxgDkF/s1600-h/IIS+6+application+configuration.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 290px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijWLC_o6lBnyxhlsxsN3s4HZfTl2-evRYSw2iB8jGY7shXBqqGQAkwQP9Wa3yZB8267uQud4Y0DWlJjtJFRR3lnrpx0BD5hLcSelSm-6XeONu4yNoT8-xzUY0HzXR_oZlUG920i4QxgDkF/s320/IIS+6+application+configuration.png&quot; alt=&quot;IIS 6 application configuration&quot; id=&quot;BLOGGER_PHOTO_ID_5400218551569621506&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;In some situations, web servers respond differently to nonexistent files with known extensions. Sending requests to random filenames with known extensions and comparing the HTTP response results may reveal the server-side scripting technologies supported by the web server.&lt;br /&gt;&lt;br /&gt;While scanning customer networks, I saw that various web servers can respond differently to many known extensions including asp, aspx, cfm, php, jsp, shtml.  Also additional vulnerabilities can be found in these responses, including Internal IP address disclosure, application errors etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can see some real life examples below. We will send a simple request to nonexistent asp, html, and php files. Then compare the responses. These tests will be made to the root directory, but you should also notice that some special subdirectories’ configuration might be different.&lt;br /&gt;&lt;br /&gt;$ nc www.baidu.com 80&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: www.baidu.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 302 Found&lt;br /&gt;Date: Sat, 31 Oct 2009 15:19:34 GMT&lt;br /&gt;Server: Apache/1.3.27&lt;br /&gt;Location: http://www.baidu.com/search/error.html&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl.html HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: www.baidu.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 302 Found&lt;br /&gt;Date: Sat, 31 Oct 2009 15:19:50 GMT&lt;br /&gt;Server: Apache/1.3.27&lt;br /&gt;Location: http://www.baidu.com/search/error.html&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl.asp HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: www.baidu.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 302 Found&lt;br /&gt;Date: Sat, 31 Oct 2009 15:20:00 GMT&lt;br /&gt;Server: Apache/1.3.27&lt;br /&gt;Location: http://www.baidu.com/search/error.html&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl.php HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: www.baidu.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 302 Found&lt;br /&gt;Date: Sat, 31 Oct 2009 15:20:22 GMT&lt;br /&gt;Server: Apache/1.3.27&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;Location: http://www.baidu.com/forbiddenip/forbidden.html&lt;/span&gt;&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As you can clearly see, the web server responds to nonexisting files as 302 found message and redirects us to /search/error.html. But when it comes to PHP files, we see a redirection to /forbiddenip/forbidden.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Below is another example.&lt;br /&gt;&lt;br /&gt;$ nc wiki.nginx.org 80&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: wiki.nginx.org&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 404&lt;br /&gt;Server: nginx/0.8.21&lt;br /&gt;Date: Sat, 31 Oct 2009 15:26:10 GMT&lt;br /&gt;Content-Type: text/html; charset=utf-8&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Connection: keep-alive&lt;br /&gt;X-Powered-By: PHP/5.1.6&lt;br /&gt;Content-language: en&lt;br /&gt;Vary: Accept-Encoding, Cookie&lt;br /&gt;X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikidbToken;string-contains=wikidbLoggedOut;string-contains=wikidb_session&lt;br /&gt;Expires: Thu, 01 Jan 1970 00:00:00 GMT&lt;br /&gt;Cache-Control: private, must-revalidate, max-age=0&lt;br /&gt;&lt;br /&gt;2e8c&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ nc wiki.nginx.org 80&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl.asp HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: wiki.nginx.org&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 404&lt;br /&gt;Server: nginx/0.8.21&lt;br /&gt;Date: Sat, 31 Oct 2009 15:26:44 GMT&lt;br /&gt;Content-Type: text/html; charset=utf-8&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Connection: keep-alive&lt;br /&gt;X-Powered-By: PHP/5.1.6&lt;br /&gt;Content-language: en&lt;br /&gt;Vary: Accept-Encoding, Cookie&lt;br /&gt;X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikidbToken;string-contains=wikidbLoggedOut;string-contains=wikidb_session&lt;br /&gt;Expires: Thu, 01 Jan 1970 00:00:00 GMT&lt;br /&gt;Cache-Control: private, must-revalidate, max-age=0&lt;br /&gt;&lt;br /&gt;2eec&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;GET /CsARl9W0s9esF7Vl.php HTTP/1.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host: wiki.nginx.org&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HTTP/1.1 404&lt;br /&gt;Server: nginx/0.8.21&lt;br /&gt;Date: Sat, 31 Oct 2009 15:27:15 GMT&lt;br /&gt;Content-Type: text/html; charset=utf-8&lt;br /&gt;Transfer-Encoding: chunked&lt;br /&gt;Connection: keep-alive&lt;br /&gt;X-Powered-By: PHP/5.1.6&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;19&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;No input file specified.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Website responds differently to nonexistent php files. So, X-Powered-By PHP header seems valid. Since URL rewriting is in place, we can clearly verify that the wiki application used by nginx is written in PHP (It is actually MediaWiki).&lt;br /&gt;&lt;br /&gt;I call this method as technology detection by using known filetypes. Using this method in addition to other fingerprinting techniques, such as HTTP response banner grabbing, is useful to improve web security scanners.&lt;br /&gt;&lt;br /&gt;I previously implemented this in Arachne, a simple web security scanner that I developed for my MSc thesis back in 2006. It sends requests to nonexistent files with known extensions, then compares the results to see if a technology is used in that web server.&lt;br /&gt;&lt;br /&gt;With technology detection by using known filetypes;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Web application scans can be optimized for detected technologies &lt;/li&gt;&lt;li&gt;Web application scanners can reduce the number of tests performed&lt;/li&gt;&lt;li&gt;Scanners can reduce false-positives for nonexistent files&lt;/li&gt;&lt;li&gt;If URL rewriting is used, this method can be used to determine used technologies in the web application&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/934262360024619965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/934262360024619965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/934262360024619965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/934262360024619965'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/11/web-server-technology-detection-by.html' title='Web server technology detection by using known filetypes'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijWLC_o6lBnyxhlsxsN3s4HZfTl2-evRYSw2iB8jGY7shXBqqGQAkwQP9Wa3yZB8267uQud4Y0DWlJjtJFRR3lnrpx0BD5hLcSelSm-6XeONu4yNoT8-xzUY0HzXR_oZlUG920i4QxgDkF/s72-c/IIS+6+application+configuration.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-2171786309765218208</id><published>2009-10-07T23:36:00.004+03:00</published><updated>2011-03-16T01:15:08.486+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dns"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="information gathering"/><title type='text'>New release - subdomainLookup - Find subdomains using Google</title><content type='html'>For those who didn&#39;t notice, there is a new version of the &lt;a href=&quot;http://automatedscanning.blogspot.com/2009/09/subdomainlookup-find-subdomains-using.html&quot;&gt;subdomainLookup&lt;/a&gt; script available, which can be downloaded from &lt;a href=&quot;http://dl.dropbox.com/u/3364236/tools/subdomainLookup.py&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This 0.4 version is fairly improved and the results really differ from the old one. Here is a comparison;&lt;br /&gt;
&lt;br /&gt;
$ subdomainLookup.py example.com&lt;br /&gt;
&lt;br /&gt;
19 subdomains found for example.com&lt;br /&gt;
&lt;br /&gt;
beta.example.com&lt;br /&gt;
bp0.example.com&lt;br /&gt;
bp1.example.com&lt;br /&gt;
bp2.example.com&lt;br /&gt;
bp3.example.com&lt;br /&gt;
buzz.example.com&lt;br /&gt;
code.example.com&lt;br /&gt;
domains.example.com&lt;br /&gt;
draft.example.com&lt;br /&gt;
m.example.com&lt;br /&gt;
partners-test.example.com&lt;br /&gt;
play.example.com&lt;br /&gt;
pro.example.com&lt;br /&gt;
pro1.example.com&lt;br /&gt;
pro2.example.com&lt;br /&gt;
status.example.com&lt;br /&gt;
wireless.example.com&lt;br /&gt;
www.example.com&lt;br /&gt;
www2.example.com&lt;br /&gt;
&lt;br /&gt;
Same output using the old one;&lt;br /&gt;
&gt; subdomainLookup-v0.2.py example.com&lt;br /&gt;
beta.example.com&lt;br /&gt;
www.example.com&lt;br /&gt;
draft.example.com&lt;br /&gt;
www2.example.com&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Warning:&lt;/span&gt; Use this script for your own domains only. By using this script, you may be violating Google&#39;s &lt;a href=&quot;http://www.google.com/terms_of_service.html&quot;&gt;terms of service&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/2171786309765218208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/2171786309765218208' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/2171786309765218208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/2171786309765218208'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/10/new-release-subdomainlookup-find.html' title='New release - subdomainLookup - Find subdomains using Google'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-8253854982332148020</id><published>2009-09-25T01:36:00.005+03:00</published><updated>2011-03-16T01:14:45.115+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dns"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="information gathering"/><title type='text'>subdomainLookup - Find subdomains using Google</title><content type='html'>subdomainLookup is a python script that uses Google search results to find subdomains of the target domain name.&lt;br /&gt;
&lt;br /&gt;
I have been using it in security assessments and it works pretty well. Essential for network mapping. Test your own domain and see the results.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Sample usage:&lt;/span&gt;&lt;br /&gt;
&amp;gt; subdomainLookup.py blogger.com&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;beta.blogger.com&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;www.blogger.com&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;draft.blogger.com&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;www2.blogger.com&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://dl.dropbox.com/u/3364236/tools/subdomainLookup.py&quot;&gt;Download subdomainLookup v0.4 from here&lt;/a&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic;&quot;&gt;* Uses main Python libraries. Tested with Python 2.5.x on Linux and Windows.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Update: &lt;/span&gt;Bedirhan sent me some patches that improve the results of the subdomainLookup v0.2 script. With some tests and additional improvements, here is the new version, 0.4 which can be downloaded from the same location.</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/8253854982332148020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/8253854982332148020' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/8253854982332148020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/8253854982332148020'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/09/subdomainlookup-find-subdomains-using.html' title='subdomainLookup - Find subdomains using Google'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-7701344558236586162</id><published>2009-07-01T13:00:00.006+03:00</published><updated>2011-10-15T17:16:55.646+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="crawler"/><category scheme="http://www.blogger.com/atom/ns#" term="scanner"/><category scheme="http://www.blogger.com/atom/ns#" term="web application security"/><title type='text'>Finding almost all URLs with least requests</title><content type='html'>&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Introduction&lt;/span&gt;&lt;br /&gt;A web crawler usually starts working on a given URL to find and visit all the links that can be followed. But a search engine crawler doesn&#39;t care much about the content it misses. While better, it is not supposed to parse all of the dynamic content.&lt;br /&gt;Thanks to &lt;a href=&quot;http://en.wikipedia.org/wiki/Search_engine_optimization&quot;&gt;SEO&lt;/a&gt;, it is now the webmaster&#39;s duty to make the site search engine friendly.&lt;br /&gt;&lt;br /&gt;The crawler part of a webapp security scanner(WASS) is very important for its success. Thus a scanner&#39;s crawler has to parse all of the dynamic content, fight with bad HTML code to find all of the pages, variables etc.&lt;br /&gt;&lt;br /&gt;Usually crawling a whole web site can take a lot of your time. Here is an overview of how we can do a Quick Scan to find remote web application/site vulnerabilities, with minimum crawler requests. This also helps us to see a quick overview of the site structure, and sometimes we can find web application vulnerabilities faster if we are doing a quick assessment in a large network.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Robots.txt - The famous Robots Exclusion Protocol&lt;/span&gt;&lt;br /&gt;If you don&#39;t know how and why a /robots.txt file is used, please read &lt;a href=&quot;http://www.robotstxt.org/robotstxt.html&quot;&gt;About /robots.txt&lt;/a&gt;.&lt;br /&gt;I think some readers skip this part: &quot;&lt;span style=&quot;font-style: italic;&quot;&gt;don&#39;t try to use /robots.txt to hide information&lt;/span&gt;&quot;&lt;br /&gt;&lt;br /&gt;If a search engine crawler wants to visit and index a website, it first accesses /robots.txt file to find the rules it should follow. If a link is forbidden, it will be excluded by the search engine crawler bot.&lt;br /&gt;&lt;br /&gt;Use these rules in your crawler to find more information, like new directories and links.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Sitemaps&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&quot;Sitemaps are an easy way for webmasters to inform search engines about pages on                 their sites that are available for crawling. In its simplest form, a Sitemap is                 an XML file that lists URLs for a site along with additional metadata about each                 URL (when it was last updated, how often it usually changes, and how important it                 is, relative to other URLs in the site) so that search engines can more intelligently                 crawl the site.&quot;&lt;/span&gt;&lt;a href=&quot;http://www.sitemaps.org/&quot;&gt;*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I love sitemaps. They allow me to find most of the links and create the directory structure of the whole web site with 2-3 web requests! Of course we have to look for more pages that don&#39;t exist in sitemaps.&lt;br /&gt;&lt;br /&gt;There are many reasons to use sitemaps. A huge website can use sitemap protocol to have search engine crawlers to index the required content only, when necessary. Also a webmaster can point out existing links that the search engine couldn&#39;t find and index.&lt;br /&gt;&lt;br /&gt;When a webmaster reads Google&#39;s FAQ for &lt;a href=&quot;http://www.google.com/support/webmasters/bin/answer.py?answer=34575&quot;&gt;Submitting a Sitemap&lt;/a&gt; they usually place their sitemap file in /sitemap.xml or /sitemap.xml.gz&lt;br /&gt;Most of the times, they also add their sitemap location to /robots.txt file.&lt;br /&gt;&lt;br /&gt;The sitemap location can be added to /robots.txt file as:&lt;br /&gt;Sitemap: http://domain.com/sitemap_location.xml&lt;br /&gt;&lt;br /&gt;Another thing related with the sitemap protocol is the &lt;a href=&quot;http://www.google.com/support/webmasters/bin/answer.py?answer=35654&quot;&gt;Sitemap index file&lt;/a&gt;. This file includes other sitemap locations of the target website.  Multiple large sitemap files can be split and listed in a sitemap index file, then submitted to search engines as a single entry.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;font-size:130%;&quot; &gt;Conclusion - How to find almost all URLs of a target website with minimum web requests?&lt;/span&gt;&lt;br /&gt;My approach for a quick scan of a standard web application is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Request and parse the URL entered by the WASS user in the scan settings (&lt;u&gt;1 request&lt;/u&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Request /robots.txt, parse and extract links, sitemap index files and sitemaps  (&lt;u&gt;1 request&lt;/u&gt;)&lt;/li&gt;&lt;li&gt;Request default sitemap and sitemap index file locations, parse and extract links out of them  (&lt;u&gt;6 requests&lt;/u&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt; - or more/less depending on your estimated default sitemap locations&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Webmasters sometimes create a site map page for visitors. Using this page a visitor can quickly access the content he is looking for. In the response page of your first request, search for links containing the word &quot;sitemap&quot; or similar, to find these pages. Access these manually created sitemap files first!  (&lt;u&gt;1 request&lt;/u&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyfZ5dMk33jQGZT3BouaMC7FSHvsZmK1oKqNE4LJ5Luu8s4f76rR40a5dFCxKfedtntqkVJoWdi9z-YliBSKfIxpc9DgRL2P1xdDSzPtlAzbT1SXf5-H9wc-hfnn3oJqieIJINKeCyFFNa/s1600-h/sitemap_html.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 189px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyfZ5dMk33jQGZT3BouaMC7FSHvsZmK1oKqNE4LJ5Luu8s4f76rR40a5dFCxKfedtntqkVJoWdi9z-YliBSKfIxpc9DgRL2P1xdDSzPtlAzbT1SXf5-H9wc-hfnn3oJqieIJINKeCyFFNa/s320/sitemap_html.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5351773411708791042&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Using this methodology in our scanners crawler component, we do less than 10 request to remote web server and can;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extract the directory/file structure of the target web server/application,&lt;/li&gt;&lt;li&gt;Possibly learn used technology based on found file extensions,&lt;/li&gt;&lt;li&gt;Find variables, if links like &quot;news.asp?id=123&quot; exist,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Find almost all URLs, even if your WASS can&#39;t parse JavaScript/Flash content!,&lt;/li&gt;&lt;li&gt;You may also find pages that we can&#39;t find during a normal crawling operation (Some webmasters misconfigure sitemap generators which lead to disclosure of sensitive files),&lt;/li&gt;&lt;li&gt;Visit these newly found URLs to find more links, variables, weaknesses etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;And more!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/7701344558236586162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/7701344558236586162' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/7701344558236586162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/7701344558236586162'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/07/finding-almost-all-urls-with-least.html' title='Finding almost all URLs with least requests'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyfZ5dMk33jQGZT3BouaMC7FSHvsZmK1oKqNE4LJ5Luu8s4f76rR40a5dFCxKfedtntqkVJoWdi9z-YliBSKfIxpc9DgRL2P1xdDSzPtlAzbT1SXf5-H9wc-hfnn3oJqieIJINKeCyFFNa/s72-c/sitemap_html.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-1712342376237206273</id><published>2009-06-24T10:02:00.003+03:00</published><updated>2011-10-15T17:16:55.647+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="crawler"/><category scheme="http://www.blogger.com/atom/ns#" term="scanner"/><category scheme="http://www.blogger.com/atom/ns#" term="web application security"/><title type='text'>Using WIVET to test your crawler</title><content type='html'>WIVET is a wonderful project for a web security scanner developer. Using WIVET, you can analyse the link extraction/crawling ability of your WASS.&lt;br /&gt;&lt;br /&gt;I recommend you to download latest version or an SVN copy to your local web server and test your scanner&#39;s crawlers performance. Also you can test your scanners javascript, flash and form parsing ability using this web application.&lt;br /&gt;&lt;br /&gt;Don&#39;t forget to exclude the offscanpages folder and the logoff link! Also your crawler should have Cookie support enabled since WIVET tracks the crawling ability via a cookie.&lt;br /&gt;&lt;br /&gt;So in order to succeed, you already should have;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cookie support&lt;/li&gt;&lt;li&gt;an exclude capability&lt;/li&gt;&lt;li&gt;javascript support (to compete with other commercial scanners)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;flash support  (to compete with other commercial scanners)&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;http://code.google.com/p/wivet/&quot;&gt;Project home&lt;/a&gt;&lt;br /&gt;And &lt;a href=&quot;http://code.google.com/p/wivet/wiki/CurrentResults&quot;&gt;here&lt;/a&gt; is the latest coverage results of some commercial scanners tested by WIVET author. Have fun!</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/1712342376237206273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/1712342376237206273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/1712342376237206273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/1712342376237206273'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/06/using-wivet-to-test-your-crawler.html' title='Using WIVET to test your crawler'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6939273544240553551.post-5437104508189609175</id><published>2009-06-19T01:10:00.005+03:00</published><updated>2011-10-15T17:16:55.647+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cookie"/><category scheme="http://www.blogger.com/atom/ns#" term="scanner"/><category scheme="http://www.blogger.com/atom/ns#" term="web application security"/><title type='text'>Detecting new URLs by disabling cookie support</title><content type='html'>An article for web application security scanner (WASS) developers.&lt;br /&gt;&lt;br /&gt;You probably want to find every page in a web application. What if their smart web developer built a vulnerable, &quot;cookie support in your browser is disabled&quot; page for website users? Can your scanner find that page?&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJ8xXSXrQO2dHUJDuuJsxnvb49OUhkHFCAWR-LFQVQ-H-QVxKQtLkp-VjxXbvPoIdLTBk8Mh-Qljos8csH7QQMTCdmxVjrQiBi2oMcI604qqS3TUh-rEvWZd5LF9a_6qAcIrr9bJciS13/s1600-h/cookies_disabled.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 250px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJ8xXSXrQO2dHUJDuuJsxnvb49OUhkHFCAWR-LFQVQ-H-QVxKQtLkp-VjxXbvPoIdLTBk8Mh-Qljos8csH7QQMTCdmxVjrQiBi2oMcI604qqS3TUh-rEvWZd5LF9a_6qAcIrr9bJciS13/s320/cookies_disabled.png&quot; alt=&quot;Sample Cookies disabled error page&quot; id=&quot;BLOGGER_PHOTO_ID_5348801866336102690&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Let&#39;s think like a web developer. How can I detect if a user&#39;s browser accepts cookies? I think the best way[1] is to set a temporary cookie while redirecting them to a controller page. This page then should check if our previously set temporary cookie was sent during client&#39;s new request.&lt;br /&gt;&lt;br /&gt;A WASS can find this page. Here is a way of doing this;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;While crawling with cookie support, remember all pages which set cookies and redirect at the same time. We can create a NoCookieQueue for this operation. BTW, Cookies are set using &quot;Set-Cookie&quot; response header and redirection is made using a &quot;Location&quot; header during a &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection&quot;&gt;3xx HTTP response&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;After crawling phase is complete, if NoCookieQueue  is not empty, our scanner should disable cookie support in its crawler module and re-visit those pages in NoCookieQueue. This way we can see if those pages redirect to another location that don&#39;t exist in our scanners&#39; complete or error queues.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Now your WASS can find new pages or test parameters which a cookieless client should see. While these cookie error pages are mostly static, you might find a vulnerable dynamic page, another directory on server, or an HTML comment with sensitive information etc.&lt;br /&gt;&lt;br /&gt;_____&lt;br /&gt;[1] A second method is to set a cookie, and then, using JavaScript check if that cookie was set (If doesn&#39;t, redirect client to cookie error page). But these &quot;no cookie pages&quot; can also be found with a JavaScript parser in our WASS.</content><link rel='replies' type='application/atom+xml' href='http://automatedscanning.blogspot.com/feeds/5437104508189609175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6939273544240553551/5437104508189609175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/5437104508189609175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6939273544240553551/posts/default/5437104508189609175'/><link rel='alternate' type='text/html' href='http://automatedscanning.blogspot.com/2009/06/detecting-new-urls-by-disabling-cookie.html' title='Detecting new URLs by disabling cookie support'/><author><name>Sertan Kolat</name><uri>http://www.blogger.com/profile/11030076910266860522</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VPWHCYWF5SgCqEYCaRYmRN12privkPLrQbWI0OkbnIhV6yI7fa-JHypIHxtGXoDn-dufPZHVGlc7Djgnky-WCZgqRzipMtIFpyvc9Cr2o_fnlGdnk_X16Yj2o_fwCA/s220/Sertan_public.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWJ8xXSXrQO2dHUJDuuJsxnvb49OUhkHFCAWR-LFQVQ-H-QVxKQtLkp-VjxXbvPoIdLTBk8Mh-Qljos8csH7QQMTCdmxVjrQiBi2oMcI604qqS3TUh-rEvWZd5LF9a_6qAcIrr9bJciS13/s72-c/cookies_disabled.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>