前言
在 t00ls 看见发了个钓鱼网站的源码,简单在本地搭建起来,用我在B站看过几集PHP视频的实力来一场说审就审的 “伪” 代码审计之旅,不是很懂写得不好请见谅。
前台 SQL注入
看一下login.php的代码,发现把数据传入的数据库没有任何处理,直接拼接到SQL语句中
跟进 fetch0ne 函数
复现,(找不到后台的时候打个XSS说不定有惊喜)
ajax.php第69行
整个站都是注入,啊这…..
后台漏洞
后台上传文件的文件名都被写死了,删除操作直接sql拼接,就不看了。
备份位置导致的SQL注入
首先是判断是否登录,然后 btnSubmit 和 arrTables 不能为空,然后循环 arrTables ,把 $table 拼接到SQL语句
后台显示的功能没有相关的前端页面,可以直接访问相关的URL
一开始看代码尝试自己构造的时候发现每次循环取的是第一个字符
然后就想到了数组就可以取出表名,表名使用了 ` 反引号,所以构造payload如下
数据恢复导致getshell (假的)
包含解压功能的php位置没写对,自己手工改了一下
大概的流程:当 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/。
当传入的不是 .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);
如果不是分号结尾就会数据恢复成功,读取不了内容
任意文件删除
# db_import.php
if (('delete' == $_GET['action']) && (!empty($_GET['file'])))
{
if (unlink($dataDir . $_GET['file']))
{
header("location: ?");
exit();
}
}
file 没做处理,可以直接跳目录删除文件
很明显 download.php 里面的 file 就做了处理,导致不了任意文件下载
可能还有很多漏洞,太菜了看不下去了,睡觉…..