前言

在 t00ls 看见发了个钓鱼网站的源码,简单在本地搭建起来,用我在B站看过几集PHP视频的实力来一场说审就审的 “伪” 代码审计之旅,不是很懂写得不好请见谅。

搭建起来长这个样子

img

前台 SQL注入

看一下login.php的代码,发现把数据传入的数据库没有任何处理,直接拼接到SQL语句中

img

跟进 fetch0ne 函数

img

复现,(找不到后台的时候打个XSS说不定有惊喜)

img

ajax.php第69行

img

img

整个站都是注入,啊这…..

后台漏洞

后台上传文件的文件名都被写死了,删除操作直接sql拼接,就不看了。

img

备份位置导致的SQL注入

首先是判断是否登录,然后 btnSubmit 和 arrTables 不能为空,然后循环 arrTables ,把 $table 拼接到SQL语句

img

后台显示的功能没有相关的前端页面,可以直接访问相关的URL

img

一开始看代码尝试自己构造的时候发现每次循环取的是第一个字符

img

然后就想到了数组就可以取出表名,表名使用了 ` 反引号,所以构造payload如下

img

数据恢复导致getshell (假的)

包含解压功能的php位置没写对,自己手工改了一下

img

大概的流程:当 action=import 进入流程,file参数指定文件名(参数没做任何过滤,导致可以跳目录),正则匹配 .zip 后缀,如果不是 .zip 就不进入解压缩的循环。把 $filename 赋值给 $oriFilename,把 $filename 改成 .sql 后缀 ,然后对 $oriFilename 进行解压缩

if (('import' == $_GET['action']) && (!empty($_GET['file'])))
{
    $filename = $_GET['file'];
    $oriFilename = '';
    if (eregi('.zip$', $filename))
    {
        //解压缩
        $oriFilename = $filename;
        $filename = eregi_replace('.zip$', '.sql', $filename);
        //           require_once(ROOT_PATH . 'includes/classes/phpzip.php');
        require_once(ROOT_PATH . 'includes/phpzip.php');
        $zip = new phpzip();
        $zip->unzip($dataDir . $oriFilename, $dataDir); // 解压时的文件名
    }
    // 此时 $filename = 1.sql , 所以找不到文件
    $fp = fopen($dataDir . $filename, "r") OR die('File not found.');

正常打包一个php文件为zip,放在网站根目录,进行调用。$filename=1.zip 被 改名为 1.sql ,但是解压的文件名是使用的 $oriFilename, 文件已经解压在 /网站目录/data/db/。

img

当传入的不是 .zip 的时候会执行打开文件操作,当在读取文件的时候碰到 ; 分号结尾就会带入SQL查询,SQL报错导致读取不了完整的php内容

$fp = fopen($dataDir . $filename, "r") OR die('File not found.');
$sql = '';
while (!feof($fp))
{
  $line = trim(fgets($fp, 512 * 1024));
  if (ereg(';$', $line)) // 正则匹配 ;结尾
  {
    $sql .= $line;
    $db->query($sql);

    $sql = '';
  }
  else if (!ereg("^(//|--)", $line))
  {
    $sql .= $line;
  }
}
fclose($fp);

img

如果不是分号结尾就会数据恢复成功,读取不了内容

img

任意文件删除

# db_import.php

if (('delete' == $_GET['action']) && (!empty($_GET['file'])))
{          
  if (unlink($dataDir . $_GET['file']))
  {
    header("location: ?");
    exit();
  }
}

file 没做处理,可以直接跳目录删除文件

img

很明显 download.php 里面的 file 就做了处理,导致不了任意文件下载

img

可能还有很多漏洞,太菜了看不下去了,睡觉…..