目录
前言
XSS即跨站脚本(Cross Site Script),发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生。
通俗地总结XSS为:想尽一切办法将你的脚本内容在目标网站中目标用户的浏览器上解析执行即可。
这个“跨”实际上属于浏览器的特性,而不是缺陷,造成“跨”这样的假象是因为绝大多数XSS攻击都会采用嵌入一段远程或者说第三方域上的脚本资源。
使用场景:
- 直接嵌入html<script>标签中
- 元素标签事件<body οnlοad=alert(‘xss’)>
- 图片标签<img>
- 框架标签<iframe>
- DOM对象
反射型XSS
发出请求时,XSS代码出现在URL中,作为输入提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。这个过程就像一次反射,故称为反射型XSS。
比如http://www.test.com/reflect.php的代码如下:
<?php
echo $_GET['x'];
?>
输入x的值未经任何过滤就直接输出,可以提交:
http://www.test.com/reflect.php?x=<script>alert(1)</script>
服务端解析时,echo就会完整地输出:
<script>alert(1)</script>
到响应体中,然后浏览器解析执行触发。
存储型XSS
存储型XSS和反射型XSS的差别仅在于:提交的XSS代码会存储在服务端(不管是数据库、内存还是文件系统等),下次请求目标页面时不用再提交XSS代码。
最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与JS解析执行,于是就触发了XSS攻击。
DOM XSS
它和反射型XSS、存储型XSS的差别在于,DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情。
//xss.html
<script>
eval(location.hash.substr(1));
</script>
触发XSS方式为:
http://www.test.com/xss.html#alert(1)
这个 URL#后的内容是不会发送到服务端的,仅仅是在客户端被接收并解析执行。
DVWA源码
反射型(Reflected)
Low.php
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
array_key_exists ( $key , array $array )
检查数组里是否有指定的键名或索引。数组里有键 key 时,array_key_exists() 返回 true。key 可以是任何能作为数组索引的值。
漏洞利用
输入:
<script>alert(/H