《网安面试指南》http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect
1.1 命令执行漏洞
1.1.1 反序列化漏洞
1.1.1.1 漏洞原理
反序列化漏洞是基于序列化和反序列化的操作,在反序列化——unserialize()时存在用户可控参数,而反序列化会自动调用一些魔术方法,如果魔术方法内存在一些敏感操作例如eval()函数,而且参数是通过反序列化产生的,那么用户就可以通过改变参数来执行敏感操作,这就是反序列化漏洞。
1.1.1.2 漏洞危害
攻击者可伪造恶意的字节序列并提交到应用系统时,应用系统将对字节序列进行反序列处理时将执行攻击者所提交的恶意字节序列,从而导致任意代码或命令执行,最终可完成获得应用系统控制权限或操作系统权限。。
1.1.1.3 检测条件
网站正常运行;网址服务器环境中使用WebLogic、WebSphere、JBoss、Jenkins、OpenNMS、shiro 这些使用反序列化的中间件。
1.1.1.4 检测方法
1、 通过指纹识别工具(或者是已知的反序列化POC)检测目标网站是否存在这些WebLogic、WebSphere、JBoss、Jenkins、OpenNMS、shiro这些中间件的反序列化漏洞,若存在即可直接使用相对应的反序列化漏洞利用工具。
使用vulmap对目标进行指纹扫描和漏洞探测:
Vulmap下载地址:GitHub - zhzyker/vulmap: Vulmap 是一款 web 漏洞扫描和验证工具, 可对 webapps 进行漏洞扫描, 并且具备漏洞验证功能
探测到目标使用了weblogic中间件。
以下是常见的识别方法:
Shiro:
rememberMe
可以在 cookie 追加一个 rememberMe=xx 的字段,这个字段是rememberMeManager默认的,然后看响应头部可以看看是否有 Set-Cookie: rememberMe=deleteMe; 的字段则可判断使shiro框架。
Weblogic:
路径进行模糊检测:
/console/login/LoginForm.jsp
/wls-wsat/CoordinatorPortType
/_async/AsyncResponseService
/ws_utc/config.do
脚本工具:GitHub - rabbitmask/WhoIsWeblogic: 提供Weblogic批量模糊指纹识别
典型的404页面:
2、 以下以weblogic为例:weblogic默认端口为7001,这里靶场为docker端口映射,http://vulfocus.xxx.xx:49003/ (weblogic测试靶场)
通过404典型页面初步判定为weblogic,接下来使用weblogic漏洞利用工具进行检测,检测和利用工具下载链接:Release 1.9 · yhy0/ExpDemo-JavaFX · GitHub
通过检测存在目标存在Weblogic反序列化漏洞(CVE-2019-2725)
接下来进行漏洞验证即可,如下图执行ifconfig不影响系统正常运行的命令即可验证。
1.1.1.6 修复建议
l 黑名单校验修复
在反序列化时设置类的黑名单来防御反序列化漏洞利用及攻击,当工程中导入jar包提供反序列化操作的公共接口,就需要使用黑名单的方式来禁止一些已知危险的类被反序列化,部分的黑名单类如下:
org.apache.commons.collections.functors.InvokerTransformer
org.apache.commons.collections.functors.InstantiateTransformer
org.apache.commons.collections4.functors.InvokerTransformer
org.apache.commons.collections4.functors.InstantiateTransformer
org.codehaus.groovy.runtime.ConvertedClosure
org.codehaus.groovy.runtime.MethodClosure
org.springframework.beans.factory.ObjectFactory
com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl
org.apache.commons.fileupload
org.apache.commons.beanutils
l 安全编码
更新commons-collections、commons-io等第三方库版本;
业务需要使用反序列化时,尽量避免反序列化数据可被用户控制,如无法避免建议尽量使用白名单校验的修复方式;
l 过滤用户输入
接收用户传参时过滤不合理,不符合程序逻辑的输入。
1.1.2 代码注入漏洞
1.1.2.1 漏洞原理
当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞。 狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当用户能够控制这段字符串时,将产生代码注入漏洞。
1.1.2.2 漏洞危害
通过可注入脚本语言的不同产生的危害也不同,例如如果一个php程序存在代码注入漏洞,可直接获得目标主机权限;如果javascript存在代码注入漏洞,则只能造成一些前端的漏洞,例如xss。
在常见的web应用中,大部分代码注入漏洞出现在php程序中,Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。
1.1.2.3 检测条件
网站正常运行,且使用后端编程语言,例如java/php/python等
1.1.2.4 检测方法
这里以php和java分别介绍检测方法
Php:
在没有目标代码的情况下,可以在可能使用了eval或其他造成代码执行的参数点输入phpinfo()来进行测试,例如某些cms后台有查看服务器环境信息的接口,新建或者编辑模板的功能,都可以进行测试:
www.xxx.com/test.php?searchtype=5&tid=&area=phpinfo()
代码执行成功后,页面返回phpinfo信息
如果发现目标为thinkphp框架或者开源cms,可以使用github已有脚本和poc进行快速扫描:
phpcms前台任意代码执行(有php版本限制)
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0104157.html
Thinkphp快速扫描
https://github.com/Lucifer1993/TPscan
Java:
可观察目标网站是否使用了struts2框架,一般struts2框架的接口通常以action和do结尾,例如:
www.xxx.com/index.action
发现目标使用了struts2框架后,可以使用struts2漏洞利用工具进行测试:
https://github.com/HatBoy/Struts2-Scan
如果目标网站使用了spring框架,则可以测试其是否存在spel表达式注入漏洞,参照如下poc:
https://github.com/wearearima/poc-cve-2018-1273
1.1.2.6 修复建议
总体修复方式:尽量不使用eval等危险函数。如果确定要使用,则参考如下做法 :
l 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则,如果可以尽量使用白名单。
l 输入处理:使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“\;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。
l 在php中使用disable_functions禁用相关危险函数 。
1.1.3 命令注入漏洞
1.1.3.1 漏洞原理
在Web 程序中,因为业务功能需求要通过Web前端传递参数到后台服务器上执行。但由于开发人员没有对输入进行严格的过滤,导致攻击者可以构造一些额外的“带有非法目的”命令,去欺骗后台服务器执行这些非法命令。命令注入通常因为指Web应用在服务器上拼接系统命令而造成的漏洞。
1.1.3.2 漏洞危害
在存在命令执行漏洞的情况下,如果Web 应用使用的是root权限,则该漏洞可以导致攻击者在服务器上执行任意命令,攻击者可以继承Web服务器程序的权限,去执行系统命令或读写文件、反弹shell、控制整个网站,甚至控制整个服务器。
1.1.3.3 检测条件
1、web业务正常运行且系统调用了执行命令的函数,例如exec、eval等。
2、系统执行命令函数的参数可以通过外部输入或者可控。
3、可控参数可拼接注入参数,并未进行参数校验。
利用命令注入漏洞发起攻击行为示意图如下:
1.1.3.4 检测方法
1、 通过网站的功能:部分网站有特殊功能,比如ping、数据库备份等,黑盒测试时的要点在于找到可能调用第三方命令的业务场景,通常在图片处理、大文件压缩、文件格式转化、日志处理以及数据库导出等功能比较容易调用一些小脚本进行辅助处理。能够确定某个业务模块使用到了第三方工具,就可以进一步对命令注入语句进行分析,是否存在各种限制,最常见的用各种fuzz推测后端对输入进行了哪些限制,对其进行相应的绕过,构造出可以利用的payload。
2、 常见注入连接符:
● 分号分割
● || && & 分割
● | 管道符
● \r\n %d0%a0 换行
● 反引号解析
● $() 替换
示例:ping功能
输入IP后点击ping按钮可以看到系统执行ping命令的结果:
使用常用的管道符命令(&、&&、|、||)进行poc拼接输入如下参数:
127.0.0.1&whoami 可以看到whoami 的执行结果:
由于get参数未做过滤所以可以使用连接符号讲命令与参数进行拼接,然后将拼接好的poc传入后台进行执行,从而达到命令注入。
切记测试命令注入漏洞一定要是用对系统无害的命令进行测试,测试显示结果即可。
1.1.3.6 修复建议
● 不使用时禁用相应函数
找到php.ini,查找到disable_functions,添加禁用的函数名
● 尽量不要执行外部的应用程序或命令
● 做输入的格式检查
● 在使用动态函数之前,确保使用的函数是指定的函数之一
● 在进入执行命令的函数方法之前,对参数进行过滤,对敏感字符调用addslashes进行转义
● 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
escapeshellarg函数:会将用户引起参数或命令结束的字符进行转义
单引号"'"会被转义为"\’"
双引号“””会被转义为"\""
分号";"会被转义为"\;"
这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的
● 转义命令中的所有shell元字符:shell元字符包括 #&;,|*?~<>^()[]{}$\
● 使用safe_mode_exec_dir指定可执行的文件路径
将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败。