原理
用户输入的数据被当做系统命令进行执行
函数
system()
他不需要echo输出、他可以返回多行结果exec()
没回显,要有echo才能输出。返回结果只有最后一行shell_exec()
没回显,要有echo才能输出.返回多行结果``
[反引号] 执行命令并且返回结果 (shell_exec 特殊写法)passthru()
执system特点一样 且其可以输出二进制,比如图像数据。popen()
执行命令才是核心
区别
- 代码执行:用户输入的数据当作后端代码执行
- 命令执行:用户输入的数据当作系统命令执行
代码执行 和 命令执行 (转换)
RCE (远程代码/命令执行) 可以通过漏洞拿下服务器
靶场实操
先对本地搭建的cms代码审计

shell_exec("{$mysqlBin}mysqldump --force --quick $command1 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" $command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\" \"{$db["dbname"]}\" $tablesstr > $dumpFile");
控制$dumpFile = $backupFileName . "-%s.sql";

提交并用burp抓包

修改数据包,将filename值修改到GET传参,值为上图

应该是写马成功了
访问一下看看

成功,

找到flag
Comments | NOTHING