Copying sources and texts (also in parts) for publishing without our permission is NOT ALLOWED. We are fed up with finding our work on other sites (like stackoverflow).
Das Kopieren von Quellcode und Texten (auch in Auszügen) ist nicht erlaubt. Wir haben es gründlich satt, unsere Arbeit auf anderen Webseiten zu finden.

Copying for non-public usage is allowed.           Das private Kopieren und Benutzen ist natürlich erlaubt und erwünscht.
28. Jun 2009
Teaser

Linux: C Programm compilieren (gcc)

Um auf einem Linuxsystem ein C-Programm compilieren zu können, muss eine C Umgebung installiert sein. Der C Compiler (= der Übersetzer des C Sourcecodes in ein Maschinenproramm) heißt z.Bsp. “gcc”.

Eine erste Hilfe für das Compilieren soll Ihnen der folgende Befehl geben:

gcc -O3 -o poc poc.c

Bitte lesen Sie die Handbücher und Tipps bzgl. gcc. Es gibt sehr viele Optionen / Parameter mit noch mehr Kombinationen und Auswirkunken. Diese hier aufzuführen würden den Rahmen und die Aktualität sprengen.

28. Jun 2009
Teaser

WordPress: Thinkbox in Version 2.8

Wenn Sie Ihre WordPress Installation auf Version 2.8 updaten, dann wird die ThinkBox Komponente teilweise fehlerhaft bzw. garnicht mehr funktionieren.

Die Bilder werden nircht mehr als Popup (ThinkBox / ) Fenster angezeigt, sondern “normal” als Bild im Browser.

Ändern Sie WordPress wir folgt um dieses Probelm zu beheben:

  • Öffnen Sie die Datei “/wp-includes/general-template.php”
  • Suchen Sie die Zeile “function add_thickbox() {” recht weit am Ende der Datei
  • Kommentieren Sie die folgende Zeile aus indem Sie zwei “/” Zeichen an den Anfang der Zeile setzen:
    wp_enqueue_script( 'thickbox' );

    Wird zu

    // wp_enqueue_script( 'thickbox' );
  • Fügen Sie die folgenden Zeilen direkt unterhalb der auskommentierten Zeile ein:
    global $wp_version;
      if ($wp_version == '2.8') {
        wp_enqueue_script('thickbox28','/wp-includes/js/thickbox/thickbox.js', array('jquery'));
      } else {
        wp_enqueue_script('thickbox');
      }
  • Speichern Sie die Datei auf ihrem WebServer und Ihre ThinkBox Anzeige wird wieder funktionieren.
    Beispiel: http://www.malte-retzlaff.de/photos/hamburg-harley-days-2009/
25. Jun 2009
Teaser

mySQL: Alten MD5 Hash in C# berechnen (16 stellig)

Die mySQL Versionen vor V4.1 nutzen einen veralteten MD5 Hash-Algorithmus. Dieser lieferte nur einen max. 16 stelligen Hashwert und ist weiterhin unsicher und teilweise decodierbar. Zwar gilt für MD5 aufgrund seines Algorithmusses grundsätzlich, dass diese Hashwerte nicht “decodiert” werden können – für den alten MD5/16 Code gilt dies’ jedoch nicht eingeschränkt. Aufgrund des häufigen Anfragen für eine einfache Berechnung dieses MD5/16 Hash haben wir Ihnen den C# Sourcecode zur Verfügung gestellt. Diese liefert Ihnen für ein Passwort (= Parameter) den MD5/16 Hash:

Aktueller Hinweis vom 03.06.2017:

Es ist zum Kotzen, dass man hier seine eigene Arbeit präsentiert und diese dann rotzfrech z.Bsp. zu Stackoverflow kopiert wird. Urheberrecht (Copyright) scheint für viele ein Fremdwort zu sein.

An alle Kopierer: Wundert ihr Euch wirklich, dass gute Entwickler mehr und mehr ihren Source Code verschlüsseln und immer weniger helfen !?

Anstall Stackoverflow meine Arbeit schützt, werde ich aufgefordert (Quelle: http://stackexchange.com/legal/terms-of-service#ReportingCopyrightInfringements), noch weitere Datenschutzrelevante Daten zu präsentieren. Geht’s dann noch !?

Wenn meine Ausdruckweise den einen oder anderen stört, dann ist das schade – würden sich mehr Nutzer für den Schutz des geistigen Eigentums stark machen, dann müsste ich mich nicht so häufig ärgern. Die Folge ist, dass ich irgendwann solche Seiten mit kostenfreier Hilfe und Tips einfach schließe, denn auf Ärger “für nothing” habe ich einfach keine Lust.

namespace ConsoleApplication
{
    class Program
    {
        static string mysql_old_password(string sPassword)
        {
            UInt32[] result = new UInt32[2];
            bool bDebug = false;
            UInt32 nr = (UInt32)1345345333, add = (UInt32)7, nr2 = (UInt32)0x12345671;
            UInt32 tmp;

            char [] password = sPassword.ToCharArray();
            int i;

            for (i = 0; i < sPassword.Length; i++)
            {
                if (password[i] == ' ' || password[i] == '\t')
                    continue;

                tmp = (UInt32)password[i];
                nr ^= (((nr & 63) + add) * tmp) + (nr << 8);
                nr2 += (nr2 << 8 ) ^ nr;
                add += tmp;
            }

            result[0] = nr & (((UInt32)1 << 31) - (UInt32)1);
            UInt32 val = (((UInt32)1 << 31) - (UInt32)1);
            result[1] = nr2 & val;
            string hash = String.Format("{0:X}{1:X}", result[0], result[1]);
            return hash.ToLower();
        }

        static void Main(string[] args)
        {
            string hash = mysql_old_password("Hier Ihr Passwort");
            Console.WriteLine(hash);
       }
    }
}

Das häufige Problem sind alte mySQL Datenbanken, die Identifikationen enthalten und heute nicht mehr einfach ohne mySQL geprüft werden können. Den alten MD5/16 Hash erhalten Sie auch weiterhin innerhalb von mySQL durch den Befehl “OLD_PASSWORD()”. Dieser Quellcode soll Ihnen nur dann helfen, wenn Sie alte Daten (z.Bsp. aus Sicherungen) prüfen müssen.

06. Jun 2009
Teaser

Internet: Keine Überwachung von Familienmitgliedern notwendig

Wenn Sie einen Internetanschluss haben, der auch von Ihren Familienmitgliedern genutzt wird, sind Sie nicht verpflichtet, diese Nutzung zu überwachen.

Urteil: OLG Frankfurt vom 20.12.2007 / II W 58/07

Im Verfahren hatte ein Musikverlag einen Internetnutzer verklagt, von dessen Anschluss ca. 300 Musikdaten (mp3 Dateien) rechtswidrig heruntergeladen wurden. Das genutzte System ist aktuell unter “file sharing” bekannt.
Der Angeklagte widersprach dem Vorwurf und behauptete, weder er noch seine Familienangehörigen hätten die Daten heruntergeladen. Die Klage des Musikverlages wurde abgewiesen.

Grund:
Der Kläger hat nicht nachgewiesen, dass der Beklagte oder seine Angehörigen die Dateien tatsächlich heruntergeladen haben. Es sei zwar naheliegend, dass die Dateien von einem Familienmitglied heruntergeladen (“gedownloaded”) wurden – dafür müsse er aber nicht einstehen, da er keine Verpflichtung habe, die Nutzung seines Internetanschlusses zu überwachen. Eine Überwachung ist nur dann verpflichtend, wenn andere Nutzer in der Verganganheit den Anschluss schon einmal für rechtswidrige Handlungen nutzten. Dieses war hier jedoch nicht der Fall.

Bitte beachten Sie:
Dieses ist eine Rechtsinformation. Wir übernehmen keine Gewähr. Bitte informieren Sie sich bei Bedarf / Interesse bei einem zugelassenen Rechtsanwalt.

05. Jun 2009
Teaser

mySQL: Schutz vor Angriffen in Datenbankabfragen (SQL Injection)

Normale SQL Abfragen mit direkt eingebundenen Parametern ohne zusätzliche Schutzfunktionen kann sehr böse Folgen haben. Meist merken Sie davon nichts – Ihre Daten sind jedoch in höchster Gefahr.

Szenario #1: Ein einfacher Angriff

Nehmen wir eine (leider) normale Datenbankabfrage in PHP:

$query = "SELECT * FROM users 
WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";

Nicht immer müssen die “richtigen” Parameter durch Ihre Oberfläche übergeben werden. Durch einfache Manipulation der Parameter (über gesonderte Abfragen) können beliebige Daten mit POST übergeben werden. Gehen wir von folgenden Parametern aus:

$_POST['username'] = "max";
$_POST['password'] = "' OR ''='";

Dadurch würde das SQL Statement so aussehen:

SELECT * FROM users WHERE user='max' AND password='' OR ''=''

Szenario #2: Auflisten von Benutzernamen & Passwörtern

Ebenfalls leicht möglich. Dafür wird eine Datenbankabfrage (SELECT Statement) einfach erweitert:

$query = "SELECT id, name, inserted, size 
FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";

Nun wird z.Bsp. der Parameter “size” vom Angreifer modifiziert:

'
union select '1', concat(uname || '-' || passwd) as name, '1971-01-01', '0' from usertable;
--

Dadurch wird folgende SQL Statement an die Datenbank übergeben:

SELECT id, name, inserted, size 
FROM products
WHERE size = ''
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--' ORDER BY $order LIMIT $limit, $offset;

Szenario #3: Zurücksetzen / Ändern eines Passwortes

Das SQL Statement wird wie folgt zusammengebaut:

$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";

Diese kleine Erweiterung des Parameters “uid” reicht aus:

$uid == ' or uid like'%admin%'; --

Dadurch erhält Ihre Datenbank diesen Updatebefehl:

$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";

Szenario #4: Zugriff auf das Betriebssystem Ihre Datenbankservers

Ihre Abfrage:

$query  = "SELECT * FROM products WHERE id LIKE '%$prod%'";

Wenn jetzt der Parameter “name” entsprechend verändert wird, erhalten Sie folgendes SQL Statement:

SELECT * FROM products
                    WHERE id LIKE '%a%'
                    exec master..xp_cmdshell 'net user test testpass /ADD'--";

Dadurch würde (sofern Sie als entsprechend berechtigter Benutzer verbunden sind) ein neuer Benutzer “test” angelegt werden … und dieser kann dann natürlich frei auf dem Datenbankserver arbeiten.

Schutz Ihrer Daten & Datenbank

  1. Verbinden Sie sich nur als Benutzer mit den benötigten Rechten zur Datenbank.
    Niemals als Administrator (sa / sysdba / sys / …)

  2. Prüfen Sie Parameter vor der Benutzung auf Plausibilität.
    Z.Bsp. bei nummerischen Werten durch die Funktion “is_numeric()”.

  3. Escapen Sie jeden anderen Parameter, welchen Sie direkt an die Datenbank weitergeben.
    Nutzen Sie dafür Funktionen wie “mysql_real_escape_string()”, “sqlite_escape_string()”, usw.

  4. Geben Sie keine Datenbank internen Informationen heraus (Schema, Views, Spezifikationen, etc.)
    Diese Infos können leicht für Angriffe genutzt werden und erleichtern die gezielte Manipulation Ihrer Daten.

Beispiel für eine bessere Abfrage:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));
04. Jun 2009
Teaser

mySQL: 4 GB Grenze umgehen

Wenn Sie eine mySQL Tabelle “überfüllen” möchten, erhalten Sie die Fehlermeldung “The table is full”.

Meist haben Sie dann die 4 GB Grenze von mySQL erreicht. Dieses Problem tritt in Verbindung mit Tabellen vom Typ “myISAM” auf. Um dieses Hürde zu überspringen und mahr Daten speichern zu können, können Sie den Grenzwert mit einem “ALTER TABLE” Befehl übersteuern. Bitte beachten Sie, dass dieser Befehl einige Zeit in Anspruch nimmt !

Beispiel:

In diesem Beispiel heißt die Datenbank “wetter”:

Die aktuellen Grenze erhalten Sie durch folgenden Befehl:

mysql> show table status like 'wetter'
*************************** 1. row ***************************
Name: wetter
Type: MyISAM
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 4294967295
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2003-03-03 00:43:43
Update_time: 2003-03-03 00:43:43
Check_time: 2003-06-14 15:11:21
Create_options: 
Comment: 
1 row in set (0.00 sec)

Hier finden Sie die Info: Max_data_length = 4 GB.

Setzen Sie das Limit neu mit diesem Befehl:

mysql> alter table wetter max_rows=200000000000 avg_row_length=50;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

Und prüfen Sie die Grenze wieder:

mysql> show table status like 'wetter'
*************************** 1. row ***************************
Name: wetter
Type: MyISAM
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 1099511627775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2003-06-17 13:12:49
Update_time: 2003-06-17 13:12:49
Check_time: NULL
Create_options: max_rows=4294967295 avg_row_length=50
Comment: 
1 row in set (0.00 sec)

Fertig. Sie können nun mehr Daten in Ihrer mySQL Datenbank speichern.