寒假安全作业nginx-host绕过实例复现

news/2024/7/23 19:33:11 标签: nginx, 安全, mysql

1.测试环境搭建
LNMP架构的话,肯定就是linux、nginxmysql、php四大组件。在后面的复现中我们还会用到https的一部分知识,故这里的nginx就需要使用虚拟主机并且配置https证书,且具有php解析功能。

1.1 基础nginx配置
#1.创建web目录
mkdir -p /var/www/aaa/

#2.配置nginx配置文件
/usr/local/nginx/conf/nginx.conf

#3.文件内容添加server模块
server {
listen 80;
server_name www.aaa.com;
root “/var/www/aaa/nginxhost/web”;
index index.html index.php;

    location / {
    try_files $uri $uri/ /index.php;
    }
    location ~ \.php(.*)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;
    }

}

1.2 代码部署+数据库配置
#1.将代码部署到指定位置(源码在评论区给出)
mv /home/batman/nginxhost .
#2.测试页面
在这里插入图片描述
#3.给tmp文件赋权
[root@blackstone web]# chmod 777 /var/www/aaa/nginxhost/protected/tmp
1
2
再次测试:
在这里插入图片描述
#4. 数据库对接 在对应目录下输入mysql -uroot -p密码 即可
[root@blackstone nginxhost]# cd /var/www/aaa/nginxhost

mysql> create database security;
Query OK, 1 row affected (0.00 sec)
mysql> use security;
Database changed
mysql> source initialize.sql
在开始之前我们浅浅分析一下数据库的大致结构,并插入flag
#flags就是我们需要获取的数据,两个字段构成
mysql> show columns from flags;
±------±-----------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±-----------------±-----±----±--------±---------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| flag | varchar(256) | YES | | NULL | |
±------±-----------------±-----±----±--------±---------------+
2 rows in set (0.00 sec)

#这里是一个用户注册的数据表,四个字段,id、username、passsword、email
mysql> show columns from users;
±---------±-----------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±---------±-----------------±-----±----±--------±---------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(256) | NO | UNI | NULL | |
| password | varchar(32) | NO | | NULL | |
| email | varchar(256) | YES | | NULL | |
±---------±-----------------±-----±----±--------±---------------+
4 rows in set (0.00 sec)

#我们插入flag
mysql> insert into flags (flag) values (‘mygod,you are a hacker!’);
Query OK, 1 row affected (0.01 sec)

mysql> select * from flags;
±—±------------------------+
| id | flag |
±—±------------------------+
| 2 | mygod,you are a hacker! |
±—±------------------------+
1 row in set (0.00 sec)
测试登陆页面的功能:

运气好的话会有一个报错:Fatal error: Class ‘MySQLi’ not found in /var/www/aaa/nginxhost/protected/lib/core.php on line 280
这是因为当前的php内部没有mysqli这个模块需要扩展安装,首先我们需要确定php的安装版本,下载对应的源码包进行重新安装:
php官网:https://www.php.net/releases/
1.3 https配置
随着越来越多的网站接入HTTPS,因此Nginx中仅配置HTTP还不够,往往还需要监听443端口的请求,但在以前学习过HTTP/HTTPS的朋友知道,HTTPS为了确保通信安全,所以服务端需配置对应的数字证书,当项目使用Nginx作为网关时,那么证书在Nginx中也需要配置,接下来简单聊一下关于SSL证书配置过程:

1.先去CA机构或从云控制台中申请对应的SSL证书,审核通过后下载Nginx版本的证书。

这里没有申请证书,由于是测试环境我们就使用openssl生成一个自签名证书
2.下载数字证书后,完整的文件总共有三个: .crt、.key、.pem

.crt:数字证书文件,.crt是.pem的拓展文件,因此有些人下载后可能没有。
.key:服务器的私钥文件,及非对称加密的私钥,用于解密公钥传输的数据。
.pem:Base64-encoded编码格式的源证书文本文件,可自行根需求修改拓展名。
3.在Nginx目录下新建certificate目录,并将下载好的证书/私钥等文件上传至该目录。

#这里的配置在1.3.1 中已经自己生成了对应的配置

4.最后修改一下nginx.conf文件即可,如下:
在这里插入图片描述
测试访问效果:
在这里插入图片描述
2.sql注入漏洞挖掘
这里由于暂时未系统的了解sql注入,故对其进行一个简单的叙述即可,重点我们放在host字段绕过上。

2.1 sql注入基本原理
这里用sqllab第一关来进行示例。第一关模拟了我们很常见的一个功能就是查询显示。我们从前端通过get传参,将id传递到后端php代码,后端的php代码接收到了参数。将参数不加任何过滤的拼接进入sql语句内部,由此引发的安全漏洞会导致恶意的数据库语句执行,小到窃取敏感数据,大到恶意删库跑路。实际环境中会有严密的过滤函数处理数据,而今天我们体会一下其原理即可:
在这里插入图片描述
我们加入单引号:产生了报错,则说明此参数被代入sql语句了,有安全风险。也可以说此处存在注入点
在这里插入图片描述
2.2 本例中的注入点
本着找注入点的目的,我们查看这套源码的控件,看里面有没有可以利用的sql语句。

我们找到controller里面的maincontroller.php可以看到,此处有三个功能函数,session验证、登陆验证、注册新用户。

我们只能后面两个函数,首先是这里的actionlogin函数。
在这里插入图片描述在这里插入图片描述

2.3 FILTER_VALIDATE_EMAIL绕过
RFC 3696规定,邮箱地址分为local part和domain part两部分。local part中包含特殊字符,需要如下处理:

将特殊字符用\转义,如Joe’Blow@example.com
或将local part包裹在双引号中,如"Joe’Blow"@example.com
local part长度不超过64个字符
虽然PHP没有完全按照RFC 3696进行检测,但支持上述第2种写法。所以,我们可以利用之绕过FILTER_VALIDATE_EMAIL的检测。

因为代码中邮箱是用户名、@、Host三者拼接而成,但用户名是经过了转义的,所以单引号只能放在Host中。我们可以传入用户名为"name,Host为is’“@.aaa.com,最后拼接出来的邮箱为"nameis’”@aaa.com。这个邮箱是合法的。
在这里插入图片描述
3.HOST绕过
我们看看上面修改该过host之后接收到的数据时什么样的:
在这里插入图片描述
3.1 冒号号分割host字段
Nginx在处理Host的时候,会将Host用冒号分割成hostname和port,port部分被丢弃。所以,我们可以设置Host为www.aaa.com:'"@aaa.com即可绕过。

查看效果:很明显产生了报错,我们的注入点应当已经注入成功
在这里插入图片描述


http://www.niftyadmin.cn/n/56936.html

相关文章

【算法基础】前缀和与差分

😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法💪种一棵树最好是十年前其次是现在1.什么是前缀和前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身&#x…

java多线程开发

1.并发和并行 并发:同一时间段内多个任务同时进行。 并行:同一时间点多个任务同时进行。 2.进程线程 进程(Process):进程是程序的一次动态执行过程,它经历了从代码加载、执行、到执行完毕的一个完整过程…

Springboot毕业生生活用品出售网站系统-java ssm

(a) 管理员;管理员进入系统主要功能包括个人中心,用户管理,商家管理,用品分类管理,用品信息管理,系统管理,订单管理等功能并进行操作。 (b) 商家;商家进入系统主要功能包括个人中心&…

java ssm集装箱码头TOS系统调度模块的设计与实现

由于历史和经济体制的原因,国内码头物流企业依然保持大而全的经营模式。企业自己建码头、场地、经营集装箱运输车辆。不过近几年来随着经济改革的进一步深入和竞争的激烈,一些大型的码头物流企业逐步打破以前的经营模式,其中最明显的特征就是…

python的opencv操作记录11——阈值分割

文章目录传统图像处理分割阈值分割一个应用场景opencv库中的阈值分割固定阈值THRESH_OTSU 大津法阈值自适应阈值传统图像处理分割 现在提到图像分割,很多人会直接想到当前火爆的深度学习的各种分割网络,比如实例分割,语义分割等。其实在传统…

软件设计(九)

软件设计(八)https://blog.csdn.net/ke1ying/article/details/128954569?spm1001.2014.3001.5501 81、模块A将学生信息,即学生姓名、学号、手机等放到一个结构体系中,传递给模块B,模块A和B之间的耦合类型为 什么耦合…

AOP面向切面编程思想。

目录 一、AOP工作流程 1、基本概念 2、AOP工作流程 二、AOP核心配置 1、AOP切入点表达式 2、AOP通知类型 三、AOP通知获取数据 1、获取参数 2、获取返回值 3、获取异常 四、AOP事务管理 1、Spring事务简介 2、Spring事务角色 3、事务属性 一、AOP工作流程 1、…

Flowable进阶学习(十)定时器、ServiceTask服务任务、ScriptTask脚本任务

文章目录一、定时器1. 流程定义定时激活2. 流程实例定时挂起3. 定时任务执行过程ServiceTask 服务任务委托表达式表达式类中字段ScriptTask 脚本任务JS TASK一、定时器 相关知识链接阅读:事件网关——定时器启动事件 1. 流程定义定时激活 可以通过activateProces…