1. 简介
XSS:跨站脚本攻击(Cross Site Scripting):恶意攻击者往Web页面中插入恶意JavaScript代码,当用户浏览网页时嵌入的JavaScript代码执行,从而达到恶意攻击用户的目的。
2. XSS漏洞靶场搭建
2.1 靶场环境
- kali虚拟机
- Apache服务器
- PHP
- Firefox浏览器
2.2 靶场实现
- kali虚拟机安装,kali虚拟机中集成了我们靶场需要的开发环境Apache2+php+Firefox
3 XSS原理
-
service apache2 start 启动Apache2服务,在/var/www/html路径下新建一个xss.php页面,文件中写入代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>xss</title> </head> <body> <form action="" method="get"> <input type="text" name="xss_input"> <input type="submit"> </form> <hr> <?php /** * Created by PhpStorm. * User: root * Date: 12/6/16 * Time: 4:11 PM */ $xss = $_GET['xss_input']; echo "your text is <br>" .$xss ?> </body> </html>
- 访问页面如图所示:
- 在输入框中输入任意字符,你输入的字符就会显示在页面中,比如输入yaofei,返回如图所示:
- 查看网页源代码:
我们输入的字符串原封不动的输出出来,我们进行一个假设,当我们在输入框中输入<script>alert('hello')</script>
时,会出现什么样的结果呢?按照上述的例子我们可以知道我们的输入<script>alert('hello')</script>
时,他应该存在第14行的<br>
和</body>
之间,所以会弹出hello的对话框。 - 输入
<script>alert('hello')</script>
来验证我们的想法:
说明我们的想法是正确的,查看相应的源代码:
我们的假设成功了。
注:chrome浏览器可能这个代码不能实现,因为chrome的内核和ie的内核不同,chrome的过滤机制比ie强,所以当你输入xss的时候可能被chrome的过滤机制过滤了。
4 XSS利用输出环境来构造代码
-
在相同路径下新建XSS2.php文件,代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>XSS_TEST</title> </head> <body> <center> <h6>INPUT VALUE</h6> <form action="" method="get"> <h6>INPUT</h6> <input type="text" name="xss_input_value" value="input"><br> <input type="submit"> </form> <hr> <?php /** * Created by PhpStorm. * User: root * Date: 12/19/16 * Time: 1:46 PM */ $xss = $_GET['xss_input_value']; if(isset($xss)){ echo '<input type="text" value="'.$xss.'">'; } else{ echo '<input type="text" value="output">'; } ?> </center> </body> </html>
- 页面如图所示:
当你在输入对话框中输入你的内容,输出对话框将你的内容进行输出。我们同样可以用<script>alert('hello')</script>
来进行测试,发现输出框直接源码输出了<script>alert('hello')</script>
字符串。
说明我们的js脚本并没有执行。同样,我们可以查看网页的源代码:
我们看到,我们的输入<script>alert('hello')</script>
的脚本被存入了input标签的value中,所以js脚本并没有执行。通过第一个例子我们可以知道当我们的js脚本在<br>
和<body>
标签里的时候是可以执行的。
所以要想我们的js脚本能够执行的话,我们可以把我们的js“移动”到input标签的外面,话说那我们怎么才能把我们的js脚本移动到input标签外面呢?
聪明的人可能已经想到了,我们可以从输入中自己构造代码来使input标签闭合。输入"> <script>alert('hello')</script>
,”>是用来闭合input标签的,测试一下:
成功弹框!!!查看一下源代码:
可以看到<script>alert('hello')</script>
已经放到了input标签外面,js脚本也执行了。 - XSS的脚本是不是一定要含有
<script></script>
标签呢?因为我们可以看到很多的网站对XSS漏洞进行防护的时候都会把<script>
标签给禁用掉,那样是不是就彻底杜绝了XSS漏洞呢?
答案当然是不是这样的,XSS漏洞的原理就是页面执行JavaScript脚本,难道调用JavaScript只能用<script>
标签吗,很显然不是的,下面我就介绍几种XSS不需要调用<script>
标签的方法:
还用这个环境:" onclick="alert('hello')
,onclick事件可以执行js脚本,所以当我们点击输出框的时候可以看到弹出框,源代码:
同理:Onmousemove事件,鼠标移动时触发也可以实现:" Onmousemove="alert('hello')
。 同时还有其他标签可以实现相效果:
<img src=1 onerror=alert('hello')>:找不到图片1的时候执行alert("hello")
<a href=javascript:alert('hello')>s</a>:点击s超链接执行js脚本alert("hello")
<iframe src=javascript:alert('hello');height=0 width=0 />:利用<iframe>的src执行alert("hello")
5 XSS利用
XSS 难道就是用来弹框的吗?当然不是,我们之前做的所有的工作只是为了验证XSS漏洞的存在。
XSS最有用的用途就是获取用户或者管理员的cookie,拿到cookie之后我们可以通过一些工具:如burpsuite来更改自己的cookie,就可以不用输入用户名,密码,验证码等,以其他用户的身份对网站进行控制用户等操作。