跨站脚本漏洞(XSS)基础讲解

VSole2021-10-18 05:42:07

XSS漏洞

一、文章简介

   XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么很可能就存在XSS漏洞。

这篇文章将带你通过代码层面去理解三个问题:

  • 什么是XSS漏洞?
  • XSS漏洞有哪些分类?
  • 如何防范XSS漏洞?

二、XSS 漏洞简介

    跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

    xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数

    常见的输出函数有:echo printf print print_r sprintf die var-dump var_export.

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漏洞。

三、XSS 漏洞原理

3.1 反射型XSS

    在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。

    相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可。

    无案例不足以求真,这里我们选用echo()函数作为实例来分析:

    新建 XssReflex.php,代码如下:

XSS








$XssReflex = $_GET['input'];
echo 'output:
'.$XssReflex;
?>


    这是一个很简单、也很常见的页面:

    变量 $XssReflex 获取 get 方式传递的变量名为 input 的变量值(值为一个字符串),然后直接通过echo()函数输出,注意这中间并未对用户输入进行任何过滤。

    打开Firefox输入url:localhost/codeaudit/xss/XssReflex.php :

    当我们输入 1 ,页面返回 1 :

    当我们输入hello时,页面返回 hello :

    

    以上都为正常的输出,但如果我们输出一些javascript代码呢?

    比如我们输入alert('xss') :

    

    可以看到浏览器成功弹窗,说明我们输出的JavaScript代码成功被执行了。

我们查看网页html代码:

    第12行增加了:

alert('xss')

    这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。

3.2 存储型XSS

    和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。

    存储型XSS攻击流程:

    存储型XSS的白盒审计同样要寻找未过滤的输入点和未过滤的输出函数。

    使用cat命令查看 XssStorage.php 代码

shiyanlou:~/ $ cat XssStorage.php

    代码如下:<参考自JackholeLiu的博客>

XssStorage


Message Board


    Message:


    Subuser:




if(isset($_POST['user'])&&isset($_POST['desc'])){  
    $log=fopen("sql.txt","a");  
    fwrite($log,$_POST['user']."\r");  
    fwrite($log,$_POST['desc']."\r");  
    fclose($log);  
    }  

if(file_exists("sql.txt"))  
    {  
    $read= fopen("sql.txt",'r');  
while(!feof($read))  
    {  
echo fgets($read)."
";  
    }  
    fclose($read);  
    }  
?>


    页面功能简述:

这个页面采用POST提交数据,生成、读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,再打开页面时会读取sql.txt中内容并显示在网页上,实现了存储型xss攻击模拟。

    打开Firefox输入url:localhost/codeaudit/xss/XssStorage.php :


    我们随意输出一些内容:


    可以看到页面正常显示页面留言信息。

    当我们在Message中输入alert('xss')时,页面成功弹窗 :

    并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行!


    我们查看网页html代码:


    这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大。

3.3 DOM XSS

    这种XSS用的相对较少,并且由于其特殊性,常见的漏扫工具都无法检测出来,这里先不做讲解。

    记个待办,以后来补!

四、XSS漏洞防范

4.1 反射型xss漏洞防范

   php中xss的漏洞防范方法总结:<参考自Segmentfault>

A.PHP直接输出html的,可以采用以下的方法进行过滤:

    1.htmlspecialchars函数
    2.htmlentities函数
    3.HTMLPurifier.auto.php插件
    4.RemoveXss函数

B.PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

    1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
    2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤

C.其它的通用的补充性防御手段

    1.在输出html时,加上Content Security Policy的Http Header
    (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
    (缺陷:IE或低版本的浏览器可能不支持)
    2.在设置Cookie时,加上HttpOnly参数
    (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
    (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)
    3.在开发API时,检验请求的Referer参数
    (作用:可以在一定程度上防止CSRF攻击)
    (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

    这里我们选用htmlentities()函数进行测试:

htmlentities() 函数把字符转换为 HTML 实体。

    新建Xss_htmlentities.php, 代码如下:

XSS








$XssReflex = $_GET['input'];
echo 'output:
'.htmlentities($XssReflex);#仅在这里对变量 $XssReflex 做了处理.
?>


    在Firefox输入url:localhost/codoaudit/xss/Xsshtmlentities.php :

当我们输入alert('xss') :

    可以看到页面并没有弹窗。

    我们再查看网页html代码:

    可以看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。

    还有其他过滤函数,纸上学来终觉浅,有兴趣的同学可以自己去尝试一番

4.2 存储型xss漏洞防范

    存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用htmlspecialchars()函数进行演示:

htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体

   htmlspecialchars和htmlentities的区别:

    htmlspecialchars 只转义 & 、" 、' 、< 、> 这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。

    新建Xss_htmlspecialchars_Storage.php ,代码如下:

XssStorage


Message Board


    Message:


    Subuser:




if(isset($_POST['user'])&&isset($_POST['desc'])){  
    $log=fopen("sqlStorage.txt","a");  
    fwrite($log,htmlspecialchars($_POST['user'])."\r"); # 在此对用户输入数据$_POST['user']进行过滤
    fwrite($log,htmlspecialchars($_POST['desc'])."\r"); # 在此对用户输入数据$_POST['desc']进行过滤
    fclose($log);  
    }  

if(file_exists("sqlStorage.txt"))  
    {  
    $read= fopen("sqlStorage.txt",'r');  
while(!feof($read))  
    {  
echo fgets($read)."
";  
    }  
    fclose($read);  
    }  
?>


    在Firefox输入url:localhost/codoaudit/xss/Xss_htmlspecialchars_Storage.php :


    当我们在Message中输入alert('xss') :

    可以看到页面并没有弹窗。

    我们再查看网页html代码:

    可以看到htmlspecialchars()函数对用户输入的<>做了转义处理。

五、总结及回顾

  • XSS漏洞原理和相关函数:eval() assert() preg_replace() 回调函数 动态执行函数
  • XSS漏洞的防范
xssdom
本作品采用《CC 协议》,转载必须注明作者和本文链接
XSS 的认识与防护策略
2021-10-15 07:30:55
防止 XSS 攻击预防存储型和反射型 XSS 攻击存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的;因此预防这两种漏洞,有两种常见做法:对文本内容做充分转义。禁止内联脚本执行。禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
XSS漏洞是Web应用程序中最常见的漏洞之一。如果您的站点没有预防XSS漏洞的固定方法,那么很可能就存在XSS漏洞。 这篇文章将带你通过代码层面去理解三个问题: 什么是XSS漏洞? XSS漏洞有哪些分类? 如何防范XSS漏洞?
跨站脚本英文全称(Cross Site Scripting跨站脚本),为了不和css层叠样式表(英文全称:Cascading Style Sheets)混淆,因此将跨站脚本缩写为XSS。本期我们讲解一下XSS漏洞原理和利用检测。
对于初了解xss漏洞的人来说,XSS漏洞的危害就是获取受害者的cookie,来进行 ‘cookie劫持’。今天就总结一下XSS漏洞的危害性,望安全人员不要轻视,开发人员不要忽视XSS漏洞简介XSS攻击通常指黑客通过“HTML注入”篡改网页,插入恶意脚本,从而使用户浏览网页时控制用户浏览器的一种攻击。
下面,我们介绍如何把 JavaScript 嵌入到 PDF 文档之中。 我使用的是迅捷 PDF 编辑器未注册版本 1、启动迅捷 PDF 编辑器打开一个 PDF 文件,或者使用“创建 PDF 文件”功能,通过将其他文档和资源转换为“可移植文档格式”来创建 PDF 文件。
漏洞测试我们介绍如何把 JavaScript 嵌入到 PDF 文档之中。我使用的是迅捷 PDF 编辑器未注册版本1、启动迅捷 PDF 编辑器打开一个 PDF 文件,或者使用“创建 PDF 文件”功能,通过将其他文档和资源转换为“可移植文档格式”来创建 PDF 文件。
时间在2020年,当时使用xray,发现它的的反射型xss扫描很好用,于是想知道原理,好奇探索了下大概的xss扫描规则。当时自己的机器都是2H1G的小机器,想提高效率,于是学习用分布式,但是又由此带来了很多第三方的数据库,队列什么的,更加压迫了我机器的性能..做了这么多,成果也很喜人,各大src,微软都有,运气好也获得了微软1000多刀的赏金。
Swagger-UI中存在跨站脚本漏洞,虽然该漏洞已在2020年末修复被修复,但截止2022年5月16日,研究人员仍然可以在Paypal、Atlassian、Microsoft、GitLab、Yahoo等网站中发现漏洞的实例。
VSole
网络安全专家