xss-labs-master靶机是xss-labs作者在github上发布的后来不知道为什么就把它删了,可能是因为这个靶机属于静态页面有一个通用的推广方式(具体在后面),不过还是希望读者使用实战中的攻击手段学习,这个靶机是对XSS漏洞的专项练习,一共有二十关,也是小白的看门砖吧!比如现在的我!大哭!!!!
- 在这篇文章中,默认读者已有WEB渗透测试相关知识,以及PHP、HTML等相关知识。
xss-labs-master通关宝典
第一关 不使用过滤器
a、后台代码
<!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>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
b、分析
这关只给一个图片,根据图片可以知道这关容易,而链接上有一个参数name,说明突破口再name这里,根据代码我们可以看出,代码是将用户以GET方式提交的参数name,没有做任何防御措施就直接显示在HTML页面中,所以将使用<script>alert('xss')</script>
放入name变量中即可。
c、方法
这里就是直接用脚本的就行,没有方法可言。
d、注入语句
http://靶机网址/xss-labs-master/level1.php?name=<script>alert(/xss/)</script>
第二关 闭合标签
a、后台代码
<!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>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
b、分析
这关我们可以发现多了一个文本框,我们先用之前的语句填入文本框里面,发现不行,什么有了防御机制,那么我们看看源代码,它将我们输入的值给了value,然后它再传给了一个htmlspecialchars
函数,这个函数是把预定义的字符转换为 HTML 实体,说明把<script>
标签吃掉了,那么我们的突破口就在value这里,我们可以通过闭合标签,使得<input name=keyword value="'.$str.'">
这一句就闭合掉,即在<script>alert('xss')</script>
前面加">
,对前面input标签进行闭合。
htmlspecialchars
函数快查链接:这里
c、方法
这里就是我们使用闭合的方法,就是闭合了<input>
标签,产生新的执行语句。
d、注入语句
http://192.168.226.128/xss-labs-master/level2.php?keyword="><script>alert(/xss/)</script>
第三关 单引号闭合并添加事件
a、后台代码
<!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>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</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/)
第四关 双引号闭合并添加事件
a、后台代码
<!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>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level4.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</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/)
第五关 javascript伪协议
a、后台代码
<!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