xss-lab

测试payload:

发现并没有弹窗

xss-lab通关笔记_第5张图片

查看页面源代码发现,我们输入的内容在后端进行了htmlspecialchars()处理,尖括号被编码了

xss-lab通关笔记_第6张图片

所以我们不能自己构造js语句,而是要借助本来就有尖括号来执行我们的js,现在有两处我们可以插入,

不太好利用,而input标签我们可以用onclick属性

搜索框输入’ οnclick=’alert(/xss/)来构造input标签的闭合

发现input标签成功闭合,此时我们只需要点击搜索框就可以出发xss

xss-lab通关笔记_第7张图片

或者还有如下payload,//是为了注释掉后面的单引号

' οnfοcus=alert(/XSS/) autofocus //

源码:

xss-lab通关笔记_第8张图片

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

  • & (和号)成为 &
  • “ (双引号)成为 “
  • ‘ (单引号)成为 ‘
  • < (小于)成为 <
  • > (大于)成为 >

即把这些字符变的没有意义,其只是普通字符,浏览器不会去解析

第四关

输入test返回test典型的反射型xss

xss-lab通关笔记_第9张图片

先输入


看一下效果

xss-lab通关笔记_第10张图片

可见第一处肯定是对参数进行了htmlspecialchars()处理,第二处应该是通过了strplace(不管是str_replace还是preg_replace)处理

那么依然采用的三关的方法,闭合input

搜索框输入:” οnfοcus=alert(/XSS/) autofocus //

成功弹窗

源代码

xss-lab通关笔记_第11张图片

第五关

标准的反射型xss

输入

"> //

网页源码可以看到,给我在script中间加了个横线,猜测后端可能是用strplace匹配到script字符然后替换为scr_ipt

既然匹配script标签,那就尝试使用img标签试试

"> //

发现也匹配了并且给我加了横线

既然这样,猜测其他标签也差不多应该也都匹配了,那就尝试payload变形中的编码绕过,输入:

">click me ! //

成功

且页面出现clikeme超链接,点击后成功触发xss

xss-lab通关笔记_第12张图片

xss-lab通关笔记_第13张图片

源码

xss-lab通关笔记_第14张图片

第六关

payload同第五关就能过关

源代码中看只是增加几种过滤

xss-lab通关笔记_第15张图片

第七关

典型的反射型xss

xss-lab通关笔记_第16张图片

尝试

">//
">click me!//
">//
" οnfοcus=alert(/XSS/) autofocus //

发现script,on,href,src被过滤掉了

这样使得绝大多数payload不能用

那就试试payload的变形

大小写

">" //

还是给我过滤掉了src

双写

">alert('XSS') //

成功

xss-lab通关笔记_第17张图片

源码:

xss-lab通关笔记_第18张图片

第八关

输入test后,test会被写入a标签的href属性

xss-lab通关笔记_第19张图片

尝试输入javascript:alert(/XSS/)

发现给我加了横线,猜测后端用了str_replace

尝试编码绕过,p的十进制编码为p ;

那么输入

javascript:alert(/XSS/)

就可以绕过过滤且成功xss

第九关

输入test,前端页面源码显示非法地址

寻思可能是后端检查输入参数是否包含http://字符串

输入http://,查看源码发现返回正常

我们又想构造如下a标签,而我们的输入必须包含http://,怎么办:

click me!

可以使用html的注释

即输入

javascript:alert(/XSS/)/*http://*/

输入后发现对script进行了替换

那我们进行编码,输入如下即可绕过str_replace():

javascript:alert(/XSS/)/*http://*/

成功xss

xss-lab通关笔记_第20张图片

源码:

xss-lab通关笔记_第21张图片

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

第十关

输入测试代码