首页
社区
课程
招聘
[原创]phppwn入门调试
发表于: 2024-9-29 10:47 6497

[原创]phppwn入门调试

2024-9-29 10:47
6497

由于我也是刚开始学习webpwn,所以目前我所了解到的关于phppwn的漏洞点主要在so扩展库中。

以下是php扩展的解释

php扩展是一种特殊形式的依赖库或插件,他提供许多可以被PHP应用程序使用的函数。在Linux系统下,PHP扩展后缀是 .so,而在Windows系统下, PHP扩展后缀是 ``.dll。PHP使用扩展很大程度是为了弥补性能问题,因为PHP扩展一般都是C语言编写的,而C语言是更加底层的语言,效率要比PHP高出很多。

我们可以看到,php扩展一般是用C语言编写的,那么,C语言中存在的漏洞通过扩展是不是也能打php呢?确实是这样,我们可以通过逆.so的库,找到这个库的漏洞,通过库的漏洞去打php,这就是phppwn的攻击方式。phppwn其实和常规pwn差不多,都是在打C语言中漏洞。

但是,由于 php加载扩展库来调用其内部函数,所以和常规 PWN题也不完全相同,就是我们不能直接获得交互式的shell。这里通常是需要采用 popen或者 exec函数族来进行执行 bash命令来反弹 shell,直接执行 one_gadget或者 system是不可行的。

网上的php扩展安装的一般是7.2.24,但我安装的是8.2.1,php8相较于php7做了一点点修改,所以我还是记录一下吧

首先是安装php,以及Php开发包:

sudo apt install php php-dev

然后查看下载的php版本

php -v

去以下连接出下载相同版本的php源码

https://github.com/php/php-src

下载好了之后,进入到里面,找到ext目录,编译一个自己的扩展模块

由于我使用的是php8之后的版本,命令相较于php7有一些变化

./ext_skel.php --ext easy_phppwn

使用该命令,可以创建一个属于自己的扩展模块工程文件

这是刚进入到里面的样子

现在,我们先进入到.c文件中,在里面写入我们的C代码,这是一个简单的栈溢出漏洞

这是一个简单的测试代码,里面本来还有一个test1和一个test2代码的,我不想要那个功能,所以我删了

之后,需要修改一下zend_module_entry easy_phppwn_module_entry 里面的ext_functionseasy_phppwn_functions 这是为了确保命名一致性和代码的可读性(这里填写注册函数后面的那个函数名)

这里注意一下,就是之前在网上看见的关于php创建扩展的都是php7的版本,所以他们的注册函数好像都是再.c文件里面一起的,但是里面没有,我开始以为需要自己在里面写注册函数,但是在这个文件里面写了之后最后创建的扩展一直用不了,后来才发现原来php8的注册函数换到另一个文件easy_phppwn_arginfo.h里面了

里面声明注册了文件本身生成的test1和test2,但是我把他们俩删了,所以这我也要把他们删了换上我写的easy_phppwn函数声明和注册

将下列代码写在里面

进行编译

phpize

./configure

编译好了之后,会有一个Makefile文件,在里面取消-O2优化,否则会加上FORTIFY保护,导致memcpy函数加上长度检查变为__memcpy_chk函数
如果不想要canary保护需要输入命令取消

-fno-stack-protector

这个改为

使用make编译,再使用make install配置好路径

出现这个,说明make编译成功

出现这,说明路径配置好了

然后找到php.ini,在其中添加以下命令

extension=easy_phppwn.so

使用php --ini 寻找php.ini路径

Loaded后面那个路径,修改php.ini

使用php -m检查一下,看看easy_phppwn扩展在不在里面

我们现在简单写一个php程序看一下能不能正常运行

将一下代码写进自己创建的php文件里面

这样,说明我们这个扩展创建成功了


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//