xss各种姿势的学习(绕过)及重要总结
优采云 发布时间: 2022-04-29 08:15xss各种姿势的学习(绕过)及重要总结
靶场搭建
靶场下载地址:
搭建很简单【】这里就不讲了。
这里也可以像我一样直接用别人搭建好的公共靶场:。进入然后点击游戏挑战即可。不过因为是别人搭载的服务器,有可能会有加载过慢等等的问题,所以建议还是搭在本地练习。
个人重要总结
第一点:F12查看网络中的响应包、右键查看页面源代码和F12查看元素的区别
先来看F12查看网络中的响应包、右键查看页面源代码和F12查看元素的区别:
F12查看网络中的响应包:
右键查看页面源代码:
上面这两个都是一样的,查看的都是最原始的页面源代码。
其中能正确判断闭合是用'单引号还是"双引号,输出点有没有被实体编码等等;
F12查看元素:这种无法正确判断闭合是用'单引号还是"双引号,输出点有没有被实体编码
所以这里总结出来一点,
就是xss的时候,先输入666(用来判断容易被发现)
然后优先看右键点击查看页面源代码,先判断闭合是要用'单引号还是"双引号,输出点有没有被实体编码等等
因为这个是最原始的页面源代码,也可以F12查看网络里的响应包,这两种是一样的;
而F12查看元素是源代码 + 网页js渲染,有点不太一样,不是最原始的页面源代码。不过有时候这两个得结合在一起看。
右键查看页面源代码或F12查看网络中的响应包:就是别人服务器发送到浏览器的原封不动的代码,也就是最原始的代码。<br style="outline: 0px;" /><br style="outline: 0px;" />(F12)检查元素:看到的就是最终的html代码。即:源代码 + 网页js渲染 。<br style="outline: 0px;" /><br style="outline: 0px;" />【注】在源代码中找不到的代码,是在浏览器执行js动态生成的。<br style="outline: 0px;" />
优先看右键点击查看页面源代码的原因:
这个是最原始的页面源代码。
像level3中value在F12中是"双引号闭合,而右键查看却是'单引号闭合,结果是'单引号闭合最后能成功;还有被实体编码了也是右键查看才能看的出来。
根据这些种种原因,还是优先看右键点击查看源代码的页面源代码,先把上面这些判断清楚,然后次看F12查看元素。不过有时候这两个得结合在一起看。
第二点:属性的属性值是否要加引号
属性名,像事件属性,比如onclick,onerror这样的,它们后面的属性值的引号可加可不加。
比如onerror=alert(1)和onerror="alert(1)"都是可行的。不过如果没有把引号给过滤掉,能加最好还是要加。
而src属性的属性值要加引号,但是也不是必须的。
像less15关的src属性的属性值就必须要加引号才能成功;而像
<ImG sRc=1 onerRor=alert(1);>
这样在有的场合也能成功。所以一切还是要具体情况具体分析吧。
第三点:属性的属性值要加引号的话,引号不能重复
举例:
x不行,<br style="outline: 0px;" />x可以<br style="outline: 0px;" />
第四点:单引号、双引号和反引号
如果是在html标签中,我们可以不用引号;
如果是在javascript的函数中,我们可以用反引号代替单双引号。
举例:
1可以,<br style="outline: 0px;" /><img src=`1` onerror=alert(1);>不行;<br style="outline: 0px;" /><br style="outline: 0px;" />1可以,<br style="outline: 0px;" />1不行;<br style="outline: 0px;" /><br style="outline: 0px;" />x可以,<br style="outline: 0px;" />x可以;<br style="outline: 0px;" />
第五点:Javascript引擎特性和js代码中需要注意的点
js代码中,利用空格,回车,tab键,切记只有""包裹的js代码才可以随便利用空格,回车,tab键,比如src="java script:xxxx",而这样不行:src=java script:xxxx。而且回车、换行不支持在on事件中使用,空格可以
Javascript引擎特性:Javascript语句通常以分号结尾,但是如果引擎判断一条语句完整的话,且结尾有换行符,就可以省略分号。
例:
var a = 1<br style="outline: 0px;" />var b = 2;<br style="outline: 0px;" />//上述语句都正确<br style="outline: 0px;" />
绕过姿势
这里总结了些绕过姿势,无论在实战还是靶场中的学习都能用上。也可以看看这两篇文章:XSS过滤绕过速查表()
XSS之绕过简单WAF总结()
空格被过滤的情况
用/代替空格
<br style="outline: 0px;" />
用回车符CR(%0d) 和换行符LF(%0a)取代空格
在HTML中%0a和%0d是可以当成空格使用的。
<br style="outline: 0px;" />
关键字被过滤的情况用标签(个人感觉比较少被过滤,起码比,即可成功弹框,那么我们也就成功了:
后台源代码分析
通过$_GET["name"],获取name的值,没有过滤通过echo直接进行了输出
level2:双引号尖括号闭合
过程
这里我们在搜索框输入,可以发现其回显在了页面上,但是却没有弹框。
这里可以看到标红的第1个点处我们的payload变成黑色了,那么第1个点肯定没希望了。
这里再多放一个右键点击查看源代码的图,从这里我们才能看出来端倪,其中第一个点的尖括号是被实体编码了。
F12看元素看不出来第一个点的尖括号是被实体编码了:
从这里我们可以看出右键点击查看源代码和F12检查元素查看页面源代码有些许不同:
右键查看页面源代码或F12查看网络中的响应包:就是别人服务器发送到浏览器的原封不动的代码,也就是最原始的代码。(F12)检查元素:看到的就是最终的html代码。即:源代码 + 网页js渲染 。<br style="outline: 0px;" /><br style="outline: 0px;" />【注】在源代码中找不到的代码,是在浏览器执行js动态生成的。<br style="outline: 0px;" />
那么这里回到上面标红的第2个点,第2个点会把我们输入的payload原封不动、不进行过滤的变成keyword的value。
那么这里我们把前面的"和input标签闭合:">,即可成功
后台源代码分析
echo的时候,采用htmlspecialchars函数把预定义的字符转换为 HTML 实体;然而获取浏览器提交的keyword值,未进行如此转换,输出在。
如果是keyword提交的是,返回的就会是,javascript引擎并不会执行//,php处理后返回的html就会是 //">,//是注释的作用,javascript引擎执行,最后成功
level3:事件绕过和单引号闭合
过程
输入payload">
后台源代码分析
对get请求的keyword参数,用str_replace()函数过滤掉尖括号,返回给keyword的值;
采用htmlspecialchars函数把预定义的字符转换为 HTML 实体后用echo直接输出在返回的html中。
less5:javascript伪协议绕过
过程
先右键查看原始的页面源代码,发现是双引号闭合,输入尖括号发现第一个输出点被实体编码,而第二个输出点没被实体编码,构造payload">alert(1)
那么这里利用没有过滤尖括号,构造a标签再尝试利用a标签的href属性执行javascript伪协议,payload:">
然后页面出现了xss,点击就成功了。
后台源代码分析
<p>