跨站点脚本(XSS)攻击是一种注入攻击,恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码(通常以浏览器端脚本的形式)发送给其他最终用户时,就会发生 XSS 攻击。允许这些攻击成功的漏洞很多,并且在 web 应用程序的任何地方都有可能发生,这些漏洞会在使用用户的输入,没有对其进行验证或编码。 攻击者可以使用 XSS 向不知情的用户发送恶意脚本,用户的浏览器并不知道脚本不应该被信任,并将执行 JavaScript。因为它认为脚本来自可信来源,所以恶意脚本可以访问浏览器并作用于该站点的任何 cookie、会话令牌或其他敏感信息,甚至可以重写 HTML 页面的内容。
反射型XSS :在用户请求某个URL地址的时候,会携带一部分数据。当客户端进行访问某个链接时,攻击者可以将恶意代码注入到URL,如果服务器未对URL携带的参数做判断和过滤,直接返回响应页面,那么XSS攻击代码就会被一起传输到用户的浏览器,触发反射型XSS。
low 请求页面 攻击者可以使用 XSS 向不知情的用户发送恶意脚本,用户的浏览器并不知道脚本不应该被信任,并将执行 JavaScript。因为它认为脚本来自可信来源,所以恶意脚本可以访问浏览器并作用于该站点的任何 cookie、会话令牌或其他敏感信息,甚至可以重写 HTML 页面的内容。
http请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 GET /vulnerabilities/xss_r/?name=Jack HTTP/1.1 Host : localhostsec-ch-ua : sec-ch-ua-mobile : ?0sec-ch-ua-platform : ""Upgrade-Insecure-Requests : 1User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Sec-Fetch-Site : same-originSec-Fetch-Mode : navigateSec-Fetch-User : ?1Sec-Fetch-Dest : documentReferer : http://localhost/vulnerabilities/xss_r/Accept-Encoding : gzip, deflateAccept-Language : zh-CN,zh;q=0.9Cookie : PHPSESSID=1ekmlj5hkmfpg44br6ilefo6s2; security=lowConnection : close
响应页面
源码 1 2 3 4 5 6 7 8 9 10 11 12 <?php header ("X-XSS-Protection: 0" );if ( array_key_exists ( "name" , $_GET ) && $_GET [ 'name' ] != NULL ) { echo '<pre>Hello ' . $_GET [ 'name' ] . '</pre>' ; }?>
攻击思路 low级别的源码没有对 name任何过滤,仅仅判断是否为空。
直接输入 <script>alert("XSS")</script>
medium 源码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php header ("X-XSS-Protection: 0" );if ( array_key_exists ( "name" , $_GET ) && $_GET [ 'name' ] != NULL ) { $name = str_replace ( '<script>' , '' , $_GET [ 'name' ] ); echo "<pre>Hello ${name}</pre>" ; }?>
攻击思路 medium对 name进行了字符串过滤。是否包含 <script>字符串,包含则替换为空。
双写绕过。<s<script>cript>alert("xss")</s<script>cript>
大写绕过,html大小写不敏感。<Script>alert("XSS")</Script>
high 源码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php header ("X-XSS-Protection: 0" );if ( array_key_exists ( "name" , $_GET ) && $_GET [ 'name' ] != NULL ) { $name = preg_replace ( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i' , '' , $_GET [ 'name' ] ); echo "<pre>Hello ${name}</pre>" ; }?>
攻击思路 high级别使用了正则匹配,过滤了大小写以及双写情况。
使用其他HTML标签。比如 <img>,<iframe>
<img src = "" onerror = alert("XSS")>
impossible 源码 开启全反击!学习时间到!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php if ( array_key_exists ( "name" , $_GET ) && $_GET [ 'name' ] != NULL ) { checkToken ( $_REQUEST [ 'user_token' ], $_SESSION [ 'session_token' ], 'index.php' ); $name = htmlspecialchars ( $_GET [ 'name' ] ); echo "<pre>Hello ${name}</pre>" ; }generateSessionToken ();?>
htmlspecialchars() 函数用于把预定义的字符 “<” 和 “>” 转换为 HTML 实体,相当于把输入全部当成数据,防止了我们注入 HTML 标签。例如我们注入 “”,htmlspecialchars 函数会将 < 和 > 转换成 html 实体而不是当做标签,所以我们插入的语句并不会被执行。同时加入 Anti-CSRF token 防护 CSRF 攻击,进一步提高安全性。
1 htmlspecialchars(_string_ ,_flags_ ,_character -set_,_double \_encode_ )
htmlspecialchars()预定义的字符是:
& (和号)成为 &
“ (双引号)成为 “
‘ (单引号)成为 ‘
< (小于)成为 <
> (大于)成为 >
总结 XSS的危害比较广泛。比如盗取cookie,网页挂马,结合其他漏洞等等。但是反射型的XSS只是对本次请求进行了恶意行为,可以通过对输入过滤、编码增强安全性。