xss-lab靶场基础详解第1~3关

第一关

我去,还是得多学基础啊

复制代码
http://127.0.0.1/xss-labs/level1.php?name=<u>a</u>

这个看他的网站源码,可以看到他没有过滤,没有被编码

然后在name=<script>alert(1)</script>,就算过关了

第二关

这个是查看前端的源代码,可以看出来被实体化编码了,这个应该是前端编码的

前端点属性也能看到他是否实体化编码,

经过尝试,他直接将尖括号给实体化编码了,好像本来就是啊,有点废话了......

看了答案才知道他有两个输出,就是说我输入了一个,他返回了两个,第一个是被实体化了,但是第二个没有被实体化,但是被双引号括起来的,就是当做文本处理了,

为什么会有两个输出,只需要看浏览器页面就能够发现

思路:闭合双引号,重新写标签

但是有一点我非常疑惑的,到现在还是没有搞清楚,如果今天把这个搞清楚就下播

就是说我直接闭合了双引号,他还是没有下划线

<u>a</u>标签:给a字母下划线的意思

然后我想的是,会不会是闭合单引号,但是我只是闭合了单引号,我还在input标签内,所以就不能执行<u>标签

思路:闭合单引号,还要闭合标签,最后在自己输入<script>alert(1)</script>标签,就好了

所以最后答案是"><script>alert(1)</script>

第三关

也是想第二关一样的界面,我以为是和第二关一样的,其实不然

好像将双引号实体化编码了,我直接愣住了

这里我顶不住了,看答案发现,审查元素看字符是否被实体化有点不规范,而且也不能具体知道是用什么单引号,或者双引号括起来的,具体我也不知道为啥,

所以,之后建议直接审查网页源代码,也就是如下

例如,我输入的是"><script>alert(1)</script>,审查源代码的情况如下

这发现,他的闭合方式是单引号,而不是前端审查元素那个双引号!!!!这里是将双引号实体化编码成&quot;,然后单引号是不会被实体化的,我是看答案知道的,

继续闭合单引号,然后仔细的发现就是,单引号未被实体化,

<>尖括号被实体化了

意味着:标签不能用了,因为标签要有尖括号,但是标签里面的事件不需要尖括号啊(寻找<input>标签的其他事件)

继续测试,ok啊,还是大意了,虽然onfocus没有尖括号,但是有双引号,双引号也被实体化编码了,

' οnfοcus="alert('xss');" 这个不行,因为双引号被转义了,五个单引号也无法正确的进行匹配 的,单引号应该成对进行匹配,我是这么理解的,错了帮忙指正

' οnfοcus=alert('xss'); 这个也不行,我也不知道为啥,应该是单引号匹配问题

这里我看答案还有很多知识盲区,那就是

答案一

' οnfοcus='alert(123); //123不能写成英文,详解看思考一,末尾

' οnfοcus='alert(123) //有无分号均可,ai说的

理解(从网页源码理解)

关键源码如下:

<input name=keyword value=' ' οnfοcus='alert(123) '>

我直接将答案复制到源码里,便于理解

<input name=keyword value=' ' onlick='alert(123)'>

去掉部分,便于观看,这就是完整的攻击代码

<input value=' ' onlick='alert(123)'>

答案二

' οnfοcus=javascript:alert() '

一样的我直接拼接到源代码里面去

<input name=keyword value=' ' οnfοcus=javascript:alert() ' '>

仔细思考他的原理是什么,看了答案大概知道了

先看onfocus事件的整个处理流程

onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码

myfunction()函数可以替换成alert(1),这个就是执行alert(1),直接弹窗1,

也可以替换成javascript:alert(1),他的意思就是执行javascript:alert(1),也就是说用javascript来执行alert(1),也就是用js来执行alert(1)

区别:

<input name=keyword value=' ' οnfοcus=javascript:alert() ' '>

onfocus的语法规则,点击输入框会执行myfunction函数,也就是执行javascript:alert(1),

而javascript又使用伪协议(js语言)执行alert(1),也就是用js语言处理alert(1)

<input name=keyword value=' ' οnfοcus='alert(1) '>

属于input的语法规则,直接执行alert(1)

两者都差不多,换个形式而已

拓展思考

思考一:

<input value=' ' οnfοcus='alert(xss)'> //这是错误的xss语句,因为xss没加双引号,但是我还是 用这个通关了,我加了双引号,但是按理来说,他将双引号实体化编码之后,应该不识别 双引号才对啊,

<input value=' ' onlick='alert(xss)'> //正确的xss语句,xss里面不需要加双引号,就可以执行

ok,我懂了,

字符必须要加双引号,然后数字可以不加双引号,和onfocus和onclick无关

onclick和onfocus区别不大

思考二:

为啥javascript:alert(1),不加单引号,而οnfοcus='alert(1)'加了单引号,?

οnfοcus='alert(1)' 中的引号解释

可以不加引号,也就是onfocus后面的内容(属性值)有+-号,需要加引号,以免浏览器不识别,

javascript:alert(1)

这里为啥不加引号,看了a我的理解是不符合html规范,ai建议加引号 javascript:"alert(1)"

思考三:

单引号的区别,οnfοcus="alert('xss')" ?

这里的单双引号的用途都是一样的,也就是为了区分属性值和字符串常量的,也就是单双引号可以互换,这样也行οnfοcus='alert("xss")',

但是不能两个双引号一起写,这样浏览器会选择就近闭合,引发错误,如:οnfοcus='alert('xss')'

里面的字符换成数字的话,里面的双/单引号可以省略,如:οnfοcus='alert(1)'

其实外面的也可以省略的,也可以执行,但是少了代码的健壮性,所以最好加上单引号而已

如:οnfοcus=alert(1),也能执行

但是里面如果是字符或者字符串,里面就必须加引号,不然程序运行不了,因为这不符合语法规则

如:<input οnfοcus=alert(xss)>,执行错误

参考文章:

xss-labs靶场实战全通关详细过程(xss靶场详解)-CSDN博客

相关推荐
二川bro15 分钟前
依赖注入详解与案例(前端篇)
前端
神秘代码行者2 小时前
Vue项目Git提交流程集成
前端·vue.js·git
阿黄学技术3 小时前
Vite简单介绍
前端·前端框架·vue
264玫瑰资源库4 小时前
网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
java·开发语言·前端·bug·娱乐
济南壹软网络科技-专注源码开发数十年!4 小时前
盲盒源码_盲盒系统_盲盒定制开发 盲盒搭建前端教程
开发语言·前端·uni-app·php
哟哟耶耶5 小时前
react-13react中外部css引入以及style内联样式(动态className与动态style)
前端·css·react.js
A_aspectJ5 小时前
【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)高级用法
前端·学习·bootstrap
DT——5 小时前
ECMAScript 6(ES6):JavaScript 现代化的革命性升级
前端·javascript·ecmascript
qq_400552006 小时前
【React Hooks原理 - useCallback、useMemo】
前端·react.js·前端框架
互联网搬砖老肖6 小时前
深入理解 Web 架构:从基础到实践
前端·架构