XSS跨脚本攻击原理

来源:互联网 发布:电子图书数据库读秀 编辑:程序博客网 时间:2024/06/05 05:16

XSS 攻击,全称是“跨站点脚本攻击”(Cross Site Scripting),之所以缩写为 XSS,主要是为了和“层叠样式表”(Cascading StyleSheets,CSS)区别开,以免混淆。XSS 是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。这些代码包括HTML代码和客户端脚本。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击”,而JavaScript是新型的“ShellCode”。

XSS 攻击的目的是盗走客户端cookies,或者任何可以用于在 Web 站点确定客户身份的其他敏感信息。手边有了合法用户的标记,黑客可以继续扮演用户与站点交互,从而冒充用户。如果某个怀有恶意的人(攻击者)可以强迫某个不知情的用户(受害者)运行攻击者选择的客户端脚本,那么便会发生跨站点脚本攻击。

 Web 应用程序的技术基础是由 HTTP和 HTML 组成的。HTTP 协议是 HTML 的传输机制,可使用代码设计 Web 页面布局和生成页面。如果 Web 应用程序接受用户通过 HTTP 请求(如 GET 或 POST)提交的输入信息,然后使用输出 HTML 代码在某些地方显示这些信息,便可能存在 XSS 漏洞。


1. Web 请求如下所示:

http://www.somesite.com/page.asp?pageid=10&lang=en&title=Section%20Title

2. 在发出请求后,服务器返回的HTML 内容包括:

    <h1>SectionTitle</h1>

可以看到,传递给“title”查询字符串参数的用户输入可能被保存在一个字符串变量中并且由 Web 应用程序插入到 <h1> 标记中。通过提供输入内容,攻击者可以控制 HTML。

3. 现在,如果站点没有在服务器端对用户输入加以过滤(因为总是可以绕过客户端控件),那么恶意用户便可以使用许多手段对此漏洞加以滥用:

攻击者可以通过摆脱 <h1> 标记来注入代码:

<scrīpt>alert(‘XSS%20attack’)</scrīpt”>

http://www.somesite.com/page.asp?pageid=10&lang=en&title=Section%20Title</h1><scrīpt>alert(‘XSS%20attack’)</scrīpt>

这个请求的 HTML 输出将为:

    <h1>SectionTitle</h1><scrīpt>alert(‘XSS attack’)</scrīpt>



以下转载自:https://www.zhihu.com/question/26628342/answer/33504799

1,)先来分析一下LZ说的DOM-based XSS。
一句话概括:DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。
如果楼主没有搞懂dom树的关系,那对dom xss的了解是非常有限的。
先以一张w3c的图来说明,到底什么是dom:


哦..原来是这样(似乎你有点了解?),没错,dom就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,值。
了解了这么一个知识点,你就会发现,其实dom xss并不复杂,他也属于反射型xss的一种(2016.3.16修改,domxss取决于输出位置,并不取决于输出环境,因此domxss既有可能是反射型的,也有可能是存储型的),简单去理解就是因为他输出点在DOM,所以在道哥的《白帽子讲Web安全里》也有详细介绍。dom - xss是通过url传入参数去控制触发的。
2,)分析完dom-xss之后,再说说存储型xss,其实也很好理解,存储型xss,自然就是存入了数据库,再取出来,导致的xss。
3,)反射型xss实际上是包括了dom - xss了,关键点仍然是在通过url控制了页面的输出(dom-xss也类似,只因为输出地点不同而导致结果不一致)。
说了这3种区别,不能仅仅停留在理论上,下面我贴出这三种xss代码的demo【均以php为例】:
dom-xss:
<?phperror_reporting(0);$name = $_GET["name"];?><input id="text" type="text" value="<?php echo $name;?>" /><div id="print"></div><script type="text/javascript">var text = document.getElementById("text"); var print = document.getElementById("print");print.innerHTML = text.value; // 获取 text的值,并且输出在print内。这里是导致xss的主要原因。</script>

前面有一个热心的回答者说到一点:domxss需要关闭ie xss过滤器才会触发。实际上是不需要的,domxss是可以在各个浏览器触发,截图说明(基于上面那段代码):
chrome:
ie(开启了xss防护模式):

存储型xss:

<?phperror_reporting(0);$name = $_GET["name"];//连接服务器$conn = mysql_connect("127.0.0.1","root","");//打开数据库mysql_select_db("test",$conn);//执行SQLmysql_query("set names 'utf8'");$sql_insert = "insert into liuyan(id,content) values('$id','$name')";$result = mysql_query($sql_insert,$conn);$sql_select = "select * from liuyan";$results = mysql_fetch_array(mysql_query($sql_select));echo $results[content];?>

上面这段代码写的比较简洁,可以看到用户可控的$_GET name直接被带入到数据库中,随后被查询并且输出出来了,直接导致了xss。感兴趣的同学可以做下测试,先通过

http://localhost/2.php?name=%3Cscript%3Ealert(1)%3C/script%3E

然后再访问localhost/2.php。即可触发存储型xss:

步骤一,是为了让xss代码写入数据库,步骤二是为了把恶意代码从数据库取出来并且输出在页面上。
反射型xss:

<?php$name = $_GET["name"];?><input type="text" value="<?php echo $name?>">

结果:
好了,花了这么长的时间去说明,其实想告诉题主:好了,花了这么长的时间去说明,其实想告诉题主:
在易用上,存储型XSS > DOM - XSS > 反射型 XSS。
为什么这么说?因为存储型xss最持久,而且更为隐蔽,因为是存在数据库当中的,触发的url当中没有带js或者其他的html代码。dom-xss,排在其次。为何?上面的图最直观:因为它能绕过大部分浏览器的过滤(新版Chrome针对script context类型的domxss做了检测拦截)。反射型的xss还要深思熟虑的考虑根据浏览器去bypass各种过滤,易用性稍微差一些。注:反射型xss和dom-xss都需要在url加入js代码才能够触发。




可以通过对参数进行验证以及转义来避免,如果使用了框架可以使用一些内置方法和配置。如果自己写一个过滤方法来将一些危险字符和敏感信息过滤掉,这种使用filter的方式不仅可以防御XSS攻击还可以防御CSRF攻击、SQL注入等安全问题。例如:

value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");    value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");    value = value.replaceAll("'", "& #39;");    value = value.replaceAll("eval\\((.*)\\)", "");    value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");    value = value.replaceAll("script", "");    
0 0
原创粉丝点击