跨站脚本(Cross Site Scripting,XSS)是一种经常出现在web应用程序中的计算机安全漏洞。攻击者利用网站漏洞把恶意的代码注入到网页之中。当其他用户浏览到这些网页后,就会执行其中的恶意代码,对受害用户可能采取cookie资料截取、会话劫持、钓鱼欺骗等各种攻击。
Cross Site Scripting, 安全专家们通常将其缩写成XSS,原本应当是css,但为了和层叠样式表(Cascading Style Sheet,CSS )有所区分,故称XSS。
XSS实质是HTML代码与javascript代码的注入。
在测试团队发现漏洞类型中,XSS的发现率名列前四,是常见的漏洞类型。
常见的 XSS 攻击有三种:反射型XSS攻击、DOM-based 型XXS攻击以及存储型XSS攻击。
1.1.1解释
反射型跨站脚本也称作非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见的,也是使用最广的一种,主要用于将恶意脚本附加到URL地址的参数中,例如:
http://www.test.com/search.php?key=”>
http://www.test.com/logout.asp?out=1&ur1=javascript:alert(document.cookie)
反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱惑用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。
反射型XSS的攻击流程如图所示:
此类XSS通常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗。
如下为反射型XSS的一个案例:当在该网站的姓名提交框内输入恶意的JavaScript脚本时,点击提交按钮,便出现了反射型XSS攻击,如图所示:
1.1.2通关记录
难度低:
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E#
难度中:
大小写绕过
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3CScRipt%3Ealert%28%2Fxss%2F%29%3B%3C%2FScRipt%3E#
双写绕过
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Cscr%3Cscript%3Eipt%3Ealert%28%2Fxss%2F%29%3B%3C%2Fscript%3E#
难度高:
其他标签
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Cimg+src%3D1+onerror%3Dalert%28%2Fxss%2F%29%3E#
编码后的其他标签
οnerrοr=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")>
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Cimg+src%3D1+onerror%3Deval%28%22%5Cx61%5Cx6c%5Cx65%5Cx72%5Cx74%5Cx28%5Cx27%5Cx78%5Cx73%5Cx73%5Cx27%5Cx29%22%29%3E%3C%2Fimg%3E#
其他标签
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Ciframe+onload%3Dalert%28%2Fxss%2F%29%3E#
编码后的其他标签
http://192.168.56.115/DVWA-master/vulnerabilities/xss_r/?name=%3Cobject+data%3D%22data%3Atext%2Fhtml%3Bbase64%2CPHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4%3D%22%3E%3C%2Fobject%3E#
1.1.3相关代码(DVWA-master\vulnerabilities\xss_r\source):
难度低
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
$html .= 'Hello ' . $_GET[ 'name' ] . '
';
}
?>
难度中
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '', '', $_GET[ 'name' ] );
// Feedback for end user
$html .= "Hello ${name}
";
}
?>
难度高
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
$html .= "Hello ${name}
";
}
?>
难度为不可能
// Is there any input?if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
// Generate Anti-CSRF tokengenerateSessionToken();
?>
PHP htmlspecialchars()函数把预定义的字符转换为HTML实体:
& (和号)成为 &" (双引号)成为 "
' (单引号)成为 '//生效需要加 ENT_QUOTES 参数
< (小于)成为 <
> (大于)成为 >
1.2.1解释
存储型跨站脚本,比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全。
此类XSS不需要用户单击特定的URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。
存储型XSS的攻击流程如图所示:
持久型XSS一般出现在网站的留言、评论。博客日志等交互处,恶意脚本被存储到客户端或者服务器的数据库中,当其他用户浏览该网页时,站点即从数据库中读取恶意用户存入的非法数据,然后显示在页面中,即在受害者主机上的浏览器执行恶意代码。
如下为存储型XSS的一个案例:当攻击者在留言框内输入恶意JavaScript代码并提交后,其他用户再浏览这个页面时,就会发生存储型XSS攻击,如图所示:
存储型XSS不需要用户去单击URL进行触发,所以他的危害比反射型XSS大,黑客可以利用它渗透网站、挂马、钓鱼……
1.2.2通关记录
简单:
中等:
大小写绕过
双写绕过
难:
其他标签
1.2.3相关代码(DVWA-master\vulnerabilities\xss_r\source):
难度低
trim(string,charlist) 函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。'
mysqli_real_escape_string(string,connection) 函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。
stripslashes(string) 函数删除字符串中的反斜杠。
难度中
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
难度高
难度不可能
1.3.1解释
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
DVWA练习环境“易”“中”“难”练习过程记录:
1.3.2通关记录
简单:
http://192.168.56.115/DVWA-master/vulnerabilities/xss_d/?default=
中等:
发现过滤了“
1.3.4相关代码(DVWA-master\vulnerabilities\xss_d\source):
页面源代码
Please choose a language:
if (document.location.href.indexOf("default=") >= 0) { var lang = document.location.href.substring(document.location.href.indexOf("default=")+8); document.write(""); document.write(""); } document.write(""); document.write(""); document.write(""); document.write("");
判断 "default=" 是否存在
取出 default 的值 并 赋值给变量lang
写入
document表示的是一个文档对象,window.location.href 当前页面完整 URL。 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
substring() 方法用于提取字符串中介于两个指定下标之间的字符。如果少后参数那么返回的子串会一直到字符串的结尾。
document.write是JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中写入字符串,一旦文档流已经关闭,那document.write就会重新利用document.open打开新的文档流并写入,此时原来的文档流会被清空,已渲染好的页面就会被清除,浏览器将重新构建DOM并渲染新的页面。
难度低
# No protections, anything goes
?>
难度中
服务端代码
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "
DOM型xss:
3.尝试特殊字符
例如:< > ‘ “ /
4.对常见payload编码后使用
针对
URL编码
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%31%29%3c%2f%73%63%72%69%70%74%3e
HTML实体编码
BASE64编码
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
Unicode 编码
略
安装和使用方法
https://blog.csdn.net/u013175604/article/details/84841268
3.1.1安装xssValidator必备三件套
检查是否安装有Phantomjs,是否有下载xss.js
Extender 里BAppstore 点击install xssValidator
3.1.2使用xssValidator基本方法
使用该工具演示下使用的过程。
步骤一:
Cmd下执行xss.js 打开监听
步骤二:
抓一个数据包,送到intruder。然后在intruder的payloads做如下设置,选择扩展里面的xssvalitor。
鉴于如上方法使用效果一直不太好。我一般喜欢把下面几个payload的关键词也直接导入到Grep-Match。
步骤三:
点击start attack,对result里的Grep-Match排序。对关键词打钩和响应字体标色的行作为重点关注对象。注意观察cmd窗口,是否有测试HTTP包快速打印。
3.1.3使用xssValidator测试结果
3.1.3.1用DVWA(ref-mid)做XSS检测结果:
目前本组近期所有渗透测试出来的XSS问题,burpsuite scanner 和xssValidator两种方法都是可以找到的。burpsuite scanner因为批量检查速度快,我使用的更多。未有发现xssValidator更优越的例子。但是xssValidator和intruder是结合一起用的,可定制化更强。
XSS漏洞的测试手工必不可少,工具只是辅助。
XSS 存在的根本原因是,对URL中的参数,对用户输入提交给web server的内容,没有进行充分的过滤。如果我们能够在web程序中,对用户提交的URL中的参数,和提交的所有内容,进行充分的过滤,将所有的不合法的参数和输入内容过滤掉,那么就不会导致“在用户的浏览器中执行攻击者自己定制的脚本”。
但是,其实充分而完全的过滤,实际上是无法实现的。因为攻击者有各种各样的神奇的,你完全想象不到的方式来绕过服务器端的过滤,最典型的就是对URL和参数进行各种的编码,比如escape, encodeURI, encodeURIComponent, 16进制,10进制,8进制,来绕过XSS过滤。那么我们如何来防御XSS呢?
使用XSS Filter
对用户提交的信息进行有效的验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略此外的其他任何数据。此外,还需过滤有效的和净化有害的输入。
例如:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
过滤或移除特殊的 html 标签:
burp使用xssValidator插件
https://blog.csdn.net/u013175604/article/details/84841268
XSS payload大全
https://www.cnblogs.com/xiaozi/p/7268506.html
记一次跨站脚本攻击(XSS)实例
http://blog.sina.com.cn/s/blog_9b7ed3d20102v92u.html
DVWA之DOM XSS(DOM型跨站脚本攻击)
https://blog.csdn.net/qq_36119192/article/details/82932557
dvwa-XSS(DOM)超详细
https://www.jianshu.com/p/001daa7cf1f5
DVWA XSS(Reflected) 通关教程
https://www.cnblogs.com/yyxianren/p/11381559.html
DVWA XSS(Stored) 通关教程
https://www.cnblogs.com/yyxianren/p/11381461.html
XSS防御方法总结
https://www.cnblogs.com/digdeep/p/4695348.html
Burp suit中 Xssvalidate使用介绍-推荐(XSS自动扫描)
https://blog.csdn.net/m0_37268841/article/details/79961956
select下拉框的探索(标签中能嵌套使用其它标签吗)
https://www.cnblogs.com/tu-0718/p/7112836.html
《XSS跨站脚本攻击剖析与防御》