一次存储型XSS的攻防实战
发布时间 - 2019-12-03 00:00:00 点击率:次什么是存储型xss
它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一般是注入一段javascript脚本。在测试过程中,我们一般是使用:
通过这段js代码,弹个框来证明存在xss漏洞。那么,可能新手就会问了,弹个框有什么用呢?
其实,弹框只是为了证明存在此漏洞。而此漏洞的利用方式由很多种。
比如,你可以使用xss平台:
写入一段平台生成的xss脚本:
当某人进入带有这个脚本的页面时,js脚本会获取他的cookie并发往xss平台。
你只需要登录xss平台等待即可,拿到cookie后,可以不需要密码登录他的账号。
注意:本文的重点是一步一步以黑客的角度进行xss攻击,再讨论如何站在开发者的角度去一步一步防御xss攻击。所以我会在本文中以开发的身份修正后端代码,再以黑客的身份进行前端页面的xss攻击,这一点需要注意哦。
对于存储型xss漏洞的表现形式,比较经典的是留言板。但是我们都是遵纪守法的好同学,不能对外面的网站进行测试,所以就花半个小时自己手撸一个留言板咯。
首先,应该有前端展示的页面Message_Board.php和后端存储数据的页面addMessage.php
前端代码不是本文重点(感兴趣的可以自行查看前端代码),我们重点关注后端代码addMessage.php:
可以看到,我们对传入的四个参数完全没有处理,而是直接存入数据库中。
所以,只要我们这样输入:
提交之后,系统会自动刷新页面出现弹框:
点击确定后,你会发现留言内容和留言者的部分都为空。
这是因为js脚本已经被解析了,这时我们按F12,打开浏览器的开发者工具,发现了js脚本。
那么,问题来了。
毕竟我们还有另外一个身份,开发者该如何防御呢?
0×00、来个最简单的,只修改前端代码
在input标签里面加上maxlength属性
至于原理嘛,就是因为js脚本的形式为长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了。
可是!开发可没这么好做!
我们是想做开发的黑客,所以还得自己搞自己。
作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)
可以看到,我们可以直接进行长度的修改。
另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。
0×01、对关键字script进行过滤
作为开发者,你很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。
回到之前的代码。
为方便说明,我只取nickname参数,其实传入的四个参数需要做同样的处理。
$nickname = str_replace("script", "", @$_POST['nickname']);//昵称上面这个str_replace()函数的意思是把script替换为空。
可以看到,script被替换为空,弹框失败。
那么黑客该如何继续进行攻击呢?
答案是:大小写绕过
因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。
成功弹框!
0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字
作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。
后端代码修正如下:
$nickname = str_ireplace("script", "", @$_POST['nickname']);//昵称str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。
那么,黑客该如何绕过?
答案是:双写script
alert(1)
原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。
弹框成功!
0×03、使用preg_replace()函数进行正则表达式过滤script关键字
$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称
显然,弹框失败。
攻击者如何再一次绕过?
答案是:用img标签的oneerror属性
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
当点击页面上的超链接时,会弹框。
但是为什么呢?
这种编码方式为字符编码
字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“数值;”, 例如“j”可以编码为“j”或“j ”
上述代码解码之后如下:
a
你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。
作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?
当然可以了:用iframe标签编码
这种写法,同样既没有script关键字,又没有alert关键字。
可以看到弹框成功!
可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。
0×05、过滤特殊字符
优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?
可是我不想手撸代码来列举那么多特殊字符怎么办?
php给我们提供了htmlentities()函数:
$nickname = htmlentities(@$_POST['nickname']);//昵称
htmlentities()函数的作用是把字符转换为 HTML 实体。
看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(
可以看到,我们输入的内容全部显示在页面上了。
可是却没有弹框。
我们鼠标右键,查看网页源代码
际上,我们输入的内容已经变成了HTML实体:
zuojiankuohaophpcniframe src=javascri pt:alert(1)youjiankuohaophpcn
无法被解析为js脚本。
黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)
0×06、总结
开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。
黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。
对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。
相关文章教程推荐:web服务器安全
# php
# JavaScript
# 正则表达式
# html
# xss
# Cookie
# 并发
# JS
# alert
# input
# ASCII
# 数据库
# 微软
# 可以看到
# 站在
# 该如何
# 后端
# 为空
# 看你
# 留言内容
# 特殊字符
# 大黑
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python文本处理实践_日志清洗解析【指导】
如何用PHP快速搭建高效网站?分步指南
JavaScript实现Fly Bird小游戏
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Laravel如何使用Eloquent进行子查询
昵图网官方站入口 昵图网素材图库官网入口
长沙企业网站制作哪家好,长沙水业集团官方网站?
Python文件操作最佳实践_稳定性说明【指导】
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel如何实现API资源集合?(Resource Collection教程)
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
bootstrap日历插件datetimepicker使用方法
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何安全更换建站之星模板并保留数据?
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
微信小程序 canvas开发实例及注意事项
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Laravel如何处理和验证JSON类型的数据库字段
如何自定义建站之星网站的导航菜单样式?
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
英语简历制作免费网站推荐,如何将简历翻译成英文?
魔方云NAT建站如何实现端口转发?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Mybatis 中的insertOrUpdate操作
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何在VPS电脑上快速搭建网站?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
微信小程序 HTTPS报错整理常见问题及解决方案
怎样使用JSON进行数据交换_它有什么限制
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
个人网站制作流程图片大全,个人网站如何注销?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
详解jQuery中基本的动画方法
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
音响网站制作视频教程,隆霸音响官方网站?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何在服务器上配置二级域名建站?
JavaScript如何实现继承_有哪些常用方法
如何在七牛云存储上搭建网站并设置自定义域名?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
清除minerd进程的简单方法

