前言

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

搭建起来长这个样子
image.png

前台 SQL注入

看一下login.php的代码,发现把数据传入的数据库没有任何处理,直接拼接到SQL语句中
image.png
跟进 fetch0ne 函数
image.png
复现,(找不到后台的时候打个XSS说不定有惊喜)
image.png
ajax.php第69行
image.png
image.png
整个站都是注入,啊这…..

后台漏洞

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

备份位置导致的SQL注入

首先是判断是否登录,然后 btnSubmit 和 arrTables 不能为空,然后循环 arrTables ,把 $table 拼接到SQL语句
image.png
后台显示的功能没有相关的前端页面,可以直接访问相关的URL
image.png
一开始看代码尝试自己构造的时候发现每次循环取的是第一个字符
image.png
然后就想到了数组就可以取出表名,表名使用了 ` 反引号,所以构造payload如下
image.png

数据恢复导致getshell (假的)

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

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

正常打包一个php文件为zip,放在网站根目录,进行调用。$filename=1.zip 被 改名为 1.sql ,但是解压的文件名是使用的 $oriFilename, 文件已经解压在 /网站目录/data/db/。
image.png
当传入的不是 .zip 的时候会执行打开文件操作,当在读取文件的时候碰到 ; 分号结尾就会带入SQL查询,SQL报错导致读取不了完整的php内容

  1. $fp = fopen($dataDir . $filename, "r") OR die('File not found.');
  2. $sql = '';
  3. while (!feof($fp))
  4. {
  5. $line = trim(fgets($fp, 512 * 1024));
  6. if (ereg(';$', $line)) // 正则匹配 ;结尾
  7. {
  8. $sql .= $line;
  9. $db->query($sql);
  10. $sql = '';
  11. }
  12. else if (!ereg("^(//|--)", $line))
  13. {
  14. $sql .= $line;
  15. }
  16. }
  17. fclose($fp);

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

任意文件删除

  1. # db_import.php
  2. if (('delete' == $_GET['action']) && (!empty($_GET['file'])))
  3. {
  4. if (unlink($dataDir . $_GET['file']))
  5. {
  6. header("location: ?");
  7. exit();
  8. }
  9. }

file 没做处理,可以直接跳目录删除文件
image.png
很明显 download.php 里面的 file 就做了处理,导致不了任意文件下载
image.png
可能还有很多漏洞,太菜了看不下去了,睡觉…..