xss漏洞详解
XSS原称为CSS(Cross-Site Scripting),因为和层叠样式表(Cascading Style Sheets)重名,所以改称为XSS(X一般有未知的含义,还有扩展的含义)。XSS攻击涉及到三方:攻击者,用户,web server。用户是通过浏览器来访问web server上的网页,XSS攻击就是攻击者通过各种办法,在用户访问的网页中插入自己的脚本,让其在用户访问网页时在其浏览器中进行执行。攻击者通过插入的脚本的执行,来获得用户的信息,比如cookie,发送到攻击者自己的网站(跨站了)。所以称为跨站脚本攻击。XSS可以分为反射型XSS和持久性XSS,还有DOM Based XSS。(一句话,XSS就是在用户的浏览器中执行攻击者自己定制的脚本。)
常见的输出函数有: echo printf print print_r sprintf die var-dump var_export.
存在的原因
XSS 存在的根本原因是,对URL中的参数,对用户输入提交给web server的内容,没有进行充分的过滤。如果我们能够在web程序中,对用户提交的URL中的参数,和提交的所有内容,进行充分的过滤,将所有的不合法的参数和输入内容过滤掉,那么就不会导致“在用户的浏览器中执行攻击者自己定制的脚本”。
但是,其实充分而完全的过滤,实际上是无法实现的。因为攻击者有各种各样的神奇的,你完全想象不到的方式来绕过服务器端的过滤,最典型的就是对URL和参数进行各种的编码,比如escape, encodeURI, encodeURIComponent, 16进制,10进制,8进制,来绕过XSS过滤。
xss漏洞分类
xss 分类:(三类)
反射型XSS:<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
存储型XSS:<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
开始通关
第一关
第一步查看源代码,发现该页面会显示我们通过get请求的变量name
可以看到这是用户输入的name变量,那么我们就猜测该位置会不会有XSS漏洞呢,也就是反射型的XSS,执行我们自己输入的前端代码。输入payload,过关,然后查看源代码,发现输入的payload已经嵌入到源代码中
http://localhost/xss-labs-master/level1.php?name=<script>alert('hack')</script>
说明源码是完全没有对GET请求到的name变量进行过滤,原封不动地发送到浏览器的,所以才会被执行。
第二关
第二关和第一关一样,首先观察值得注意的点,test,一是它的是以GET请求发送的变量,二是在页面上发现了用户发送的变量,查看源码
可以看到变量经服务器处理后又返回给了input标签的value中和<h2></h2>标签中,做题思路和第一关一样。修改GET发送的变量
显示无法通过,再去看源码
发现<h2>部分的恶意代码应该是被重新编码了,所以不会执行,而<input>标签内则是被闭包了。所以下面可以构造恶意代码,利用input的闭包,然后再利用//注释掉后面的 ">
构造的payload是
"> <script>alert("hack")</script> //
完成的不错!
第三关
第三关,查看源代码后和第二关差不多,姑且利用第二关的恶意url实验一下
发现h2和input处的<,>这样地敏感字符编码成了html字符实体。猜测服务器在这两处都用htmlspecialchars()函数进行了处理。
接下来就得想如何使得浏览器弹窗呢,利用input标签里的特殊事件,来执行js代码,例如onfocus语句,然后只需要闭合value的那个引号即可,注意,)后面需要加个空格,构造url
'onfocus=javascript:alert('xss')
发现页面并无多大变化,这是因为onfocus事件是JavaScript中对象获得焦点时发生的事件,最简单的实例就是网页上的一个搜索框,当鼠标点击该输入框,输入框被选中可以输入内容时就是该输入框获得焦点的时刻,此时输入框就会触发onfocus事件,因此点击当前页面输入框即可。
查看源码,发现和原来想的一样