传递的参数直接存在页面代码中,而且没有过滤
打开页面
发现有长度限制,F12进行修改 。
输入特殊字符,检查是否有过滤
发现并没有过滤,而且直接在页面代码中了
存在xss漏洞,尝试输入
,发现有长度限制,用F12修改后。
攻击者127.0.0.1
受害者127.0.0.1
漏洞服务器127.0.0.1
先尝试登陆,默认admin/123456
接下来修改post.html,诱使被攻击者点击链接,访问该页面,进而触发自动提交表单,获取其cookie。
诱使被攻击者点击链接http://192.168.171.129/pikachu/pkxss/xcookie/post.html
当被攻击者点击之后,其cookie等信息自动提交到接受服务器。
攻击成功!
原理:
存储型XSS和反射型XSS形成的原因是一样的,不同的是存储型XSS下攻击者的可以将脚本注入到后台存储起来,构成更加持久的危害
我们在pikachu尝试留言
发现可能存在存储型xss漏洞
输入
提交之后
发现有存储型xss漏洞,刷新就会弹出,攻击成功!
我们这里用一个Basic认证去做这个钓鱼攻击
实验机器
为了方便我们都用本地了,理论上一样的
攻击者127.0.0.1
受害者127.0.0.1
漏洞服务器127.0.0.1
修改pikachu里的\htdocs\pikachu\pkxss\xfish\fish.php
我们在一个存在XSS漏洞的页面上面嵌入一个恶意请求,当用户打开这个页面时
这个页面就会像攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部 这时候会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码
使用上面的存储型xss
在留言上添加
tips:这里一直后台看不到,仔细检查后发现根本没有跳转到xfish.php,再仔细看fish.php,发现连接多了个空格,删掉后可正常跳转。
后台查看
先了解一下什么是跨域:
直接拿老师的
修改pikachu\pkxss\rkeypress\rk.js
,标红处改为接受服务器地址
rk.js 是攻击代码,我们可以把这个 js 文件放到我们的恶意站点上,然后通过有 XSS 漏洞的页面去调用
这个文件可以记录用户的键盘操作,然后异步发送给攻击者,但是这个违背了同源策略,因为我们攻击者的机器和漏洞服务器的主机是不一样的,AJAX的请求默认情况下是不能跨域的,这个请求默认情况下是会失败的
去 /var/www/html/pikachu/pkxss/rkeypress
中 rkserver.php 注释掉下面的代码
在存储型xss漏洞平台留言板输入,但是会提示这个
DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树
传送门
我们可以以这棵树为入口,通过DOM的某些方法对树进行操作,比如对标签的添加、改变和删除等等, DOM这个东西相当于在前端提供了一个通过JS去对HTML进行操作的接口。
查看前端代码,发现输入的内容会被拼接到,对应标签中,存在dom性的xss,我们只需要精心构造payload,闭合前面就行。
尝试'>
造成DOM型XSS的原因是前端的输入被DOM给获取到了,通过DOM又在前端输出,跟反射型和存储型比起来,它是不经过后台交互的。
攻击成功!
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
函数从url里搜索目标标签,并用' '
代替'+'
,接下来又是拼接了,和上文的domxss同理。
构造'>
点击之后
攻击成功!
XSS盲打不是攻击类型,而是一个攻击场景
我们输入的内容并不会出现在前端,我们输入构造的payload,当管理员登陆后台查看的时候,会触发这个payload,进而攻击成功。
之后打开后台管理员界面。
http://127.0.0.1/pikachu/vul/xss/xssblind/admin_login.php
用户名密码 admin/123456,登进去就会弹出。
攻击成功!
xss漏洞经过这么多年,已经有了很多的保护措施,比如特殊字符过滤。
- 前端限制绕过,直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。
- 大小写,比如<SCRIPT>aLeRT(111)</sCRIpt>。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。
- 双写(拼凑),`pt>alert(111) pt>`。后台可能把<script>标签去掉换,但可能只去掉一次。
- 注释干扰,`pt>alert(111)ript>` 。加上注释后可能可以绕过后台过滤机制。
核心思路:
1. 后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定过滤
2. 当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行.
3. 编码应该在输出点被正常识别和翻译,不能随便使用编码。
例子:
将alert('xss')进行URL编码,可以执行吗?
<img src=x onerror=alert%28%27xss%27%29>
它并不会执行,因为属性标签并不会正常解析这些编码
<img src=x onerror=alert('xss')>
将alert('xss')进行HTML编码
<img src=x onerror=alert('xss')>
当它输出到前端的时候,浏览器会对这个编码进行翻译,从而弹窗
XSS绕过的姿势很多,取决于你的思路和对前端技术的掌握程度,我们在皮卡丘平台上,输入下面的内容看一下后台会怎么处理。
发现script被过滤了。
使用大小混合
攻击成功!
使用其他payload试一下
攻击成功!!
htmlspecialchars()是PHP里面把预定义的字符转换为HTML实体的函数
预定义的字符是
& 成为 &
" 成为 "
' 成为 '
< 成为 <
> 成为 >
可用引号类型
ENT_COMPAT:默认,仅编码双引号
ENT_QUOTES:编码双引号和单引号
ENT_NOQUOTES:不编码任何引号
在pikachu中查看
出了点问题。。。
总的原则:输入做过滤,输出做转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字
转义:所有输出到前端的数据根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面进行JS转义
查看关键源码:
可以看出,我们输入内容后,先进行判断是否为www.baidu.com
,如果不是进行htmlspecialchars($_GET['message']);
,同理上面的漏洞,我们需要构造一个没有被过滤的特殊字符,构造如下javascript:alert("ppsuc!!!")
攻击成功!
如果要对 href 做处理,一般有两个逻辑:
1.输入的时候只允许 http 或 https 开头的协议,才允许输出。
2. 其次再进行htmlspecialchars处理
打开网页
查看关键源码
可以看出,在对ms进行判断的的时候,我们可以构造出闭合,payload如下
'