zkaq-代码执行
命令执行漏洞
用户传入的参数,会被当成系统指令来执行,指令内容用户可控
命令执行的危险函数
1 | system() => 直接执行系统指令,并且会打印出我们的结果 |
浏览器特殊协议(查看网页源码) view-source:
exec()、shell_exec()等无回显代码,查看命令有无成功执行的技巧
1 | 通过 > 符号,将结果输出到某个文件里面,结果覆盖保存 |
没有回显时,怎么判断我们的指令有没有执行
- dnslog.cn 通过dnslog将数据外带
- 将指令的结果输出到一个文本文件中,然后去访问这个文件
IBOS代码执行
全局搜危险函数system()
无果
看看exec()
函数
{$mysqlBin}
是一个变量,它包含了 MySQL 安装目录中mysqldump
可执行文件的路径。mysqldump
是 MySQL 提供的一个命令行工具,用于备份或导出 MySQL 数据库中的数据。--force
和--quick
是mysqldump
命令的选项,分别用于强制导出和快速导出数据。$command1
、$command2
、$command3
等都是一些变量,它们可能包含其他的mysqldump
命令选项或者参数。--add-drop-table
是mysqldump
的一个选项,表示在导出数据之前先删除已存在的表。--host
、--user
、--password
等选项用于指定数据库连接的主机、用户名和密码。{$db["host"]}
、{$db["username"]}
、{$db["password"]}
等是一些变量,它们分别存储了数据库连接信息中的主机、用户名和密码。{$db["dbname"]}
是一个变量,它存储了要导出数据的数据库名称。$tablesstr
可能是一个变量,它存储了要导出数据的特定表格或者是一些表格的列表。>
用于将命令的输出重定向到指定的文件中,$dumpFile
是一个变量,它存储了导出的数据将要保存的文件路径。
从此处开始向上寻找,看dumpFile都经过了怎样的处理
353行对已存在的名为dumpFile文件进行删除
352行
$dumpFile
的赋值过程将 core\utils\PATH_ROOT
返回的项目根目录路径与 $backupFileName
变量存储的文件名拼接起来,并在最后添加 .sql
扩展名,得到一个完整的备份文件路径。
继续向上查找$backupFileName的来源
$backupFileName
的赋值过程首先将备份文件的目录路径与经过特定字符替换的文件名拼接起来,得到了备份文件的完整路径。
再次跟进拼接的变量$fileName
fileName使用getRequest方法得到,
根据定义的类core\utils\Env,找到core\utils\Env文件,在文件内搜索getRequest方法
$fileName只传了一个参数,所以只有变量key是可控的,同时变量type的值默认是“GP”,所以case选项只有G和P两个选择
当type=G的时候,变量var=request使用$request->getQuery($key, $defaultValue)方法获取特定键的值
判断是否存在get方式得到的name,如果存在则返回,不存在返回默认值(空)
此时猜想getPost函数是判断是否存在post方式得到的name
另外
若要执行shell_exec函数,还需要满足method不等于multivol
去网站查看数据备份功能
bp抓包将method的值,改了
filename改一下,打开计算机
成功给打开
写入一句话木马