护网笔记(八)-- XSS漏洞利用
- 浏览器同源策略
- 概述
- 目的
- 限制范围
- XSS
- 介绍与原理
- 反射型XSS
- 存储型XSS
- XSS平台
- DOM型XSS
浏览器同源策略
概述
1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同":
(1)协议相同
? (2)域名相同
? (3)端口相同
举例如下:
| URL地址 | 是否同源 | 原因 |
|---|---|---|
| http://www.secevey.com/index.html http://secevey.com/index.html |
否 | 域名不同 |
| http://secevey.com/index.html https://secevey.com/index.html |
否 | 协议不相同 |
| http://127.0.0.1:8888 http://127.0.0.1:8080 |
否 | 端口不相同 |
| http://secevey.com/a.js http://secevey.com/index.html |
是 | |
| http://127.0.0.1:80/c.html http://127.0.0.1:80/tab/d.html |
是 |
总结:只有同时满足域名、协议、端口同时一致,才是同源的
目的
同源策略的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
设想这样一种情况:
如果Web世界没有同源策略,当你登陆FreeBuf了账号并打开另一个站点时,这个站点的javascript可以跨域读取你的FreeBuf账号数据,这样的话整个WEB世界就没有隐私而言。
(之前讲过,登陆网站一般都会记录cookie值,如果不消息访问了恶意的小网站,同时它又捕获了你的cookie,而http又是无状态的协议,谁有cookie就认谁是真的,所以没有同源策略就很危险。后边要学的XSS如果打到cookie就可以完成冒用身份登录)
防护手段:
http-only 不允许js代码操作cookie
将cookie与访问的ip进行绑定 这种使用的很少,也不方便
限制范围
随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制:
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。
虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。
例如,我同一个站点的两个不同域名不能共享Cookie;
再例如,我的前端页面项目的域名与我后端Jetty服务的域名不同,那么我就无法发送Ajax请求来访问Jetty服务,等等。
现在有一个场景:A站点上很多目录(www.A.com/upload www.A.com/test www.A.com/doc )他们使用同一个cookie都可以正常访问,但是存在某个upload目录下有一个很重要的cookie,不想与其它分享
setcookie('name','admin',0,'/upload')
①设置能够携带cookie访问的路径
②指定一个固定的域名,默认是当前php文件所属的域名
③安全套接字,考虑到兼容性默认false使用http的,如果全局都做了https就可以设置true
④httponly控制是否不允许通过js代码进行操作cookie
在HTML语言中,有部分标签在引用第三方资源时,不受同源策略的限制:
使用/符号包裹字符
当input失去焦点并且它的value值发生变化时触发
当input的value值发生变化时就会触发
当input获取焦点(点击输入)时触发
当input失去焦点时会触发
通过执行auto属性执行本身的focus事件
注意使用的是反引号包裹
当鼠标在图片上时触发
点击图片触发
点击下拉选项时触发
通过open属性自动触发
靶场:
pikachu
找到反射型xss(get) 将 


XSS短连接
应用场景:在做钓鱼的时候网址过长容易引起怀疑,需要将网址变短
存储型XSS
存储型XSS:又称持久型XSS,它与反射型xss最大的不同,就是攻击脚本被永久的存放到目标服务器的数据库或者文件中,因此储存型XSS的危害会更大。
存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

发现留言板是textarea标签。
分析textarea标签的特点
//www下新建 xss_stored.php 文件
Title
浏览器访问新建的文件,并传递参数,参数值
发现语法也没错即使不弹窗,可知道textarea标签优先级比较高,在它闭合之前中间的内容都当做文本处理。
构造textarea中传入内容,使之先闭合,从而实现弹框
例如:
调试存储型XSS
1)先去Pikachu平台上练习一下,并查看网页源码
或者


2)开始之前将刚才插入的点击删除掉。重新插入使用burpsuite抓包

3)设置代理使用bp抓包,然后发送到Repeater中

4)在POST请求路径后添加 XDEBUG_SESSION_START=PHPSTORM 点击Send发送,进入PHPstorm进行调试

5)重点在23行判断POST提交的 message参数,判断是否为空,下一步对它使用escape()函数进行处理

6)进入这个函数中看到对传入的字符串进行转义处理,右键 Set Value修改$data的值
alert`1` 部分改成 alert('1') 继续往下执行

7)查看返回的$message值中的单引号已经做了转义,所以这里只过滤了SQL注入。然后插入数据库

8)可以登上数据库查看刚才插入的表

9)第33行往后是控制页面出现删除按钮的,现在可以关闭调试去看看页面情况

10)去刷线下页面,出现弹框,确定后,看到页面出现删除按钮。

下面看一下,刷新页面为什么会出现弹框
11)可以和上边一样bp抓包,repeater修改 send发送PHPstorm调试,也可以直接在浏览器中直接发送到phpstorm进行调试

12)刷新页面是一个GET请求,可以跳转到第33行,判断get中有没有id值,没有做删除所以没有传入id值,就会往下跳转

13)第79行往下,先打印$html ,查询数据库message表,将表中带有注入代码读取出来,直接放在
标签里面。

总结:存储型XSS利用过程
1、恶意攻击者在存在XSS漏洞的网站提交构造的XSS代码
2、web应用程序接收提交数据,没有过滤或者过滤不严格
3、写入到数据库中或者文件中
4、受害者访问这个存在XSS恶意代码的页面时
5、web应用程序从数据库或者从文件中读取之前恶意攻击者提交的代码
6、web应用程序服务器返回这段数据
7、受害者浏览器渲染返回的HTML页面,执行返回的JavaScript
8、恶意的JavaScript代码在后台悄悄执行,获取用户信息
XSS平台
新开一个pikachu网站作为xss平台

(1)pikachu之xss获取cookie
核心payload:
说明:
document.location='http://www.baidu.com' 跳转页面
document.cookie 捕获网站的cookie
? ../pikachu/pkxss/xcookie/cookie.php脚本写的是结束跳转页面的请求

流程图如下:

1)找到含有xss漏洞的网站输入我们构造的核心payload我们得到了我们制造的URL
例如:
##留言板填入内容,需要先闭合
2)我们会获取一条cookie,后续用户一旦访问这个页面,还会获取到cookie,并且重新定向到我们指定的地址上。
3)查看cookie,我们后台就会收到它的cookie等信息。如图:
找个存储型XSS

(2)pikachu之XSS钓鱼攻击
实验环境有问题,可参考学习不做本实验
相关说明连接地址: https://www.naraku.cn/posts/38.html
思路:在一个存在xss漏洞上的页面上嵌入一个链接请求,请求会返回一个Basic认证的一个头部。
若用户信息安全意识不够,输入了用户和密码,那么这些会被发送到pkxss后台
我们的实验用 存储型xss模块演示

我们只需要在这个存储型的页面上去,嵌入一个能够访问我们后台的返回Basic认证的标签就行
这里可以用a标签、img、
查看下fish.php源码,其中location(重定向)换成自己的ip,即xss平台ip
地址: http://127.0.0.1/pikachu/pkxss/pkxss_login.php
(3)pikachu之XSS获取键盘记录
我们仍然是用存储型xss来演示,先看下pkxss后台的键盘记录
修改ip,ip为自己xss平台的ip地址 ../pkxss/rkeypress/rk.js

返回输入框,
这一策略就违反啦同源策略,(ajax)
由于XSS平台是攻击者自己搭建的,攻击者可以允许所有的人跨域请求他,可以rkserver.php把里面的Access-Control允许所有人访问。即可实现攻击目的。
pkxss后台会有键盘记录,地址: http://127.0.0.1/pikachu/pkxss/pkxss_login.php
DOM型XSS
DOM型XSS
? 对象模型(Document Object Model)即大名鼎鼎的DOM,它可以被认为是一种通过将页面元素以对象的树形方式表现,以便有javascript组织处理的实现方法。
常用的DOM方法
用户可通过javascript(以及其他变成语言对HEML DOM进行访问,所有HTML元素被定义为对象,而编程接口则是对象方法和对象属性。)
| 方法 | 描述 |
|---|---|
| getElementBuId | 返回带有指定ID的元素 |
| getElementsBy TagName | 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组) |
| getElementsByClassName | 返回包含带有指定类名的所有元素的节点列表 |
| appendChild() | 把新的子节点添加到指定节点 |
| removeChild() | 删除子节点 |
| repaceChild() | 替换子节点 |
| insertBefore() | 在指定的子节点前面插入新的子节点 |
| createAttribute() | 创建属性节点 |
| createElement() | 创建元素节点 |
| createTextNode() | 创建文本节点 |
| getAttribute() | 返回指定的属性值 |
| setAttribute() | 把指定属性设置或修改为指定的值 |