Forum: PC-Programmierung xxs trotz escaping


von Matthias (Gast)


Lesenswert?

Guten Morgen.

Auf einer Website gab es ein Gästebuch, dessen Eingabe escaped wurde.

<tag> wurde nicht mehr als html angesehen, sondern als Text formatiert.

Dann gab es diesen Eintrag, der komischerweise einen Link enthielt?! wtf
1
Give mid.hfik.seitenaddresse.wsw.nu
 gefolgt von einem normalen a-tag, der den Link ausgab. Das dürfte aber 
nicht möglich sein, da &gt &lt escaped wurden.

Kann mir das jemand erklären??

von Chris (Gast)


Lesenswert?

Hi,

vielleicht die Wunder are Welt des Unicode und eine Datenbank oder eine 
Scriptsprache, die das umsetzt?
Wo ich Escaping las, musste ich im ersten Moment an eines denken und es 
kommt schon aus dem Rückenmark: bei SQL kein escaping verwenden, nur 
prepared Statements! Alles andere ist ein so gut wie offener 
Angriffsvektor für little Bobby tables.

Ist es dein Code? Wie machst du das Escaping?

von Jan H. (j_hansen)


Lesenswert?

Chris schrieb:
> SQL

Wenn ich wetten müsste, würde ich ebenfalls auf SQL code injection 
setzen.

von Matthias (Gast)


Lesenswert?

SQL wurde garnicht verwendet.

Die Beiträge wurden mittels cgi in einer html Datei gespeichert und über 
SSI wieder eingebunden.
1
import cgi
2
import cgitb
3
import time
4
import sys
5
6
html_escape_table = {
7
  &: &amp;,
8
  .
9
  .
10
  .
11
  <: &lt;,
12
}
13
14
def html_escape(text):
15
  esc_text = ""
16
  return esc_text.join(html_escape_table.get(c,c) for c in text)
17
18
cgitb.enable()
19
#sys.stderr = sys.stdout
20
21
print("Content-type: text/html\r\n\r\n")   
22
23
guestbook_form_input = cgi.FieldStorage()
24
guest_name = guestbook_form_input.getvalue('name')
25
guest_comment = guestbook_form_input.getvalue('comment')
26
t = time.strftime("%d.%m.%Y %H:%M:%S")
27
28
if (guest_name == None) or (guest_comment == None):
29
  html ...
30
  beides erforderlich
31
  ...html
32
33
else:
34
  g_name = html_escape(guest_name)
35
  g_comment = html_escape(guest_comment)
36
37
  guest_file = open('./../guest2.html','a+', encoding='utf-8')
38
  guest_file.write(u"<div>")
39
  guest_file.write(u"<p>\n <b>{}</b> schrieb am {}<br><br>{}</p>" .format(g_name,t,g_comment))
40
  guest_file.write(u"</div>\n")
41
  guest_file.close()
42
43
  html...
44
  Eingabe erfolgreich
45
  ...html
1
<!--#include virtual="./../guest.html" -->

von Matthias (Gast)


Lesenswert?

Ergänzung, die guest2.html hat die öffentliche Berechtigung 'Lesen'!

von Chris R. (hownottobeseen)


Lesenswert?

Hi,

hm, wenn es kein Einzelfall ist, lass dir die HTML-Header (dort stehen 
m. W. die POST- und GET-Daten) zumindest vorübergehend als hexdump 
wegschreiben -
getreu dem Motto "Rohdaten sind geil".

Damit kannst du dann an konkreten Daten deinen Code testen und 
verbessern.

Ansonsten tappe ich hier leider auch ein bisschen im Dunkeln...

Ich bin mir ziemlich sicher, dass du 
https://wiki.python.org/moin/EscapingHtml schon gelesen hast - 
ansonsten: nachholen ;)

von Matthias (Gast)


Lesenswert?

Hi Chris,

https://wiki.python.org/moin/EscapingHtml

daher stammt das Escaping ja. Ich habe es hier (mikrocontroller.net) nur 
nur beispielhaft angegeben, da teilweise nicht postbar.

Daher auch der entfernte html Teil.

> lass dir die HTML-Header (dort stehen
> m. W. die POST- und GET-Daten) zumindest vorübergehend als hexdump
> wegschreiben -

Meinst Du den html oder http Header?? Und wie kann ich die Anforderungen 
als hexdump wegschreiben?

Ich habe mir mal die Logfiles angesehen und dabei ist mir aufgefallen, 
dass jemand mit POST auf mir nicht bekannte Pfade und ein php Skript 
zugreifen wollte. Da diese nicht vorhanden sind, gab es eine 404 zurück, 
aber ich fand das Ganze irgendwie mysteriös.
1
xxx.xxx.xx.x - - [17/Oct/2018:05:03:05 +0200] "POST /wp-content/themes/template-parts/content-single.php HTTP/1.1" 404 1363 meinedomain.com "-" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" "-"

von Chris R. (hownottobeseen)


Lesenswert?

Matthias schrieb:
> http Header??

HTTP-header. Alternativ: lass dir den unbearbeiteten guest_comment in 
eine Datei wegschreiben. Besser als nix.

Das mit Abfragen und Posts an nicht vorhandene Dateien ist mittlerweile 
leider völlig normal.
Script(kiddie)s, die Standardinstallationen nach Lücken absuchen. 
Deshalb läuft auf meiner Homepage unter phpmyadmin nur ein Video von 
Rick Astley ;)

von Jim M. (turboj)


Lesenswert?

Matthias schrieb:
> Kann mir das jemand erklären??

Lade Dir die entsprechenden Daten binär vom Server (z.B. via FTP) und 
schau sie Dir in 'nem Hexeditor an.

Eventuell nutzt der Angreifer irgendeinen obskuren Mechanismus, wie z.B. 
UTF-7 Encoding.

Alternativ schau Dir das Ergebnis HTML im Hexeditor an. Wenn da normale 
Tags drin stehen, übersieht dein Escape Mechanismus irgendwas - dann 
brauchst Du den binaren "guest_comment" und "guest_name" zwecks 
Debugging.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.