php代码审计

  1. php代码审计
    1. 1(2018HCTF-Warmup)
      1. 分析
      2. 解决
    2. 2

php代码审计

1(2018HCTF-Warmup)

分析

F12找到提示:source.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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

​ if (in_array($page, $whitelist)) {
​ return true;
​ }

​ $_page = mb_substr(
​ $page,
​ 0,
​ mb_strpos($page . '?', '?')
​ );
​ if (in_array($_page, $whitelist)) {
​ return true;
​ }

​ $_page = urldecode($page);
​ $_page = mb_substr(
​ $_page,
​ 0,
​ mb_strpos($_page . '?', '?')
​ );
​ if (in_array($_page, $whitelist)) {
​ return true;
​ }
​ echo "you can't see it";
​ return false;
​ }
}

if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

因为对php不太熟悉,所以还是看了蛮久的,所以详细解释一下

首先从最下面的if else看起,如果’file’这个变量不为空,并且是字符串,并且checkFile(‘file’)为真,则include这个文件

然后现在再去上面看checkFile这个函数:首先建了一个数组,里面有两个变量“source.php”,”hint.php”,然后if判断若传入的变量page为空或者不是字符串,则输出“you can’t see it”,并且return false。

然后是in_array这个函数,就是判断变量page是否在数组whitelist里面,如果在,return true。

接着是下面的mb_substr函数,就是从第0位开始,返回变量page的mb_strpos($page . ‘?’, ‘?’)位,而mb_strpos则是返回“?”在page里第一次出现的位置,$page . ‘?’就是在page后面加上一个’?’,防止page里面本来没有‘?’,简单地说,这两个函数合在一起就是把问号后面的东西通通丢掉,所以我们就可以在问号后面做文章。

在下面的urldecode函数就是对page进行url解码,因为”只有字母和数字[0-9a-zA-Z]、一些特殊符号”$-_.+!*’(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”

如果这三个in_array下来还是没有return true,则return false

解决

首先肯定是想着要checkFile为true,但是同时也需要能把包含flag的文件include出来,根据hint,flag应该在文件ffffllllaaaagggg中,刚开始想的是?file=source.php?ffffllllaaaagggg然后利用某些方法在include把前面的source.php隐去,但是找了一圈,似乎并没有这种方法,然后去看wp发现是利用/使得source.php成为一个不存在的目录,然后../返回上级目录,实测../只能多不能少,所以ffffllllaaaagggg应该是在根目录中,但是如果这个文件藏在某个目录里面的话,emmmm

payload:?file=hint.php?/../../../../ffffllllaaaagggg

​ 或者:?file=source.php?/../../../../ffffllllaaaagggg

2

文章标题:php代码审计

本文作者:Kyle

发布时间:2020-04-04, 23:14:51

最后更新:2020-09-19, 15:59:52

原始链接:https://silver2835.github.io/2020/04/04/php/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录