前言

本篇文章,是对自己学习XSS的一次总结,说一些学习过程遇到的一些问题,也希望可以为大家解决一些问题。

从标签的角度讲XSS

因为要说到HTML,所以先给大家普及下HTML标签的知识,只说一些跟XSS有关的地方

HTML标签: <a href="javascript:alert(1)">Click me</a>

这里我们把HTML标签分为三个部分,标签,属性和文本

下面用一张图来给大家说明一下

标签:<a></a> 属性:href=javascript:alert(1) 文本:Click me

一般我们的输入点是在属性,例如:value=””。或者文本里面

当在属性中,我们可以用事件或者闭合来建立一个XSS

而在文本中就简单了,直接一个JS语句即可,例如:<script>alert("1");</script>

什么是基于DOM XSS

我的理解,就是用一些可以修改DOM节点的语句来建立XSS,例如document.write(innerHTML) 都是一些修改DOM节点的语句。

XSS绕过方法

1:大小写绕过。产生原因:写Filter的时候,完全匹配,或者正则中没有加大小写

代码:"> <a Href="javascript:alert('xss')">111</a> //

2:利用事件绕过。当我们的输入点在属性中,且过滤<>,就可以用到事件的绕过了

代码: ' oninput=alert'xss'//

3:把某些敏感代码过滤为空,可以中间加敏感代码

代码:"> <a HHrefref="javascscriptript:alert('xss')">111</a> //

4:换行 空格 tab。产生原因:只有当出现;或者出现结尾标签才算一句代码结束

5:伪协议绕过。Href="javascript:alert('xss')"

6:编码绕过。产生原因:解析的顺序问题。下面谈

为什么有些时候编码可以绕过XSS Filter

先给大家说下三种编码方式(来自Freebuf 一篇文章)

1:URL编码

2:HTML编码。

命名实体:以&开头,分号结尾的,例如"<"的编码是"<"

字符编码:十进制、十六进制ASCII码或unicode字符编码,样式为”&#数值;”, 例如”<”可以编码为”<”和”<”

3:JS编码,js提供了四种字符编码的策略

三个八进制数字,如果不够个数,前面补0,例如"e"编码为"\145"

两个十六进制数字,如果不够个数,前面补0,例如"e"编码为"\x65"

四个十六进制数字,如果不够个数,前面补0,例如"e"编码为"\u0065"

对于一些控制字符,使用特殊的C类型的转义风格(例如\n\r

说了一些编码,还要谈谈一些解析顺序,才好理解绕过的原理

下面说说浏览器对符合编码的解析顺序

以下一段代码

<a);>Click ME</a>

name的内容首先出现在一个URL中,这个URL在一段javascript中,而javascript代码又是html的一部分。

所以解码的顺序就是HTML解码 -> js解码 -> url解码,

那么正确的编码顺序就应该是url编码 -> js编码 -> html编码。

浏览器解析服务器传来的数据的顺序:先HTML,遇到JS,就JS解析

当我们可控参数所在的节点的结构不同时,解析的顺序也就不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function htmlencode($str){
if(empty($str)) return;
if($str == "") return;

$str = str_ireplace("<","",$str);
$str = str_ireplace(">","",$str);
$str = str_ireplace("script","",$str);
$str = str_ireplace("img","",$str);
$str = str_ireplace(":","",$str);
$str = str_ireplace("javascript","",$str);
return $str;
}

if(!array_key_exists ("name",$_GET) || $_GET["name"] == NULL || $_GET["name"] == ""){
$isempty = true;
} else {
$html .= '<pre>';
$html .= '<a>click this url</a>';
$html .= '</pre>';
}
?>

<html>
<script>

</script>
</html>

以上代码可以看到,过滤了尖角号,script等标签,当输入javascript:alert(/xss/)时,系统返回的为:<pre><a></a>Click this url</pre>

我们现在分析一下$name的环境,$name先在HTML环境中,然后在JS环境中

浏览器解析的顺序是HTML解码->JS解码,

当我们对javascript:alert(/xss/)进行HTML编码之后

正好绕过了上面的过滤函数

当解码的时候,先HTML,又变成了javascript:alert(/xss/)

在JS解码,弹窗出来

详情请看:http://www.freebuf.com/articles/web/43285.html(Freebuf文章)

XSS实战

给大家提供两个闯关PT。

https://alf.nu/alert1

http://xss.tesla-space.com/

好好做一遍,绝对受益良多。

表示做的时候看到了这个

熟悉么?就是前段时间Tools那个XSS漏洞~QAQ