目录
LOW
通关步骤
源码分析
MEDIUM
通关步骤
源码分析
HIGH
通关步骤
源码分析
IMPOSSIBLE
源码分析
存储型XSS也叫持久型XSS,从名字就知道特征是攻击代码会被存储在数据库等存储介质中,因此功效持久。攻击者可以把payload放在网站留言板、评论等位置,待用户访问网站并有匹配payload的行为时,即可触发攻击。
存储型XSS和反射型XSS本质都是一样的,只不过反射型XSS的payload的行动路径是:受害者浏览器--服务器--受害者浏览器,而存储型XSS的payload的行动路径是:浏览器--服务器--存储介质--服务器--受害者浏览器。
相关推荐:
DVWA通关--反射型XSS(XSS (Reflected))_箭雨镜屋-CSDN博客
pikachu XSS Cross-Site Scripting(皮卡丘漏洞平台通关系列)_箭雨镜屋-CSDN博客
WebGoat (A7) Cross Site Scripting (XSS)_箭雨镜屋-CSDN博客
LOW 通关步骤1、试一下最简单的payload:alert(1)
这里我是写在message输入框里面的,name输入框是限制长度的,其实这个长度限制如果仅仅是在html中控制,是可以突破的。
等到第二步的时候来突破一下。
成功弹框
2、尝试突破一下name输入框长度限制
可以在name输入框右键->查看元素(chrome浏览器里面是右键->检查),或者F12打开之后在elements里面自己找找。
可以看到name输入框maxlength是10
直接把maxlength的值改成100
这样就可以绕开输入框长度的html标签属性限制,把payload完整输入进去了
弹出弹框
3、尝试一下获取cookie:
payload:document.write('')
payload里面的ip换成自己的攻击机ip地址,这个ip地址必须是目标机可达的ip地址,并且攻击机上需要起http协议。
简单地起http协议的方法有两种:
(1)用python2:
python2 -m SimpleHTTPServer 8899
(2)用python3:
python3 -m http.server 8899
本来想直接在message输入框输入应该没有什么问题,原来message输入框也有输入长度限制
还是按照步骤2的办法绕过
获取到cookie
P.S. 测试的时候还发现每次点击浏览器的刷新键,都会再生成一个一条guestbook记录。这应该是low等级没有做防止表单重复提交的动作。
源码分析表单提交后name和message中的内容首先被trim函数移除左右两边的字符,再被stripslashes()函数删除反斜杠(\),然后经过mysqli_real_escape_string() 函数的处理,转义了特殊字符(包括NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z),然后直接代入mysqli_query()函数来执行INSERT INTO的SQL语句。
完全没有对XSS的防护,另外对SQL注入的防护也不彻底。
1、这关alert(1)不好使了,显示的都只剩下alert(1)了
2、既然是删除式过滤,常规思路可以尝试以下大小写绕过,双写绕过之类的,不行的话试试没有script的payload。
这次我打算试试双写绕过。
考虑到删得连尖括号都不剩了,试试paylaod:alert(1)
成功弹框
根据这个结果,应该是name里的paylaod生效了,注入点在name输入框。
获取cookie和LOW差不多,注意双写标签就好,不赘述了。
源码分析比起LOW等级的代码,MEDIUM等级主要是有这三个高亮的地方的修改:
(1)对message的内容中的预定义字符之前添加反斜杠(addslashes函数)。预定义字符包括 '、"、\、NULL(其实感觉这步挺多余的,因为默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes(),所以不应对已转义过的字符串使用 addslashes(),会导致双层转义,详细可见https://www.w3school.com.cn/php/func_string_addslashes.asp)
然后用strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
(2)将message中的预定义字符转换为html实体(htmlspecialchars函数)。预定义的字符包含&、、'、"
(3)将name中的删除(使用str_replace函数进行字符串替换,由于该函数是区分参数大小写的,所以也可以采用大写绕过)
本靶场存储型XSS注入的输出位置在html标签中间,因此由于message那里将包括的预定义字符转换成了html实体,所以message处无法注入。
而name处仅仅是对进行了删除,并且该删除操作采用的还是区分参数大小写的函数,而且没有循环删除。
因此name这里至少可以用三种方法绕过:(1)双写绕过,如本文上述示例(2)大写绕过,比如(3)换成不带标签的payload
1、先用alert(1)试一下,name和message同时试一试
从结果来看,这个name字段的奇葩结果让我想起了反射型XSS的HIGH等级,那边是用正则表达式匹配上payload标签的
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?