大家好,又见面了,我是你们的朋友全栈君。
A7——Missing Functional Level Access Control
应用层访问控制缺失。
Directory Traversal – Directories
low
未对输入的目录进行限制,可以访问任意目录。
代码语言:javascript复制http://localhost/bwapp/directory_traversal_2.php?directory=documents/../../../../
代码语言:javascript复制function show_directory($directory)
{
// Checks whether a file or directory exists
if(file_exists($directory))
{
$dp = opendir($directory);
while($line = readdir($dp))
{
if($line != "." && $line != ".." && $line != ".htaccess")
{
echo "<a href="" . $directory . "/" . $line . "" target="_blank">" . $line . "</a><br />";
}
}
}
medium
代码语言:javascript复制 if(strpos($data, "../") !== false ||
strpos($data, "..\") !== false ||
strpos($data, "/..") !== false ||
strpos($data, "..") !== false ||
strpos($data, ".") !== false)
这里在源码中限制了一些符号的使用,但是directory
变量的值未做限制,仍可访问bwapp目录下任意文件。
http://localhost/bwapp/directory_traversal_2.php?directory=evil
high
这里需要比较我们要访问的目录是不是在我们的目录下。从逻辑上解决了目录遍历的问题。
代码语言:javascript复制$directory_traversal_error = directory_traversal_check_3($directory, $base_path = "./documents");
function directory_traversal_check_3($user_path,$base_path = "")
{
$directory_traversal_error = "";
$real_base_path = realpath($base_path);
$real_user_path = realpath($user_path);
if(strpos($real_user_path, $real_base_path) === false)
{
$directory_traversal_error = "<font color="red">An error occurred, please try again.</font>";
}
其中,strpos(string, find, [start])
查找find在string中第一次中出现的位置,并将位置返回。
base path: ./documents
real base path: H:phpstudyWWWbwappdocuments
user path: documents/
real user path: H:phpstudyWWWbwappdocuments
Directory Traversal – Files
low
代码语言:javascript复制http://localhost/bwapp/directory_traversal_1.php?page=666
还可以结合目录遍历访问上层目录文件
代码语言:javascript复制http://localhost/bwapp/directory_traversal_1.php?page=../../manual.chm
medium
同目录遍历medium,只限制了目录遍历,仍可使用文件名访问当前目录任意文件。
high
同目录遍历high,使用real user path
进行比较。
Host Header Attack (Cache Poisoning)
low
修改要访问的页面
medium
限制了首页页面。
代码语言:javascript复制if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{
$session_id = session_id();
?>
<p>Click <a href="http://<?php echo $_SERVER["HTTP_HOST"]?>/bWAPP/portal.php">here</a> to go back to the portal.</p>
<?php
}
else
{
?>
<p>Click <a href="portal.php">here</a> to go back to the portal.</p>
<?php
}
?>
Remote & Local File Inclusion (RFI/LFI)
low
代码语言:javascript复制http://localhost/bwapp/rlfi.php?language=666&action=go
medium
代码语言:javascript复制http://localhost/bwapp/rlfi.php?language=aim&action=go
在medium下,仍有远程文件包含漏洞。
high
限制了可以访问的文件。
代码语言:javascript复制case "2" :
$available_languages = array("lang_en.php", "lang_fr.php", "lang_nl.php");
$language = $_GET["language"] . ".php";
Restrict Device Access
low
看到题目就知道这个应该是去修改HTTP头。 在网上找了一段iphone浏览器的浏览器头,然后替换
代码语言:javascript复制Mozilla/5.0(iPhone;U;CPUiPhoneOS4_0likeMacOSX;en-us)AppleWebKit/532.9(KHTML,likeGecko)
Version/4.0.5Mobile/8A293Safari/6531.22.7
成功绕过
medium and high
这个题有一点很不同的是,在medium和high中并没有给出对于这个漏洞的解决方法,三个难度都使用了同样的校验函数。 这大概也就是爬虫程序可以更换http头绕过部分检测的原因吧。
代码语言:javascript复制function check_user_agent()
{
$user_agent = $_SERVER["HTTP_USER_AGENT"];
// Debugging
// echo $user_agent;
$authorized_device = false;
$devices = array("iPhone", "iPad", "iPod", "Android");
// Searches for a string in an array
foreach($devices as $str)
{
// echo $str;
if(strpos($user_agent, $str) !== false)
{
// Debugging
// echo $user_agent . " contains the word " . $str;
$authorized_device = true;
}
}
Restrict Folder Access
其实一开始因为没有清除浏览器缓存,所以我并没有发现low和medium有什么不同……于是先去读了一遍源码,可以发现在三个难度中,都与一个“.htaccesss”文件有关。搜索了一下这个是什么。
概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
所以看来这个应该就是与访问权限有关的文件。
比对一下low和medium的源码发现,在low中,会将“.htaccesss”这个文件删除;而在medium中,会新建这个文件并写入“Deny from all”。
上网快速搜寻了一下这个东西的用法。
https://stackoverflow.com/questions/19118482/deny-access-to-one-specific-folder-in-htaccess
意思就是说,例如在“site/includes/.htaccess”写入“Deny from all”时,“site/includes/.htaccess”该目录下的所有内容都不能被访问。
到这里的话思路大概就清楚了,在low中可以通过直接访问url的方式,在log off后继续访问敏感文件。而在medium和high中,进行了正确的配置修复了漏洞。
low
直接访问http://localhost/bwapp/documents/bWAPP_intro.pdf
case "0" :
// Deletes the '.htaccesss' file
if(file_exists($directory . "/.htaccess"))
{
unlink($directory . "/.htaccess");
}
$dp = opendir($directory);
while($line = readdir($dp))
{
if($line != "." && $line != "..")
{
echo "<a href="" . $directory . "/" . $line . "" target="_blank">" . $line . "</a><br />";
}
}
break;
medium
访问http://localhost/bwapp/documents/bWAPP_intro.pdf
后出现
case "1" :
// Creates the '.htaccess' file
$fp = fopen($directory . "/.htaccess", "w");
fputs($fp, "Deny from all", 200);
fclose($fp);
$dp = opendir($directory);
while($line = readdir($dp))
{
if($line != "." && $line != ".." && $line != ".htaccess")
{
echo "<a href="restrict_folder_access.php?file=" . $directory . "/" . $line . "">" . $line . "</a><br />";
}
}
break;
Server Side Request Forgery (SSRF)
low
这个一开始没想到怎么利用,去网上找了下payload,结果网上的弱智payload的文件路径和现在的版本似乎不太一样,耽误了点时间。
在”/evil”下有3个给供ssrf实验用的文件,其中分别包括了三个不同的bwapp的payload。
代码语言:javascript复制http://localhost/bwapp/rlfi.php?ip=127.0.0.1&language=http://localhost/bwapp/evil/ssrf-1.txt&action=go
ssrf-1.txt
ssrf-2.txt,使用XXE访问敏感文件
ssrf-3.txt,演示Samsung SmartTV (CVE-2013-4890)
XML External Entity Attacks (XXE)
low
将<reset><login>bee</login><secret>Any bugs?</secret></reset>
替换为
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [ <!ENTITY popped SYSTEM "http://127.0.0.1/bWAPP/666"> ]>
<reset><login>&popped;</login><secret>Any bugs?</secret></reset>
即
在response中 可以看到返回结果
源代码
代码语言:javascript复制ini_set("display_errors",1);
$xml = simplexml_load_string($body);
// Debugging
// print_r($xml);
$login = $xml->login;
$secret = $xml->secret;
if($login && $login != "" && $secret)
{
// $login = mysqli_real_escape_string($link, $login);
// $secret = mysqli_real_escape_string($link, $secret);
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
// Debugging
// echo $sql;
$recordset = $link->query($sql);
medium
禁止了xml外部实体引用。 源代码
代码语言:javascript复制// Disables XML external entities. Doesn't work with older PHP versions!
// libxml_disable_entity_loader(true);
$xml = simplexml_load_string($body);
// Debugging
// print_r($xml);
$login = $_SESSION["login"];
$secret = $xml->secret;
if($secret)
{
$secret = mysqli_real_escape_string($link, $secret);
$sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";
// Debugging
// echo $sql;
$recordset = $link->query($sql);
防御
方案一、使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
其他语言:
Prevention_Cheat_Sheet”>https://www.owasp.org/index.php/XML_External_Entity(XXE)_Prevention_Cheat_Sheet
方案二、过滤用户提交的XML数据
关键词:,SYSTEM和PUBLIC。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190452.html原文链接:https://javaforall.cn