CTFSHOW-WEB(萌新11-17) web111.这个的环境比之前多过滤了一个cat,黑名单只限制了命令执行函数没有限制 PHP 原生文件读取函数可以用readfile来读取文件或者是echo file_get_contents(config.php);web121.这次过滤更多并且还过滤了config那么我们要采取其他形式的config的写法比如说base64,config base64加密为Y29uZmlnLnBocA然后我们的读取函数没有被过滤可以照常使用?creadfile(base64_decode(Y29uZmlnLnBocA));2.其实这个也可以用别的形式chr ASCII 字符拼接方案creadfile(chr(99).chr(111).chr(110).chr(102).chr(105).chr(103).chr(103).chr(46).chr(112).chr(104).chr(112));十六进制字符串?cecho file_get_contents(\x63\x6f\x6e\x66\x69\x67\x2e\x70\x68\x70);web131.这个题比上一个多过滤了一个;所以我们要PHP 语句完整必须用?替代分号收尾然后还多过滤了一个file元素那我们那个方法就不行了passthru系统命令执行函数调用服务器 Linux 命令cat。cat是读取文件原始文本不会解析 PHP直接把 config.php 全部源码原样输出到浏览器所以能看见 flag。/?cpassthru(base64_decode(%27Y2F0IGNvbmZpZy5waHA%27))?web141.这个新过滤了一个所以不能用echo、include不需要括号二者属于 PHP 语言结构并非函数。由于页面代码开头已经提前执行了include(config.php)变量$flag处于全局可调用作用域内因此最简可用载荷如下纯文本载荷?cecho $flag?web151.这一个和上一个有所不同过滤了?并没有过滤;分号。所以这一题只要把上一题的结束符号换为即可web161.这个题目给了一个md5值我们先进行md5爆破md5解密地址https://www.somd5.com/2.在题目中的下面的代码的意思是找到一串字符 X满足md5(ctfshow . X) a6f57ae38a22448c2f07f3f95f49c84e令$cX即可进入判断输出 flag。所以我们就找到了c36d的if(md5(ctfshow$c)a6f57ae38a22448c2f07f3f95f49c84e){echo $flag;3.直接构造payload,得到flagweb171.我们最终目的必须让服务器运行 PHP 代码执行命令找出 flag。 现在不能直接传 php 文件那就必须找一个满足两个条件的文件 ① 文件路径不带 php可以绕过拦截 ② 这个文件我们能自己往里写入 PHP 代码 ③ 网站可以用 include 读取它。所以选择Nginx 日志2.选择Nginx的原因路径无 php轻松绕过黑名单Nginx 默认访问日志路径/var/log/nginx/access.log整条路径没有任何 php 字样preg_match检测不到网站允许 include 读取这个文件。我们可以随便往日志里写字Nginx 有固定机制任何人访问网站浏览器 / 工具的请求头User-Agent会完整写进 access.log 日志。 User-Agent 是用来告诉服务器你用的什么浏览器这个内容我们完全自定义。 你用 curl 可以手动把 User-Agent 改成?php system(cat *);?。 你一发请求这段 PHP 代码自动被服务器写到日志里全程不用上传文件。日志能被 include 解析执行include 有特殊规则打开纯 txt、日志这类普通文件只原样展示文字如果文件里存在?php 代码 ?PHP 引擎会运行代码再输出结果。日志被我们塞进了 PHP 标签读取日志就等于运行代码。3.用 curl 工具访问网站强行告诉服务器我的浏览器标识是一段 PHP 代码。 服务器会把这段代码写进日志。之后读取日志代码运行自动遍历网站所有文件爆出 flag。这个命令其实在自己终端输入就行。curl -H User-Agent: ?php system(\cat *\);? https://cd99e68e-35de-4ccc-b3d3-ed139ba5ccf5.challenge.ctf.show/4.指令详解curl Windows 系统自带的网络请求工具作用向网址发送一次 HTTP 访问请求。-H全称 header功能手动自定义 HTTP 请求头。 正常浏览器访问网站会自带很多请求头浏览器型号、UA、Cookie 等-H允许我们手动新增 / 修改任意请求头。 本次我们专门修改User-Agent请求头。User-Agent: ?php system(\cat *\);?这是我们自定义的请求头内容分成两块1User-Agent:约定名称代表浏览器标识。正常这里是Chrome/Edge/火狐这类浏览器信息我们全部替换成恶意 PHP 代码。2?php system(\cat *\);?核心执行代码分层拆解?php ?PHP 标记。只要 PHP 读到这对标签就会把中间内容当成程序执行不会当成普通文字。system()PHP 内置函数作用调用 Linux 服务器原生系统命令。catLinux 经典命令功能读取文件内容。*通配符代表「当前文件夹所有文件」。cat * 读取网站根目录全部文件。为什么要加反斜杠\Windows CMD 语法硬性要求 外层已经用双引号包裹整个 UA 内容User-Agent: xxx如果代码内部还要写双引号CMD 会误认为引号提前结束命令直接崩掉。 必须用\转义写成\告诉 CMD这个双引号是代码里的文字不是命令结束符。如果写成错误版本User-Agent: ?php system(cat *);?CMD 读到system(这里就判定引号闭合整条命令直接报错。末尾网址指定请求发送到这台 CTF 靶机你的 UA 代码会随着这次访问一起发给 Nginx 服务器。5.发送之后服务器会怎么样服务器 Nginx 收到你的访问请求完整记录所有请求信息写入日志文件/var/log/nginx/access.logUser-Agent 原样存入日志日志文件现在被写入?php system(cat *);?后续你访问?c/var/log/nginx/access.logPHP include 读取日志识别 PHP 标签执行cat *服务器列出网站全部文件flag 被打印在页面中。6.下一步在浏览器访问的指令https://cd99e68e-35de-4ccc-b3d3-ed139ba5ccf5.challenge.ctf.show/?c/var/log/nginx/access.log作用去读取 Nginx 日志这个文件。 网站打开日志发现里面藏了 PHP 代码自动运行代码把网站所有文件全部读出来展示。/var/log/nginx/access.log赋值内容Nginx 访问日志在 Linux 系统的绝对路径。7.然后再这个页面检查源代码即可得到flag