当前位置:首页 > 技术 >

php代码执行原理(php代码运行的方法)

来源:原点资讯(www.yd166.com)时间:2023-04-17 04:06:06作者:YD166手机阅读>>

运行PHP执行指令后,程序可到断点处,然后通过调用栈可知:底层通过CreateProcessW系统API调用来启动相关进程、然后通过cmd进程来执行相关指令(此处echo为cmd内置指令)(注意:这里也可查看到PHP程序的完整调用链)

php代码执行原理,php代码运行的方法(9)

Java

Java - 底层不调用系统终端,自己启动传入的可执行程序 Mode => Window:Command || Linux:Command

但是在Java语言里面,针对Linux平台,系统命令echo 111 > shell.txt传入CommandExecFunc函数,最终在底层相当于执行/bin/echo 111 > shell.txt成功打印一个字符串"111 > shell.txt"并没有创建文件shell.txt。【执行过程相当于:运行可执行程序/bin/echo并传入参数111 > shell.txt进行打印输出,这里的特殊字符>被当作普通字符串被echo程序打印。这里的echo作为可执行程序出现,而不是终端中的命令】【进程相关:一个进程/bin/echo,在/bin/echo进程中传入字符串参数111 > shell.txt进行打印输出】【有关可执行程序怎么查询:从环境变量中进行查询】

测试代码如下

import org.apache.commons.io.IOUtils; import java.lang.Runtime; public class CommandExec1 { public static void main(String[] args) { try{ String str = IOUtils.toString(Runtime.getRuntime().exec("whoami").getInputStream()); System.out.println(str); } catch(Exception a){ System.out.println(a); } } }

  • 跟踪一下程序执行流程:For Linux

程序执行监视情况:从系统环境变量中查找输入的指令可执行程序位置,然后由execve系统调用来启动相关程序进程(并未涉及系统终端调用)。

┌──(roottoor)-[~/桌面/CodeDebug/java] └─# strace -f -e execve java CommandExec1 execve("/usr/bin/java", ["java", "CommandExec1"], 0x7ffdb259ee90 /* 53 vars */) = 0 strace: Process 3923 attached Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true [pid 3923] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} --- strace: Process 3924 attached strace: Process 3925 attached strace: Process 3926 attached strace: Process 3927 attached strace: Process 3928 attached strace: Process 3929 attached strace: Process 3930 attached strace: Process 3931 attached strace: Process 3932 attached [pid 3932] execve("/mnt/hgfs/QSec/Pentest/Red-Team/\347\245\236\345\205\265\345\210\251\345\231\250/Windows/VSCode/VSCode-linux-x64/whoami", ["whoami"], 0x7ffd28368b80 /* 53 vars */) = -1 ENOENT (没有那个文件或目录) [pid 3932] execve("/usr/local/sbin/whoami", ["whoami"], 0x7ffd28368b80 /* 53 vars */) = -1 ENOENT (没有那个文件或目录) [pid 3932] execve("/usr/local/bin/whoami", ["whoami"], 0x7ffd28368b80 /* 53 vars */) = -1 ENOENT (没有那个文件或目录) [pid 3932] execve("/usr/sbin/whoami", ["whoami"], 0x7ffd28368b80 /* 53 vars */) = -1 ENOENT (没有那个文件或目录) [pid 3932] execve("/usr/bin/whoami", ["whoami"], 0x7ffd28368b80 /* 53 vars */) = 0 [pid 3932] exited with 0 [pid 3923] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3932, si_uid=0, si_status=0, si_utime=0, si_stime=0} --- strace: Process 3933 attached root [pid 3931] exited with 0 [pid 3927] exited with 0 [pid 3924] exited with 0 [pid 3923] exited with 0 [pid 3933] exited with 0 [pid 3930] exited with 0 [pid 3929] exited with 0 [pid 3928] exited with 0 [pid 3926] exited with 0 [pid 3925] exited with 0 exited with 0 ┌──(roottoor)-[~/桌面/CodeDebug/java] └─#

同理,针对Windows平台,系统命令echo 111 > shell.txt传入CommandExecFunc函数,最终在底层相当于执行系统环境变量/echo.exe 111 > shell.txt成功打印一个字符串"111 > shell.txt"并没有创建文件shell.txt。

但是,正常情况下,这里执行上述指令会报错,因为Windows平台,默认情况下系统环境变量中不存在echo.exe可执行程序,导致指令无法正常执行

# 无法定位echo可执行程序 D:\QSec\Code-Audit\Tools\Java\Kits\RCE>where echo INFO: Could not find files for the given pattern(s). D:\QSec\Code-Audit\Tools\Java\Kits\RCE>where whoami C:\Windows\System32\whoami.exe D:\QSec\Code-Audit\Tools\Java\Kits\RCE> # 执行报错 D:\QSec\Code-Audit\Tools\Java\Kits\RCE>javac RuntimeRCE.java D:\QSec\Code-Audit\Tools\Java\Kits\RCE>java RuntimeRCE java.io.IOException: Cannot run program "echo": CreateProcess error=2, The system cannot find the file specified D:\QSec\Code-Audit\Tools\Java\Kits\RCE> Python

Python - 底层调用系统终端,执行命令 Mode => Window:cmd.exe /c Command || Linux:sh -c Command

而Python语言,命令执行函数底层原理实现同PHP语言。

总结起来,也就是,命令执行函数执行分为两类,一类:传入的命令仅仅作为可执行终端中的命令执行;另一类:传入的命令仅仅是运行传入的命令中的可执行程序。对象不同,一类:是底层语言系统终端帮我们执行传入的命令;另一类:是自己启动传入的可执行程序。

参考链接
  • Build your own PHP on Windows
  • Visual Studio docs
  • Visual Studio Code docs
  • 《PHP 7底层设计与源码实现 PHP7内核剖析》
  • 深入理解 PHP 内核
  • WINDOWS下用VSCODE调试PHP7源代码
  • 调式PHP源码
  • 用vscode调试php源码
  • GDB: The GNU Project Debugger
  • CreateProcessW function
  • 命令注入成因小谈
  • 浅谈从PHP内核层面防范PHP WebShell
  • Program execution Functions
  • linux系统调用
  • system calls
,

栏目热文

芦荟砍头秋季(芦荟几月份砍头最好)

芦荟砍头秋季(芦荟几月份砍头最好)

“芦荟”枝叶稀少,实施“砍头计划”,侧芽抽不断,叶片长爆盆!芦荟是一种非常有意思的盆栽植物,相信很多人都喜欢芦荟,它养在...

2023-04-17 04:05:11查看全文 >>

芦荟太高可以砍头吗(芦荟现在砍头行吗)

芦荟太高可以砍头吗(芦荟现在砍头行吗)

第一眼看到芦荟的时候,就感觉它和其它的花花草草不一样,它的叶片肥肥厚厚,水汪汪的。尤其是它每天都把叶子敲得高高的,挺得直...

2023-04-17 04:11:40查看全文 >>

芦荟侧芽太多怎么办(芦荟主干长侧芽怎么办)

芦荟侧芽太多怎么办(芦荟主干长侧芽怎么办)

喜欢养花的朋友,最好在家里养一盆芦荟,不仅美观可以装点空间,净化空气,美容美白,防治蚊虫叮咬等作用,堪称为家庭医生,而且...

2023-04-17 04:09:39查看全文 >>

芦荟砍头图片(芦荟砍头示意图)

芦荟砍头图片(芦荟砍头示意图)

阳台上栽了两盆芦荟,一样的花盆,一样的大小,起初像两个虎头虎脑的小兄弟,碧绿蓬勃,放在一起还算对称。渐渐地,长高的芦荟开...

2023-04-17 04:11:17查看全文 >>

软枣猕猴桃几年能挂果(软枣猕猴桃二年苗栽几年挂果)

软枣猕猴桃几年能挂果(软枣猕猴桃二年苗栽几年挂果)

记者 严梓宁本报讯 去年,王鹤农庄引进软枣猕猴桃试种。经过精心管理,这几天,200株软枣猕猴桃枝头挂满果实,预计9月中下...

2023-04-17 04:04:29查看全文 >>

php底层内部运行机制(php工作原理及使用方法)

php底层内部运行机制(php工作原理及使用方法)

PHP的设计理念及特点多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影...

2023-04-17 04:07:19查看全文 >>

php底层结构图(php 设计模式示意图)

php底层结构图(php 设计模式示意图)

作为一门动态语言,php是如何实现的,其底层机制如何,具有什么样的特点,本文深入浅出介绍了包括php设计理念、整体结构...

2023-04-17 04:03:09查看全文 >>

5年php经验找不到工作(php初学者如何找工作)

5年php经验找不到工作(php初学者如何找工作)

Python是一门很出色的胶水语言,也就是当我们有现成的组件后,Python非常适合将他们组装起来。机器学习的例子就比较...

2023-04-17 03:57:46查看全文 >>

php是不是最简单的(php用什么写的)

php是不是最简单的(php用什么写的)

此篇文章是想总结下工作中一直在用的一个简单的PHP框架,真的是超级简单,解析步骤如下:访问:https://abc.co...

2023-04-17 03:59:05查看全文 >>

php 用什么开发(php用的什么工具开发的)

php 用什么开发(php用的什么工具开发的)

首先,我们先普及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比如编写一篇文章,下载一首MP3...

2023-04-17 03:57:29查看全文 >>

文档排行