eval执行
查看源码后发现。让把命令赋值给cmd然后执行
先看一下根目录下有什么,命令:?cmd=system(‘ls’);
再回到上一级看看。发现了flag
打开flag就行了。
文件包含
文件包含
查看源码,发现strpos函数是用来查找字符在出现的位置。如果我们传入的数据流第中含有flag并且flag是第一个的话他就会返回0,那么!0就是存在了,就不会报错了。
PHP://input
查看源码
php:// — 访问各个输入/输出流(I/O streams)
php://input 是个可以访问请求的原始数据的只读流.
可以接收post请求作为输入流的输入,将请求作为PHP代码的输入传递给目标变量,以达到以post 的形式进行输入的目的。查看phpinfo,发现以下字段,证明是可以使用php://input的。
后面都是正常操作了
远程请求
打开phpinfo发现还可以使用php://input,那么方法就跟上面那题是一样的了,就不多做赘述。
读取源代码
看到这个我以为还能用php://input,然后发现并不能。
看了别的博主的才知道这里要用php://filter,用法http://URL/?file=php://filter/read=convert.base64-encode/resource=…/…/…/flag
用burpsuit解码就好了
下面的知识点来自于大佬
linux中命令的链接符号
1.每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
使用&连接符,连接别的命令试一下,发现也执行了后面的命令,且文件夹下有个php文件
linux查看文本的命令
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
使用more输出base64密文
12.0.0.1 & more flag_1482210209678.php | base64
命令注入
发现里面看不见,可以通过直接看网页源码看见或者用语句:ip & cat *.php | base64可以看到他的密文,用burpsuit解码就能看到flag了。
后面几题基本一样。
注意:
空格用<或者/**/替换
分隔符用cd代替
过滤了管道符|,不能再使用了。但是base64 a.php和a.php|base64是等价的。
命令注入综合练习
空格可以用${IFS}
cat可以用more
flag可以用正则f***
ctfhub应该用不到
查了一下,在linux下,命令分隔符除了;还有%0a
有了;就可以不用运算符了
因为这个都是url编码所以都要直接写在网址内部
命令:?ip=127.0.0.1%0acd I F S f ∗ ∗ ∗ i s h e r e {IFS}f***_is_here IFSf∗∗∗ishere{IFS}%0als
命令:ip=127.0.0.1%0acd
I
F
S
f
∗
∗
∗
i
s
h
e
r
e
{IFS}f***_is_here
IFSf∗∗∗ishere{IFS}%0abase64${IFS}f***_16941904629849.php