Zum Inhalt wechseln

Als Gast hast du nur eingeschränkten Zugriff!


Anmelden 

Benutzerkonto erstellen

Du bist nicht angemeldet und hast somit nur einen sehr eingeschränkten Zugriff auf die Features unserer Community.
Um vollen Zugriff zu erlangen musst du dir einen Account erstellen. Der Vorgang sollte nicht länger als 1 Minute dauern.

  • Antworte auf Themen oder erstelle deine eigenen.
  • Schalte dir alle Downloads mit Highspeed & ohne Wartezeit frei.
  • Erhalte Zugriff auf alle Bereiche und entdecke interessante Inhalte.
  • Tausche dich mich anderen Usern in der Shoutbox oder via PN aus.
 

   

Foto

XSS Lücke, wie fixxen?

- - - - -

  • Bitte melde dich an um zu Antworten
6 Antworten in diesem Thema

#1
Givenchy

Givenchy

    Leecher

  • Members
  • PIP
  • Likes
    1
  • 2 Beiträge
  • 0 Bedankt

Tag,

 

auf meiner Seite (die noch im Aufbau ist) wurde ein XSS Angriff durchgeführt und dies mit Erfolg.

 

Jetzt wollte ich Fragen wo der Fehler liegt.

 

Bin wirklich ratlos. Findet jemand ne Lücke, in dem Skript?

 

Page: 

Please Login HERE or Register HERE to see this link!

 

Skript: 


Bearbeitet von Givenchy, 11 March 2018 - 23:43 Uhr.


#2
ProHex

ProHex

    Hacker

  • Moderator
  • Likes
    211
  • 219 Beiträge
  • 184 Bedankt

Wo genau wurde denn die XSS ausgegeben? 



#3
Givenchy

Givenchy

    Leecher

  • Members
  • PIP
  • Likes
    1
  • 2 Beiträge
  • 0 Bedankt

Wo genau wurde denn die XSS ausgegeben? 

 

Hi, hab die Lücke wieder gefixxt. War ziemlich dumm von mir. Hab vergessen die Ausgaben zu Filtern.


  • ProHex gefällt das

#4
R3V3R53

R3V3R53

    Lamer

  • Members
  • PIPPIPPIP
  • Likes
    17
  • 19 Beiträge
  • 75 Bedankt
  • Android, iPhone
  • Windows, Linux

Zudem dein PDO für'n Arsch ist -.-^^ 

<?php

session_start();

require_once 'config/connect.php';
include_once 'function.php';

if (!$_SESSION['id']) {
    $_SESSION['id'] = 10;
}

?>

<html>
<head>

    <link rel="icon" href="img/snap.png" type="image/x-icon">
    <title>Snapchat Connection</title>
    <meta charset="utf-8"/>
    <meta lang="de-de"/>
    <meta lang="en-en"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link rel="stylesheet" href="css/style_message.css" type="text/css"/>
    <link rel="stylesheet" href="css/normalize.css" type="text/css"/>

</head>

<body>

<article id="main-msg">

    <section class="left-user-msg">

        <section class="left-user-search-msg">
            <h2 class="chat-title">Chat</h2>
            <input type="search" name="search-user-by-msg" placeholder="Person Suchen">
        </section>

        <?php

        $user = $pdo->prepare("SELECT user.id, user.username, user.image FROM user;");

        if (!$user->execute()) {
            print_r($user->errorInfo());
        }

        ?>

        <?php
        while ($row = $user->fetch(PDO::FETCH_ASSOC)) { ?>
        <form class="left" action="" method="GET">
            <?php

            if ($stmt = $pdo->prepare("

                SELECT user.id, msg.id, msg.user_id, msg.sender_id, msg.message,	msg.date	
				FROM msg		
				INNER JOIN user
				ON msg.user_id = user.id || msg.sender_id = user.id
				WHERE msg.user_id = :user_id AND sender_id = :sender_id || msg.user_id = :sender_id AND msg.sender_id = :user_id ORDER BY date DESC LIMIT 1;")) {
                //Wieso ist das hier leer?
            }
            $stmt->BindParam(':user_id', $_SESSION['id']);
            $stmt->BindParam(':sender_id', $row['id']);

            if (!$stmt->execute()) {
                print_r($stmt->errorInfo());
            }

            ?>

            <?php
            $x = '0000-00-00 00:00:00';
            $za = $pdo->prepare("SELECT * FROM msg WHERE msg.user_id = :user_id AND sender_id = :sender_id AND read_user_id = :x;");
            $za->BindParam(':user_id', $_SESSION['id']);
            $za->BindParam(':sender_id', $row['id']);
            $za->BindParam(':x', $x);

            if (!$za->execute()) {
                print_r($za->errorInfo());
            }

            $zahl = $za->rowCount();
            ?>

            <?php while ($row2 = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
                <section class="all-user-list-msg">

                    <a href="messages.php?u=<?php echo $row['id']; ?>">

                        <p class="img">

                            <?php if ($row['image'] != '') { ?>

                                <img src="<?php echo $row['image']; ?>">

                            <?php } else { ?>

                                <img src="img/no.png"></img>

                            <?php } ?>
                        </p>
                        <p class="username-text">
                            <?php echo $row['username']; ?>
                        </p>


                        <?php if ($row2['sender_id'] == $_SESSION['id']) { ?>

                            <?php echo $row2['message']; ?>
                        <?php } else { ?>
                            <?php if ($zahl > 0) { ?>
                                <p class="msg">
                                    <?php echo $row2['message'] ?> (<?php echo $zahl; ?>)
                                </p>
                            <?php } else { ?>
                                <p class="msg-weight">
                                    <?php echo $row2['message']; ?>
                                </p>
                            <?php } ?>
                        <?php } ?>
                        <p class="date"> &#149; <?php $time = convertTime($row2['date']);
                            echo $time; ?></p>
                    </a>

                </section>

                <?php
            }
            ?>

            <?php }
            ?>


    </section>
    </form>
    <section class="main-user-msg">
        <?php if (htmlspecialchars($_GET["u"], ENT_QUOTES))
        {
        ?>

        <?php $get = filter_var($_GET["u"], FILTER_SANITIZE_STRING); ?>
        <section class="main-user-msg-top">
            <?php
            if ($user = $pdo->prepare("SELECT * FROM user WHERE id = :id LIMIT 1;")) {
                $user->BindParam(':id', $get);

                if (!$user->execute()) {
                    print_r($user->errorInfo());
                }

                $rowuser = $user->fetch(PDO::FETCH_ASSOC);
            }
            ?>
            <div class="img-container">
                <?php if ($rowuser['image'] != '') { ?>
                    <img src="<?php echo $rowuser['image']; ?>">
                <?php } else { ?>
                    <img src="img/no.png">
                <?php } ?>
            </div>

            <h2>
                <a style="color:#444;" href="profil_method2.php?u=<?php echo $get; ?>">
                    <?php echo $rowuser['username']; ?></a>

            </h2>


            <div class="work">
                <?php

                if ($folg = $pdo->prepare("SELECT follow.user_id, follow.follow_id FROM follow WHERE user_id = :user_id AND follow_id = :follow_id;")) {
                    $folg->BindParam(':user_id', $_SESSION['id']);
                    $folg->BindParam(':follow_id', $get);

                    if (!$folg->execute()) {
                        print_r($folg->errorInfo());
                    }

                    $countfolg = $folg->rowCount();

                }
                ?>

                <?php
                if ($countfolg === 0) { ?> <a style="text-align:right;" class="folg-user"
                                              href="like.php?type=follow&id=<?php echo $get; ?>"> Folgen</a>

                    <?php
                }
                ?>
                <i class="fas fa-ellipsis-v"></i>
            </div>
        </section>


        <section class="main-user-msg-middle">
            <?php
            $x = '0000-00-00 00:00:00';
            $update = $pdo->prepare("UPDATE msg SET read_user_id = NOW() WHERE user_id = :user_id AND sender_id = :id AND read_user_id = :x;");
            $update->BindParam(':user_id', $_SESSION['id']);
            $update->BindParam(':id', $get);
            $update->BindParam(':x', $x);
            if (!$update->execute()) {
                print_r($update->errorInfo());
            }

            $show = $pdo->prepare("SELECT msg.user_id, msg.sender_id, msg.message FROM msg WHERE user_id = :user_id AND sender_id = :sender_id || sender_id = :user_id AND user_id = :sender_id;");

            $show->BindParam(':user_id', $_SESSION['id']);
            $show->BindParam(':sender_id', $get);

            if (!$show->execute()) {
                print_r($show->errorInfo());
            }

            while ($rowshow = $show->fetch()) { ?>

                <?php if ($_SESSION['id'] === $rowshow['sender_id']) { ?>

                    <p class="my-msg"> <?php echo nl2br($rowshow['message']); ?></p>

                <?php } else { ?>

                    <p class="not-my-msg"> <?php echo nl2br($rowshow['message']); ?></p>
                    <?php
                }
            }
            ?>
        </section>

        <section class="main-user-msg-bottom">

            <div class="clip">
                <button type="button" name="clip"><img src="img/clip.png"></button>
                <ul class="ul">
                    <li>Hallo</li>
                </ul>
            </div>

            <div class="textarea">
                <form action="" method="POST">
                    <textarea name="message" placeholder="Schreibe etwas..."></textarea>
            </div>

            <div class="paperplane">
                <button type="submit" name="send_msg"><img src="img/paper-plane.png"></button>
                <?php
                if (isset($_POST['send_msg'])) {
                    $msgx = '';
                    if ($insert = $pdo->prepare("INSERT INTO msg (user_id, sender_id, message) VALUES (:user_id, :sender_id, :message);")) {
                        $insert->BindParam(':user_id', $get);
                        $insert->BindParam(':sender_id', $_SESSION['id']);
                        $insert->BindParam(':message', $_POST['message']);

                        if (!$insert->execute()) {
                            print_r($insert->errorInfo());
                        } else {
                            $msgx = "Erfolg";
                        }
                    }
                }
                }
                ?>
                </form>
                <?php echo $id; ?>
            </div>

        </section>
    </section>
</article> 

Das ganze mal mit weniger TABS und dann auch etwas sauberer und dein Code ist anständig.


  • 3eyes gefällt das

Mit freundlichen Grüßen,

R3V3R53

 

Dir gefällt mein Beitrag? Dann nix wie ab und die Danke Funktion benutzen :)


#5
pi^2

pi^2

    Hacker

  • Premium Member
  • Likes
    273
  • 181 Beiträge
  • 46 Bedankt
if (!$_SESSION['id']) {
    $_SESSION['id'] = 10;
}

einfach nein.. (aber ich nehme [hoffentlich] mal an es dient zu testzwecken?)

<meta charset="utf-8"/>
=>
<meta charset="utf-8">
... (etc.) ...

HTML5 standart

<article id="main-msg">
		<section class="left-user-msg">
			<section class="left-user-search-msg">

das ist ein klassen-massaker. gibt etwas das nennt sich CSS selektoren, beispiel:

#main-msg > section > section
#main-msg section > section:first-of-type 

usw.
<?php 
			$user = $pdo->prepare("
			SELECT 
			user.id,
			user.username,
			user.image
			
			FROM user
			;");
			if(!$user->execute()) {
				print_r($user->errorInfo());
			}
			
?>

inline-PHP? nogo (ausnahme eventuell: templating). zu dem SQL sag ich nix. warum user. wenn du sowieso nur von `user` selektierst? 

diese ganze PDO prepares kannst du doch einfach in eine function oder methode packen? komplett unübersichtlich und unnötig!

z.B.:
$pdo->query('SELECT id,username,image FROM user(s)')->fetchAll(PDO::FETCH_OBJ);

Wozu binden wenn keine Benutzereingabe?

error-handling, katastrophe ... der nutzer bekommt immer gleich das komplette output (objekt)!

 <?php echo $row['username']; ?>

da haste unter anderem ne XSS, die "echo" Anweisung ist unnötig, PHP kann das besser:

 <?=htmlspecialchars($row['username']); ?>

auf den rest hatte ich kein bock mehr...

 

nutze lieber nen framework wie Laravel (ist für derlei projekte und solche laien-kenntnisse sowieso besser geeignet, sonst wird es ganz schnell duster [sicherheitstechnisch])

 

Please Login HERE or Register HERE to see this link!


  • Juri gefällt das

Thanked by 1 Member:
R3V3R53

#6
ProHex

ProHex

    Hacker

  • Moderator
  • Likes
    211
  • 219 Beiträge
  • 184 Bedankt
if (!$_SESSION['id']) {
    $_SESSION['id'] = 10;
}

einfach nein.. (aber ich nehme [hoffentlich] mal an es dient zu testzwecken?)

<meta charset="utf-8"/>
=>
<meta charset="utf-8">
... (etc.) ...

HTML5 standart

<article id="main-msg">
		<section class="left-user-msg">
			<section class="left-user-search-msg">

das ist ein klassen-massaker. gibt etwas das nennt sich CSS selektoren, beispiel:

#main-msg > section > section
#main-msg section > section:first-of-type 

usw.
<?php 
			$user = $pdo->prepare("
			SELECT 
			user.id,
			user.username,
			user.image
			
			FROM user
			;");
			if(!$user->execute()) {
				print_r($user->errorInfo());
			}
			
?>

inline-PHP? nogo (ausnahme eventuell: templating). zu dem SQL sag ich nix. warum user. wenn du sowieso nur von `user` selektierst? 

diese ganze PDO prepares kannst du doch einfach in eine function oder methode packen? komplett unübersichtlich und unnötig!

z.B.:
$pdo->query('SELECT id,username,image FROM user(s)')->fetchAll(PDO::FETCH_OBJ);

Wozu binden wenn keine Benutzereingabe?

error-handling, katastrophe ... der nutzer bekommt immer gleich das komplette output (objekt)!

 <?php echo $row['username']; ?>

da haste unter anderem ne XSS, die "echo" Anweisung ist unnötig, PHP kann das besser:

 <?=htmlspecialchars($row['username']); ?>

auf den rest hatte ich kein bock mehr...

 

nutze lieber nen framework wie Laravel (ist für derlei projekte und solche laien-kenntnisse sowieso besser geeignet, sonst wird es ganz schnell duster [sicherheitstechnisch])

 

Please Login HERE or Register HERE to see this link!

 

 

Keine Frage, du hast vollkommen recht mit deinen Verbesserungen. Jedoch sollte er nicht mit Frameworks arbeiten wenn er die basics nicht perfektioniert hat. Den Fehler habe ich damals einmal gemacht und bereue ihn bis heute.


  • SecurityFlaw gefällt das

#7
SecurityFlaw

SecurityFlaw

    ██████████

  • Members
  • PIPPIPPIPPIPPIPPIPPIPPIPPIP
  • Likes
    212
  • 256 Beiträge
  • 112 Bedankt
  • Android, Android [root]
  • Windows, Linux

Hab da noch eine:
 

HceSTgX.png

http://liscon.bplaced.net/beta.php | POST: delete_comment=<script>alert('XSS');</script>

pC354jv.png

 

 

 

// EDIT:

Hier noch ein Scan-Report vom Netsparker:

Please Login HERE or Register HERE to see this link!

Danach könntest du dich schonmal richten um etliche Missstände deiner Seite auszumerzen ;)


Bearbeitet von SecurityFlaw, 21 March 2018 - 22:45 Uhr.


Thanked by 1 Member:
R3V3R53


  Thema Forum Themenstarter Statistik Letzter Beitrag

Besucher die dieses Thema lesen:

Mitglieder: , Gäste: , unsichtbare Mitglieder:


This topic has been visited by 43 user(s)


    3eyes, B1nary, Born2Hack, Ch!ller, cubik, Cyber Tjak, DarkSky, desmond, fl4shx, Flex.Net, Framerater, Franziskaner, Givenchy, gr33d, Hansiberg, herp, Irhabi, jmPesp, juPP, Juri, kiwitone, Klaus, lNobodyl, mesagio, n1nja, nibble nibble, PadX18, PaulaAbdul, PenguinCyborg, pi^2, ProHex, Psykoon303, R3V3R53, raider, SecurityFlaw, SK4LL3R, smc2014, Stalin, Terrafaux, VerZus, vôl, xodiak, z91
Die besten Hacking Tools zum downloaden : Released, Leaked, Cracked. Größte deutschsprachige Hacker Sammlung.