XSS

跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数

常见的输出函数有:echo printf print print_r sprintf die var-dump var_export.

XSS分类:

反射型XSS:<非持久化>攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。

存储型XSS:<持久化>代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。

DOM型XSS:基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞


XSS 漏洞原理

3.1  反射型XSS

在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。

相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可。

无案例不足以求真,这里我们选用echo()函数作为实例来分析:

新建 XssReflex.php,代码如下:

<html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/><title>XSS</title></head><body><formaction=""method="get"><inputtype="text"name="input"><inputtype="submit"></form><br><?php$XssReflex=$_GET['input'];echo'output:<br>'.$XssReflex;?></body></html>

这是一个很简单、也很常见的页面:

变量 $XssReflex 获取 get 方式传递的变量名为 input 的变量值(值为一个字符串),然后直接通过echo()函数输出,注意这中间并未对用户输入进行任何过滤。

打开Firefox输入url:localhost/codeaudit/xss/XssReflex.php:

当我们输入1,页面返回 1 :

当我们输入hello时,页面返回 hello :

以上都为正常的输出,但如果我们输出一些javascript代码呢?

比如我们输入<script>alert('xss')</script>:

可以看到浏览器成功弹窗,说明我们输出的JavaScript代码成功被执行了。

我们查看网页html代码:

第12行增加了:

<script>alert('xss')</script>

这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。

3.2 存储型XSS

和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。

存储型XSS攻击流程:

存储型XSS的白盒审计同样要寻找未过滤的输入点和未过滤的输出函数。

使用cat命令查看 XssStorage.php 代码

shiyanlou:~/ $ cat XssStorage.php

代码如下:<参考自JackholeLiu的博客>

<spanstyle="font-size:18px;"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><html><head><title>XssStorage</title></head><body><h2>Message Board<h2><br><formaction="XssStorage.php"method="post">Message:<textareaid='Mid'name="desc"></textarea><br><br>Subuser:<inputtype="text"name="user"/><br><br><inputtype="submit"value="submit"onclick='loction="XssStorage.php"'/></form><?phpif(isset($_POST['user'])&&isset($_POST['desc'])){$log=fopen("sql.txt","a");fwrite($log,$_POST['user']."\r\n");fwrite($log,$_POST['desc']."\r\n");fclose($log);}if(file_exists("sql.txt")){$read=fopen("sql.txt",'r');while(!feof($read)){echofgets($read)."</br>";}fclose($read);}?></body></html></span>

页面功能简述:

这个页面采用POST提交数据,生成、读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,再打开页面时会读取sql.txt中内容并显示在网页上,实现了存储型xss攻击模拟。

打开Firefox输入url:localhost/codeaudit/xss/XssStorage.php:

我们随意输出一些内容:

可以看到页面正常显示页面留言信息。

当我们在Message中输入<script>alert('xss')</script>时,页面成功弹窗 :

并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行!

我们查看网页html代码:

这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大。

3.3 DOM XSS

这种XSS用的相对较少,并且由于其特殊性,常见的漏扫工具都无法检测出来,这里先不做讲解。

记个待办,以后来补!

四、XSS漏洞防范

4.1 反射型xss漏洞防范

php中xss的漏洞防范方法总结:<参考自Segmentfault>

A.PHP直接输出html的,可以采用以下的方法进行过滤:    1.htmlspecialchars函数    2.htmlentities函数    3.HTMLPurifier.auto.php插件    4.RemoveXss函数B.PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:    1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容    2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤C.其它的通用的补充性防御手段    1.在输出html时,加上Content Security Policy的Http Header    (作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)    (缺陷:IE或低版本的浏览器可能不支持)    2.在设置Cookie时,加上HttpOnly参数    (作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)    (缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)    3.在开发API时,检验请求的Referer参数    (作用:可以在一定程度上防止CSRF攻击)    (缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

这里我们选用htmlentities()函数进行测试:

htmlentities() 函数把字符转换为 HTML 实体。

新建Xss_htmlentities.php, 代码如下:

<html><head><metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/><title>XSS</title></head><body><formaction=""method="get"><inputtype="text"name="input"><inputtype="submit"></form><br><?php$XssReflex=$_GET['input'];echo'output:<br>'.htmlentities($XssReflex);#仅在这里对变量 $XssReflex 做了处理.?></body></html>

在Firefox输入url:localhost/codoaudit/xss/Xsshtmlentities.php:

当我们输入<script>alert('xss')</script>:

可以看到页面并没有弹窗。

我们再查看网页html代码:

可以看到htmlentities()函数对用户输入的<>做了转义处理,恶意代码当然也就没法执行了。

还有其他过滤函数,纸上学来终觉浅,有兴趣的同学可以自己去尝试一番

4.2 存储型xss漏洞防范

存储型XSS对用户的输入进行过滤的方式和反射型XSS相同,这里我们使用htmlspecialchars()函数进行演示:

htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体

htmlspecialchars和htmlentities的区别:

htmlspecialchars 只转义& 、" 、' 、< 、>这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。

新建Xss_htmlspecialchars_Storage.php ,代码如下:

<spanstyle="font-size:18px;"><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><html><head><title>XssStorage</title></head><body><h2>Message Board<h2><br><formaction="Xss_htmlspecialchars_Storage.php"method="post">Message:<textareaid='Mid'name="desc"></textarea><br><br>Subuser:<inputtype="text"name="user"/><br><br><inputtype="submit"value="submit"onclick='loction="XssStorage.php"'/></form><?phpif(isset($_POST['user'])&&isset($_POST['desc'])){$log=fopen("sqlStorage.txt","a");fwrite($log,htmlspecialchars($_POST['user'])."\r\n");# 在此对用户输入数据$_POST['user']进行过滤fwrite($log,htmlspecialchars($_POST['desc'])."\r\n");# 在此对用户输入数据$_POST['desc']进行过滤fclose($log);}if(file_exists("sqlStorage.txt")){$read=fopen("sqlStorage.txt",'r');while(!feof($read)){echofgets($read)."</br>";}fclose($read);}?></body></html></span>

在Firefox输入url:localhost/codoaudit/xss/Xss_htmlspecialchars_Storage.php:

当我们在Message中输入<script>alert('xss')</script>:

可以看到页面并没有弹窗。

我们再查看网页html代码:

可以看到htmlspecialchars()函数对用户输入的<>做了转义处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容