漏洞重温之XSS(上)
漏洞简介
跨站脚本攻击(XSS)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览页面之时,嵌入web网页中的script代码会被执行,从而达到恶意攻击用户的目的。
XSS漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有:echo printf print print_r sprintf die var-dump var_export
xss漏洞最常见的验证方法为先插入一段恶意代码,完成在网站上的弹窗操作,利用恶意代码攻击自己,如果再重复访问网页时发现弹窗,则可以证明该位置存在xss漏洞。
xss漏洞的危害:
(1)窃取管理员账号或cookie,入侵者可以冒充管理员的身份登录后台,使入侵者具有恶意操控后台数据的能力,包括增删改查信息等。
(2)窃取用户的个人信息或者登录账号,对网站用户的安全产生巨大威胁。例如冒充用户身份进行各种操作。
(3)网站挂马。先将恶意攻击代码嵌入到web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
(4)发送广告或垃圾信息。攻击者可以利用xss漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。
常见的xss漏洞分为存储型 反射型、DOM型三种。
(1)反射型xss
用户在请求某条URL地址的地时候,会携带一部分数据。当客户端进行访问某条连接时,攻击者可以将恶意代码植入到url,如果服务端未对url携带的参数做判断或者过滤处理,直接返回相应页面,那么xss攻击代码就会一起被传输到用户的浏览器,从而出发反射型xss。例如,当用户进行搜索时,返回结果通常会包括用户原始的搜索内容,如果攻击者精心构造包含xss恶意代码的链接,诱导用户点击并成功执行后,用户的信息就可以被窃取,甚至可以模仿用户进行一些操作。
反射型xss不会永久存储用户的数据;仅发生在用户的一次访问过程之后。这个过程就像一次反射,因此得名反射型xss。反射型xss的触发条件比较苛刻,需要攻击者想法设法的引导用户点击链接,但产生的危害不容忽视。
(2)存储型xss
存储型xss又叫持久性。一般而言,它是三种xss里危害最大的一种。此类型的xss漏洞是犹豫而已攻击代码被持久化保存到服务器上,然后被显示到html页面之中。这类漏洞经常出现在用户评论的页面,攻击者精心构造xss代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的xss代码,从而窃取用户的敏感信息。
(3)DOM型xss
DOM-basedXSS漏洞是基于文档对象模型(Document Object Model)的一种漏洞。这种xss与反射型xss、存储型xss在原理上有本质区别,它的攻击代码并不需要服务器解析响应,触发xss靠的是浏览器端的DOM解析。客户端上的javascript脚本可以访问浏览器的DOM并修改页面内容,不依赖服务器的数据,直接从浏览器端获取数据并执行。
XSS挑战之旅level1-level7
level1
进入主页,发现只有一张图片,没有任何文本框可以尝试插入。
但发现网站url用name参数传参,并且更改name会改变页面显示。
直接尝试在name参数后面写入测试代码
<script>alert(1)</script>
第一关,通过
level2
第二关开头,发现了xss最熟悉的文本框,本着最基本的见框就插原则,使用测试代码尝试。
<script>alert(1)</script>
根据网页反馈,发现代码并没有被执行。
右键,点击查看源码,找问题所在。
可以看到,我们插入的代码在两个双引号中间,并当做字符串传送,故没有完成他本来应该完成的操作。
尝试闭合前面的单引号,代码如下:
"><script>alert(1)</script>
第二关,通关。
level3
第三关,发现插入框,使用测试代码测试。
<script>alert(1)</script>
根据网页反馈,发现插入代码并没有被执行
右键查看网页源码,发现网站过滤了尖括号,显然script、img这些常用标签无法使用。
尝试使用onclick事件进行xss攻击。
使用单引号闭合value
' onclick=alert(1)
尝试触发事件,但代码却依然没有执行,猜测代码出现问题。
右键查看网页源码
发现代码后面多了一个单引号,引起代码出错。
尝试在代码后面多写一个单引号闭合后方代码。
第三关,通关。
level4
第四关开始,研习传统,使用测试代码测试。
PS:
测试代码的作用:
1.简单直接的检测。如果网站没有设置对xss的防备,可以直接通过代码检测出问题所在。
2.查看网站的防御机制如何。如第三关,第四关,网站通过过滤尖括号来阻止xss攻击,在攻击没有成功的时候,我们可以通过查看网页源码,来查看具体哪个地方出现问题。
发现代码没有被执行,右键查看网页源码。
发现该源码和第四关区别仅仅在于一个使用单引号,一个使用双引号。
废话不多,直接上代码。
" onclick=alert(1) "
第四关,通关。
level5
第五关开局,发现文本框,上测试代码。
发现插入代码未执行,右键查看网站源码。
发现该处需要先闭合前方的value,同时,注意到script标签被转义,变成了scr_ipt,导致该标签不可用。
换测试代码,注意闭合前方。
"><img src=a onerror=alert(1)>
从未加载的图片位置,可以看出来,代码已经成功执行了,但是却没有弹窗,说明代码某处出现问题,导致无法正常运行。
右键查看源代码,找寻问题所在。
问题发现,在我们插入的代码后方,多了一个">,因为这个,才导致我们的代码没有正常执行。
尝试闭合后方尖括号。
发现我们希望出现的弹窗依然没有出现,右键查看网页源码。
从这个地方,可以看出来,问题的确出在最后的尖括号上,正常情况,后方尖括号是可以被闭合的,但是现在却无法完成。
尝试不闭合,直接将后方注释。
PS:这里这么尝试的原因是,代码前方并没有出现任何问题,只是后面多了一个尖括号,如果可以将后面代码注释掉,使其不会影响代码正常运行,可能会达到预期目的。
尝试过后,发现依然无法执行,猜测后方尖括号可能无法被注释等操作,可以利用到尖括号和双引号的有之前提到的onclick事件。
事件依然没有被执行,右键查看源码。
发现onclick事件被过滤,导致无法成功执行。
尝试使用a标签来完成xss攻击。
代码如下
"><a href="javascript:alert(1)
第五关,通关。
level6
第六关,依然先对文本框进行xss攻击。
发现网站转义了script标签,猜测可能也转义了其他常见标签和事件,直接采用a标签进行xss攻击尝试。
代码没有达到预期效果,右键查看网站源码。
发现网站转义了href属性,尝试使用大小写来绕过。
第六关,通关。
level7
第七关,开局使用测试代码进行第一次攻击。
发现script标签被过滤。
经过测试script、src、on等关键字被过滤,显然无法再使用script标签、img标签,和a标签来完成目的。
尝试使用单词嵌套来进行攻击。
" oonnclick=alert(1) "
第七关,通关。