可以得到传入的name
值,会显示出来,并显示name
值的长度。
查看源码
将name
值插到了 之间。
主要考察反射型xss
没有对特殊字符进行过滤。
服务器是将我们的恶意代码原封不动的返回了,浏览器才能成功弹窗
查看一下level1.php
代码
发现<>
被编码成了html字符实体,<
变成了为了<
,>
变成了>
。
猜测在服务器端用htmlspecialchars()
函数对keyword
参数的值进行了处理。
可以看到插入到value
参数值中的恶意代码并没有被编码而是直接原样返回
但是问题是这里的js代码
在标签属性值中,浏览器是无法执行的。
既然上面的恶意代码被编码了,那么只能从属性值中的恶意代码处进行突破了。
要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。
将keyword
的参数值重新赋值">//
htmlspecialchars
函数— 将特殊字符转换为 HTML 实体。&
替换为&
,
"
替换为"
,'
替换为'
,<
替换为<
,>
替换为>
试了试,发现报错了。
查看源码
猜测这次是两处都使用了htmlspecialchars()
函数进行过滤
一下子懵掉了,查看level3.php代码
'onfocus=javascript:alert('xss')> //
发现没有直接弹窗,这是因为onfocus事件的特殊性造成的
onfocus
事件在对象获得焦点时发生。
仍然是GET传参。
keyword=
报错了,查看源码
和level3一样,对<>
进行了过滤。有标签,是双引号包裹
"onfocus=javascript:alert('xss')> //
第一个参数是要替换的字符串
第二个参数是替换后,要成为的字符串
第三个参数是字符串对象
keyword=
报错了,查看源码
htmlspecialchars
函数— 将特殊字符转换为 HTML 实体。
变成了
猜测使用了str_replace
函数进行替换。
使用keyword="onfocus=javascript:alert('xss') //
却报错了
查看源码
构造一个超链接,"> xss //
成功执行
箭头1:将GET
方式传递到服务器端的keyword
参数的值进行全小写的转换,然后赋值给str变量。
箭头2和3:通过str_replace()
函数来破坏变量值中的敏感字符的语义。
箭头4:通过htmlspecialchars()
函数处理之后显示到网页上,
箭头5:直接将进行敏感字符处理之后的变量值插入到标签
的value
属性值中。
首先使用keyword=
,发生报错
查看源码
使用keyword="onfocus=javascript:alert('xss') //
,发生报错
查看源码
构造超链接,keyword="> xss //
好家伙,试试大小写混写
keyword="> xss //
耶耶耶,成功了
使用keyword=
,试一试,报错了,查看源码
使用超链接 keyword="> xss //
,报错了,查源码
试一试,onfocus
事件,keyword=" onfocus=javascript:alert('xss') //
仍然报错,查看源码
使用大小写混用,还是不行。
使用双写关键字试一试,keyword=" oonnfocus=javascrscriptipt:alert('xss') //
箭头2,3,4,5,6 都是过滤一些关键词
使用双写,重叠写进行绕过
使用keyword=
试一试,报错了,看源码
箭头2,发现,传入的参数值是超链接的地址,script
被替换为scr_ipt
使用 事件触发测试:`keyword=" οnfοcus=javascript:alert(‘xss’)> // 报错了
将javascript:alert('xss')
进行Unicode编码
箭头1,将字符串进行全部小写
箭头2,将一些特殊的字符过滤掉,或者替换
箭头3,将过滤后的字符串作为超链接的地址
使用keyword=
试一试,报错了,查看源码
提示,链接不合法!,那我们换一个合法的链接,就百度链接吧,http://www.baidu.com
发现正常,没有报错,试试将javascript:alert('xss')
拼接进去,keyword=javascript:alert('xss') http://www.baidu.com
耶,没有提示不合法。可是仔细看,javascript
被javascr_ipt
给替换了
试了试大小写混用,失败了,将javascript:alert('xss')
进行Unicode编码
keyword=javascript:alert(1)//http://www.baidu.com
javascript:alert('xss')
和http://www.baidu.com
之间必须有//
查看level9.php的代码
箭头1,将一些特殊的字符进行过滤
箭头2,使用了strpos
函,判断传入的参数是否含有http://
使用keyword=
,发生报错,查看源码
看看哪一个标签能够被突破
使用keyword=&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"
只有t_sort
这个标签有反应。
使用keyword=&t_sort=">//
发现<
和>
被省略了,只能使用事件来触发
构造keyword=&t_sort=" type="text" onclick="alert('xss')
得知,起真实作用的参数是t_sort
,并对其进行了特殊字符的过滤。
使用keyword=
,发生报错
将URL的值作为参数传入t_ref
,有三个参数,t_link
,t_history
,t_sort
试一试看哪个起作用
keyword=
没有反应,查看源码
进行构造keyword=&t_sort=" type="text" onclick="alert('xss')