专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
学习强国  ·  严厉打击!有账号被无限期封禁 ·  3 天前  
学习强国  ·  严厉打击!有账号被无限期封禁 ·  3 天前  
看雪学苑  ·  AI时代 安全护航 | ... ·  5 天前  
嘶吼专业版  ·  基于泄露的 Kryptina 代码的新型 ... ·  6 天前  
IDC咨询  ·  头部安全企业重点布局——IDC ... ·  6 天前  
IDC咨询  ·  头部安全企业重点布局——IDC ... ·  6 天前  
51好读  ›  专栏  ›  看雪学苑

PHP PWN 入门调试

看雪学苑  · 公众号  · 互联网安全  · 2024-10-12 17:59

正文




php pwn介绍


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

以下是php扩展的解释:


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


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


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






php-pwn拓展安装


网上的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代码,这是一个简单的栈溢出漏洞。


PHP_FUNCTION(easy_phppwn)
{
char *arg = NULL;
size_t arg_len, len;
char buf[100];
if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &arg, &arg_len) == FAILURE){
return;
}
memcpy(buf, arg, arg_len);
php_printf("The baby phppwn.\n");
}


这是一个简单的测试代码,里面本来还有一个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函数声明和注册。


将下列代码写在里面:


ZEND_BEGIN_ARG_INFO_EX(arginfo_easy_phppwn, 0, 0, 1)
ZEND_ARG_INFO(0, arg) // Argument 'arg' of type string
ZEND_END_ARG_INFO()

ZEND_FUNCTION(easy_phppwn);

static const zend_function_entry easy_phppwn_functions[] = {
PHP_FE(easy_phppwn, arginfo_easy_phppwn) PHP_FE_END
};



进行编译

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文件里面:


$a = "abcd";
easy_phppwn($a);
?>
'''将a赋值为字符串abcd,传入我们写的扩展里面,
如果扩展真确的话,会输出The baby phppwn.'
''


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


开始我不太清楚为什么要下载这个模块,因为网上的教程在下载完该模块后就自己写了一个扩展然乎用ida分析自己的写的.so文件,所以我一度不知道该扩展的作用,以为做题直接用ida逆就可以了,后来我看到一篇文章,才知道这个模块的作用是将.so文件加载到本地环境里面,就可以使用gdb在本地调试该.so文件。





怎么调试


首先,我们得获得我们写好的那个扩展的so文件,放入ida去逆一下。



找到zif_easy_phppwn函数进去,这就是我们写的那个那个扩展的函数的逆向。



zend_parse_parameters是 PHP 的内部函数,用于解析传递给 PHP 函数的参数。

execute_data->This.u2.next是从执行上下文中获取的参数位置,"s"表示期望的参数是一个字符串(s代表string)。

&arg用来接收解析出的字符串,&n用来接收字符串的长度


然后,我们进入到gdb里面进行动态调试

gdb php


开始调试我们的php环境:



现在,我们那个扩展还没有加载进里面,现在断点会找不到函数,所以我们要先运行,让easy_phppwn.so先加载进来。



现在,ctrl+c中断运行,但并不会退出,我们可以使用vmmap可以查看php里面内存结构,可以看到,easy_phppwn.so文件已经加载进去了,现在我们可以进行断点了。。


在我们之前在ida里面找到的那个函数zif_easy_phppwn断点进入到函数里面,之后在设置参数输入set args ./test1.php

(为什么要这样设置参数,是为告诉pwndbg要执行的文件,该文件里面必须包含easy_phppwn函数,不然触发不了进入easy_phppwn函数的关键入口)。



现在进入到函数里面了,可以随意进行调试了。所以,当我们做phppwn的时候,我们要先去找到一个·php的so扩展,并且使用extension=easy_phppwn.so将它加载到我们的php环境里面,后面就可以调试做题了。





参考文章


https://www.anquanke.com/post/id/204404
https://hackmd.io/@jsjsj/S1aTYP1Dj
https://a1ex.online/2021/03/19/webpwn%E5%AD%A6%E4%B9%A0/
https://www.anquanke.com/post/id/235237#h2-0




看雪ID:mb_vdcqxebg

https://bbs.kanxue.com/user-home-998332.htm

*本文为看雪论坛优秀文章,由 mb_vdcqxebg 原创,转载请注明来自看雪社区



# 往期推荐

1、《安卓逆向这档事》番外实战篇-拨云见日之浅谈Flutter逆向

2、ByteCTF逆向解析

3、Fuzzer开发4:快照、代码覆盖率与模糊测试

4、天堂之门(WoW64技术)总结及CTF中的分析

5、Fuzzer开发 3:构建 Bochs、MMU 和文件 IO





球分享

球点赞

球在看



点击阅读原文查看更多