目录
一、什么是XSS注入?
xss全称为Cross Site Script,即跨站脚本攻击,为了不和层叠样式表(Cascading Style Sheet)混淆,因此简称为XSS。最初的XSS演示是跨域的,因此被称之为跨站脚本攻击,xss本质上是黑客通过对网页的HTML注入,篡改了原本服务器发给客户端的数据包,在其中插入了恶意脚本,从而在用户浏览网页的时候控制用户的一种攻击。xss长期因此被称为客户端Web安全的头号大敌,因为xss破坏力强大,产生情景复杂,一年才针对不同场景产生的xss注入,应该区分情景对待。
二、形成的原因?
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
三、xss注入的分类
反射型
又称非持久型XSS。Web客户端发送含有恶意代码的请求到服务器,Server端将脚本包含在返回的响应中,这时web客户端收到响应,脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中;
存储型
又称持久型XSS。存储式XSS漏洞, 该类型是应用广泛而且有可能影响到Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。它之所以被称作存储式漏洞是因为它把恶意代码直接保存到数据库中,只要浏览XX发布文章的用户都将受到攻击。危害最大
DOM型
只跟前端有关
DOM型xss是基于html的dom文档来说的,攻击者通过注入JavaScript的脚本,利用相应的函数修改网页的DOM结构,进而修改网页的某些信息,本质上也是一种反射性xss,后来便单独分成了一类。
攻击者可以使用document.location、document.URL、document.referer等DOM元素的属性
四、怎样防御XSS注入
在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“对输出进行转义”的方式进行处理:
- 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
- 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
五、相关函数
常见的输出函数:print()、 print_r()、 echo、 printf()、 sprintf()、 die()、 var_dump()、 var_export()
几种常用的弹窗函数:
alert()
其中alert是最常用的方法:alert引发的弹窗只有一个确定按钮,内容可以是变量也可以是字符串,字符串需要引号括起来;
alert()无返回值
confirm()
confirm 对比 alert,会多出一个“取消”按钮。而且 confirm 有一个返回值。如果点击了确定则是返货true,取消则是false
prompt()
prompt()比 confirm 多一个输入框。同样,prompt 也是有返回值的。 如果按了确定,返回值是 输入的内容,字符串型。如果按了取消,返回值是:null。
六、相关例题(ctfhub以及xss-labs中的部分题)
less-1
代码审计:
这段代码的功能是:当你尝试调用alert
函数时(通常是通过alert("some text");
这样的代码),它不会显示一个带有“some text”的对话框,而是会首先显示一个带有“完成的不错!”的确认对话框,然后无论用户点击哪个按钮,浏览器都会跳转到level2.php?keyword=test
这个页面。
<meta http-equiv="content-type" content="text/html;charset=utf-8">这段代码是HTML文档中的一个<meta>标签,它用于提供有关HTML文档的元信息。这些元信息不会直接显示在页面上,但对于浏览器和其他Web技术来说,这些信息非常重要。
<script>和</script>:这两个标签用于在HTML中嵌入JavaScript代码。所有在这两个标签之间的内容都会被浏览器视为JavaScript代码并执行
window.alert = function() {...}: 这行代码重写了浏览器默认的alert函数。通常,alert函数会显示一个带有指定文本和确定按钮的对话框。但在这里,它被替换为一个自定义函数。
confirm("完成的不错!");: 这是JavaScript中的一个内置函数,用于显示一个带有指定文本、确定和取消按钮的对话框。如果用户点击确定,该函数返回true;如果用户点击取消,该函数返回false。但在这里,无论用户选择哪个按钮,代码都会继续执行
window.location.href="level2.php?keyword=test";: 这行代码改变了当前浏览器窗口的URL,导航到level2.php?keyword=test这个页面。window.location.href是获取或设置当前窗口的URL的属性
此php语言可大致翻译为从 URL 的 GET 参数中获取一个名为 "name" 的值,并在网页上以居中的形式显示一条欢迎信息。当用户访问一个带有 "name" 参数的 URL 时,它会在网页上显示一条居中的欢迎信息,其中包含从 URL 参数中获取的用户名。
这行代码调用了 ini_set
函数,用于在运行时设置 PHP 配置选项。在这里,它将 display_errors
配置选项设置为 0
,这意味着如果 PHP 脚本中出现错误,错误信息将不会直接显示在网页上。
这段 PHP 代码的功能是输出一个居中对齐的 HTML 标题 (<h3>
标签),标题的内容是字符串 $str
的长度,标题文本为 "payload的长度:"。
strlen($str)
:这是 PHP 的一个函数,用于获取字符串 $str
的长度。strlen
函数返回字符串中的字符数。
解题
1.这是一个GET交互的xss漏洞,观察源代码,发现参数会被插入标题中,所以我们输入一段简单的弹窗代码进行尝试。
2.通过构造js代码块的闭合,alert()弹窗,只要弹窗即可进入下一关,示意此关卡已经通过
<script>alert('xxxxxxxx')</script>
less-2(未完)
这关比上一关多了搜索框,尝试使用上一关的弹窗代码后页面回显了但是没有弹窗也没有提示通关,证明输入的内容在被get的时候经过了过滤,代码不生效。