xss靶场注入

xss-labs靶场实战前十关(xss靶场详解)

XSS原理

  • 本质上是针对html的一种注入攻击,没有遵循数据与代码分离的原则,把用户输入的数据当作代码来执行
  • xss跨站脚本攻击是指恶意攻击者往Web页面里插入恶意脚本代码(包括当不限于js,flash等等),当用户浏览该页面时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的目的。为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,所以将跨站脚本攻击缩写为XSS。

level 1直接注入

代码如下:

<!DOCTYPE html><!--STATUS OK--><html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8">

<script>

window.alert = function()    <!--当有弹窗出现时,执行以下代码 -->

{

confirm("完成的不错!");         <!--confirm()方法用于显示一个带有指定消息和确定及取消按钮的对话框。我们xss一般验证就是爆一个弹窗出来-->

 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>

我们可以看到他的传参值点是test,而且传参值可以在页面中回显,下面又说了payload的长度为4,正好和上面的传参值字符长度对应上了

那么我们就可以得出结论了

现在开始进行xss测试,先使用最简单的不带任何绕过方式的js代码进行传参测试

level 2被转义了 闭合

源码:

<!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>

我们先使用第一题的payload进行测试

js代码直接嵌入到了input标签的value属性中

这个时候我们可以使用闭合input标签的方式进行绕过

level 3利用鼠标属性

使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素

但是默认是只编码双引号的,而且单引号无论如何都不转义。

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

- & (和号)成为 &

- " (双引号)成为 "

- ' (单引号)成为 '

- < (小于)成为 <

- > (大于)成为 >

先输入123456

 使用最开始的payload进行测试

构造payload我们使用单引号结合注释符号,直接把后面的东西给注释掉

level 4过滤

源码:

<!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>

利用onfocus,构建payload

level 5绕过

源码:

<!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>

<?php

ini_set("display_errors", 0);

$str = strtolower($_GET["keyword"]);

$str2=str_replace("<script","<scr_ipt",$str);

echo $str2;

$str3=str_replace("on","o_n",$str2);

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>

<form action=level5.php method=GET>

<input name=keyword  value="'.$str3.'">

<input type=submit name=submit value=搜索 />

</form>

</center>';

?>

<center><img src=level5.png></center>

<?php

echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";

?>

</body>

</html>

发现onclick被转义了,那么就换一个事件来进行测试

首先闭合value的值然后嵌入一个伪协议标签

添加一个标签得闭合前面的标签,构建payload

level 6大小写

源码:

<h1 align=center>欢迎来到level6</h1>

<?php

ini_set("display_errors", 0);

$str = $_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);

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>

<form action=level6.php method=GET>

<input name=keyword  value="'.$str6.'">

<input type=submit name=submit value=搜索 />

</form>

</center>';

?>

<center><img src=level6.png></center>

<?php

echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";

?>

</body>

</html>

输入关键字测试

看看大小写能不能绕过

大小写没有被过滤掉,这题能利用大小写进行绕过,所以我们可以用下面的方法,构造payload

level 7双写绕过

源码:

<!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="level8.php?keyword=nice try!";

}

</script>

<title>欢迎来到level7</title>

</head>

<body>

<h1 align=center>欢迎来到level7</h1>

<?php

ini_set("display_errors", 0);

$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);

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>

<form action=level7.php method=GET>

<input name=keyword  value="'.$str6.'">

<input type=submit name=submit value=搜索 />

</form>

</center>';

?>

<center><img src=level7.png></center>

<?php

echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";

?>

</body>

</html>

先上关键字试试看

双拼写绕过,方法有很多,这里我们用href属性标签,构造play

level 8字符实体绕过

源码:

<!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="level9.php?keyword=not bad!";

}

</script>

<title>欢迎来到level8</title>

</head>

<body>

<h1 align=center>欢迎来到level8</h1>

<?php

ini_set("display_errors", 0);

$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 '<center>

<form action=level8.php method=GET>

<input name=keyword  value="'.htmlspecialchars($str).'">

<input type=submit name=submit value=添加友情链接 />

</form>

</center>';

?>

<?php

 echo '<center><br>







<a href="'.$str7.'">友情链接</a></center>';

?>

<center><img src=level8.jpg></center>

<?php

echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";

?>

</body>

</html>

先输入123

还有过滤掉了src、data、onfocus、href、script、"(双引号)

隐藏属性自动Unicode解码javascript:alert()利用在线工具进行Unicode编码后得到,插入href里面

level 9查看有无http: //

本关是http://绕过检测,再将指定内容用注释符注释掉即可

level 10 hidden

源码:

<!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="level11.php?keyword=good job!";

}

</script>

<title>欢迎来到level10</title>

</head>

<body>

<h1 align=center>欢迎来到level10</h1>

<?php

ini_set("display_errors", 0);

$str = $_GET["keyword"];

$str11 = $_GET["t_sort"];

$str22=str_replace(">","",$str11);

$str33=str_replace("<","",$str22);

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>

<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>

</center>';

?>

<center><img src=level10.png></center>

<?php

echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";

?>

</body>

</html>

测试一下关键字

这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值