说在开头:文章是我通过查询资料后按照自己的理解总结出来的,所以如果有说法不对的地方,欢迎大佬指正~
今天使用的平台是Pikachu,可以看到它有以下几道题目:
昨天在DVWA里面遇到的都是最基础版的XSS,今天这个从名字上就知道它做了变形,有些我还没听过,边做边学吧。
由于上一篇DVWA的讲解已经非常详细了,所以为了节省时间,今天大致相同的步骤我就说简略一点。
1.反射型(get)
哈哈哈之前没看到题目是get方法,直接按post方法做的:
输入框有长度限制,所以F12修改maxlength,然后再输入payload:
出现弹窗:
用get方法做:
2.反射型(post)
首先是登录页面,发现直接在输入框里输入payload没有用,不知道是不是存在过滤机制,然后就去查看源码,然后发现页面上有提示:
登录成功以后,在输入框里写上payload,出现弹窗:
3.存储型
查看反射型(post)的源码时,看到这么一句话:
所以我们这次让它弹出cookie:
4.DOM型
F12查看源码,找到我们传参后它所在的语句:
发现用双引号并不能闭合,于是去看看它的传参语句:
- 虽然注释里有答案,但我们的目的不是为了得到答案,而是知道它为什么那么写。
根据源码,我们 ’ > 来闭合前面的标签,成功闭合。但是< script >标签并不能出现弹窗,所以我们尝试换用插入一种HTML标签的方法,出现弹窗:
5.DOM型(xss-x)
按照图示步骤,现在输入框里输入内容,然后点按钮,再然后点下面那条链接:
然后会出现一条新的链接,我们F12定位到那条语句,可以看到我们刚才传的参就在这句话这:
查看它的传参源码:
payload刚才的一样,输入完以后要先点一下链接,才会出现弹窗:
6.xss之盲打
因为不确定哪一个输入框存在XSS漏洞,所以我们在两个地方都输入payload,并且为了区别,我们使两个弹窗的内容不一样;因为是盲打,所以直接用绕过几率最大的方法:
输入完成以后,查看提示,跳转到登录页面:
输入账号admin/1232456进行登录:
登录成功以后立马出现弹窗,弹窗依次弹出“hello”和“123”,因此可以知道,留言和输入姓名的地方都存在XSS漏洞:
7.xss之过滤
查看源码,可以看到这里用正则表达式对< script >标签进行了过滤:
- 对这个过滤机制不清楚的,可以去看我XSS之DVWA那篇博客,里面讲得非常详细。
所以我们这里使用插入一种HTML标签的方法进行绕过:
8.xss之htmlspecialchars
htmlspecialchars()这个函数我第一次听,所以首要工作是搞清楚这个函数是干什么的。
- 1.htmlspecialchars()函数定义及用法
在php中,htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志; - 2.一共有5个预定义的被转换的字符: &、"、’、<、> :转换为&xxx
- 3.它的语法格式是:htmlspecialchars(string,flags,character-set,double_encode)
一共有4个参数位置,除了第一个string是必要的,后面三个都是可选字段;
其中,第2个字段flags是规定如何处理引号、无效的编码以及使用哪种文档类型。 - 4.可用的引号类型:
ENT_COMPAT:默认,仅编码双引号;
ENT_QUOTES:编码双引号和单引号;
ENT_NOQUOTES:不编码任何引号。
查看源码,可以看到使用的htmlspecialchars()函数只有一个参数,也就是说flags字段是默认选项,仅编码双引号:
因此,我们可以尝试用单引号来构造payload:
- 之前使用的三种绕过的语法都不行,在网上找了一个新的payload:
’ οnclick='alert(document.cookie)'
9.xss之href输出
查看源码:
href的定义: < a > 标签的 href 属性用于指定超链接目标的 URL。
href 属性的值可以是任何有效文档的相对或绝对URL,包括片段标识符和JavaScript 代码段。如果用户选择了 < a > 标签中的内容,那么浏览器会尝试检索并显示href属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
结合源码和href定义,我们可以知道:
虽然有htmlspecialchars()函数,但由于输入的url拼接在 < a href=‘输入的内容’>属性中,所以可以使用javascript语法来构造payload:
javascript:alert(1)
10.xss之js输出
查看源码,可以看到前面有一段注释:
看得似懂非懂吧,也不知道跟绕过有什么关系,所以我试着读一下代码。
首先可以看到,我们的输入被赋值给名叫 jsvar 的变量:
然后我们继续往下翻,发现在< script >< /script >标签中也有这个变量,昨天已经说过了,这个标签的作用就是在 HTML 页面中插入一段 JavaScript。
所以这里应该就是体现了注释中的“输入动态的生成到了js中”:
所以还是从闭合语句的角度来做,构造payload:
'< /script >< script >alert(‘123’)< /script >
成功绕过:
总结:
今天学习的Pikachu的前面几关可以在昨天学习DVWA的基础上轻松过关,但是后面的8.htmlspecialchars、9.href输出、10.js输出,这三道题,让我学会了很多知识点,很有收获。
学到了两个新的绕过方法:
1.οnclick=‘alert(document.cookie)’
2.javascript:alert(1)