TSRC挑战赛: PHP场景中getshell防御思路分享

来源:未知 浏览 838次 时间 2021-03-16 03:10

TSRC

WEB运用缺陷统率的侵略时有爆发,挑拨赛扫描器和WAF并不可处置十脚的问题,:于是考查在主机侧针闭于PHP情景搞了一个堤防预备。很光荣的邀请到TSRC局部白帽子搞了一次闭于抗演......

ZEND供给了许多丰盛的接口,PHP可依据须要采用调用。

上述思绪在企业实行时,场景须要和交易有脚够充斥的协共,中也都有虚假脚的场所,getshell假如大师有更多预备大概者思绪,提防迎接与尔所有筹备。

ZEND_DO_FCALL — 函数实行system等

int len;

void mysub(){

筹备到侵略者运用上传缺陷大概者其他0DAY getshell博得的文件大多会有W写权利,思绪堤防方常常向往遏止这局部文件具备过高的权利。

4.2闭于抗变形

PHP运用assert大概preg_replace /e实行代码,瓜分调用zend_get_executed_filename赢得的PHP脚本名中会戴有辩别标记,TSRCassert闭于应的是assert code,挑拨赛preg_replace闭于应的是regexp code;当创造这些特其他脚本实行了system等4.1中普及的高危函数直接阻断。以下图的nonalphanumeric -webshell举例:

设定一些已知恶念脚本的黑个性参数,:犹如于杀毒软件早期的个性码思绪。

行文比较仓促,PHP有不迭的场所请包含,场景有大力疑问大概提倡迎接通联pandas(小毛驴)筹备调换。

3.3数据构造

PHP是弱典范谈话,中其上层并不辩别变量典范,getshell变量基层闭于应的是一个union构造体,提防以php-5.3.6版本举例,思绪构造体在Zend/zend.h文件中定义;本质如下:

1) 监控PHP运用层代码的实行细节,瓜分包括实行CGI、函数名、参数等;

long lval; /* longvalue */

2) 在自定义函数中实行本人须要的功效并返回本本的处置函数:

4规则战术4.1前提思绪

咱们须要处置的问题是getshell、主机警感文件揭穿等问题。假如控制住PHP脚本实行吩咐 和 翻阅文件的功效,TSRC便达到了本领。共时,挑拨赛因为读取文件的接口特殊多,:运用处景也较多,PHP因此采用禁用挨开目录接口来侧面达到遏止翻阅文件的本领,场景不可遍历目录便无法博得文件名,中不妨灵验的完毕功段。故结果爆发的结果战术如下:

2) PHP SPL供给的一些类库有文件控制的功效,getshell也须要遏止,提防比方DirectoryIterator(然而如共不白帽子运用过SPL)

WEB运用缺陷统率的侵略时有爆发,思绪扫描器和WAF并不可处置十脚的问题,瓜分于是考查在主机侧针闭于PHP情景搞了一个堤防预备。很光荣的邀请到TSRC局部白帽子搞了一次闭于抗熟习,TSRC本文沉要分割一下堤防思绪。

图1 PHP谈话的构造

霸道一点的不妨用文件名白名单,挑拨赛也等于交易报备过的文件不碰壁断,:其他不熟悉的文件普遍遏止。幽雅一点的不妨闭于函数参数搞白名单,PHP比方提取平凡是PHP脚本实行吩咐的参数大概者代码个性,场景闭于其进行放行,中不熟悉的个性普遍阻断。

struct {

Z_LVAL_P、Z_DVAL_P、Z_ARRVAL_P等,getshell以上宏列表在 Zend/zend_operators.h有定义。

堤防预备沉要想处置的问题是getshell、主机警感文件揭穿等问题。于是乎出了底下如许一个标题:安置了堤防预备的Nginx + PHP 的WEB情景,提防供给一个上传进口,思绪可上传大力文件。找到WEB目录下的一个flag文件读取到本质即算冲破。

double dval; /* double value */

zend_object_value obj;

ZEND_DO_FCALL这个OPCODE闭于应的功效是函数调用,瓜分假如须要HOOK十脚的函数调用:

自定义功效;

1) 在模块初始化函数中运用zend_set_user_opcode_handler建改ZEND_DO_FCALL新的处置函数为mysub:

3 相闭知识3.1HOOKPHP代码

PHP是解释型谈话,TSRC代码被翻译为核心字节码由ZEND引擎领会实行。PHP把核心字节码称之为OPCODE,挑拨赛每个OPCODE闭于应ZEND基层的一个处置函数,:ZEND引擎结果实行这个处置函数。实行HOOK功效只要要变革HOOK OPCODE闭于应的处置函数即可,PHP而ZEND预先便供给了一个现成的接口:zend_set_user_opcode_handler。堤防预备只要要HOOK以下三个OPCODE:

1) 禁用掉实行吩咐的接口

return ZEND_USER_OPCODE_DISPATCH;

3.2ZEND接口

HOOK之外还须要赢得一些前提信息大概功效,场景比方:

}

char *val;

1) 写入权利和实行吩咐权利互斥

2) 禁用一些类库,中可运用zend_disable_class接口;

PHP_MINIT_FUNCTION(phpips){

4.3缩小误杀

偶尔平凡是的PHP脚本也须要用到吩咐实行的功效,getshell何如样保护其平凡是运行,提防不被咱们的堤防战术阻断呢?此地供给三种思绪:

char *cgi_name = (char*)zend_get_executed_filename(TSRMLS_C);

1) 赢得实行的PHP脚本名,思绪可调用ZEND的接口zend_get_executed_filename:

图2nonalphanumeric – webshell

禁用函数有一些须要注沉的问题:

ZEND_DO_FCALL_BY_NAME — 变量函数实行 $func = “system”;$func();

2) 调用PHP内核ZEND供给的API接口,瓜分包括禁用类、建改安排选项等。

ZEND_INCLUDE_OR_EVAL — eval、require等

1) PHP接口依然比较繁重搀和的,TSRC除了system、exec、opendir、scandir常用函数之外,挑拨赛一些常睹函数比方glob等函数都要筹备周严,:其他还有一些回调函数、反射类(PS:局部筹备不全被blackeye和雪人绕过)

2) 运用白名单逻辑

}

5未来

运用PHP夸大不妨搞的处事依然比较多,PHP比方在缺陷检测方面、闭于数据库函数参数过滤、阻断SQL注入、阻断保持型XSS等场景都有特殊大的构想空间。以致在代码审计这块也不妨筹备,场景海内有个大牛已经有比较熟习的开源产品,中TAINT (作家:laruence),getshell大师大概都已经比较熟悉了,提防便尚且不搞赘述了。

PHP是鄙人层辩别开了变量典范;在union构造体中有个特殊沉要的构造体HashTable,思绪PHP中的数组构造等于运用HashTable这个构造体实行,瓜分假如变量是个数组,TSRC赢得变量本质须要遍历这块HashTable,挑拨赛数据构造这块不搞太多引睹。ZEND基层用zval这个构造体保持变量,:共时ZEND供给了几个宏不妨方便的变幻zval到几乎的数据典范,PHP比方把zval典范变幻为字符串 – zval el; Z_STRVAL_P(el),TSRC挑拨赛: PHP场景中getshell提防思绪瓜分常用的还有:

} zvalue_value;

标签: 函数实行PHPZEND