[网鼎杯 2018]Comment

博客内容涉及了一次XSS攻击尝试,通过源码发现git泄露,使用gitExtract恢复源代码。分析代码发现存在SQL注入点,通过构造特定payload,成功执行SQL命令,获取了数据库信息。尝试利用load_file()函数读取敏感文件,最终在/etc/passwd中找到线索,并解码获取了相关信息。
摘要由CSDN通过智能技术生成

首先访问题目链接;
页面
试了一下xss,弹出一个登录框,需要登陆;
查看源码的时候发现了有write_do.php这个文件;
想到会不会有git泄露;
我用的是gitExtract;
发现果然有git泄露,看看源代码;
git泄露
看看都拿到了什么文件;

下载的文件
第一个write_do.php中代码有缺省的情况,看了网上发现大家都用的是git恢复;
第二个文件write_do.php.8ef569就是源代码文件了,具体我也没有去分析GitExtract的代码是什么,可能是直接就尝试git恢复了;
这里把源码贴出来好分析;

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    header("Location: ./index.php");
}
?>

分析代码可以看到,当do参数为write的时候,有:

    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;

categorytitlecontent参数以post方式上传,addslashes()函数对其进行转义;

这里还有一张board表,通过:

insert into board set category = $category',title = '$title',content = '$content'";

这个危险语句,将这三个参数插入表中;

当do=comment的时候,有:

    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);

bo_idcontent参数以post方式上传,addslashes()函数对其进行转义;
在board表中,select出id=$bo_id的category值;
如果有返回信息,则$category等于select出的category值;
最后插入表中;

先暂时分析到这里;
回头看看登录框的提示;
有提示的登录框
zhangwei***,这是赤果果的提示啊,直接爆破试试;
这里还是从0开始,因为我选的是Numbers字典
跑出来了一个666

爆出密码
登陆进去后可以xss,但是没有什么作用,于是把目光重新放在代码上;
这里有xss漏洞

从前线的do=comment代码段中可以抽离出关键的代码进行分析;

$sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";

我们可不可以尝试闭合第一个参数的输入,即category,然后让content等于想要获取的内容,再注释掉原来的content?
这也就意味着,我们需要构造这样的payload;

payload
如此,我们可以达到这样的效果:

$sql = "insert into comment
            set category = '',content=database(),
                bo_id = ''";

真不错,赶紧试试能不能拿到有用的东西;
上传效果

接着在留言里输入*/#,即可select到database();
ctf

后续的注入就没有显示了,是我太菜了吗;
难受
既然能用函数,就想到读文件函数load_file(),赶紧试试;
试试能不能直接读flag;
读flag
果然都是梦;
梦想破灭
最后在/etc/passwd里发现了好东西;
最后一行
我是www用户,我爱bin/bash
读一下.bash_history
读.bash_history
看到了“隐秘的角落”里留下的痕迹;
在这里插入图片描述
可以看到,cd /var/www/html,凶手在这里作案,虽然在案发现场抹除了痕迹,但是却忽略了/tmp/html.zip,该包解压后,里面应该有一个.DS_Store,读读看看里面都是什么见不得人的东西;

读.DS_Store
我怎么看不太懂这个东西???
?
view-source一下,看来是乱码了,先hex()编码一下;

在这里插入图片描述
然后读一下hex编码的内容;
可以,很长
解码;
可以看到蛛丝马迹;
flag
flag_8946e1ff1ee3e40f.php

读一下flag
php文件会在/var/www/html/目录中
可以拿到hex编码后的php文件内容;
在这里插入图片描述
解码得到flag;

<?php
	$flag="flag{b20ed84a-e040-4717-a64e-0c1df3b9ae03}";
?>

flag{b20ed84a-e040-4717-a64e-0c1df3b9ae03}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值