website attack
Je krijgt dan als foutmelding iets als: exceeded the max_connections_per_hour.
Inmiddels is dit verhoogd waardoor de website weer bereikbaar is.
Als ik de errorlog erbij pak krijg ik veel dingen als onderstaande meldingen, is hieruit op te maken dat er een grove fout in mijn script zit dat ze aan het gebruiken zijn?
Quote:
[Sun Feb 15 01:20:03.630711 2015] [:error] [pid 4543] [client #####] PHP Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'The used SELECT statements have a different number of columns' in *****\nStack trace:\n#0 *****: mysqli->query('\\n\\t\\t\\t\\t\\t\\tSELECT\\n\\t...')\n#1 ***** \n#2 {main}\n thrown in ***** on line 71, referer: *****'+%2f**%2fuNiOn%2f**%2faLl+%2f**%2fsElEcT+0x393133353134353632312e39,0x393133353134353632322e39,0x393133353134353632332e39,0x393133353134353632342e39,0x393133353134353632352e39,0x393133353134353632362e39,0x393133353134353632372e39,0x393133353134353632382e39,0x393133353134353632392e39,0x39313335313435363231302e39,0x39313335313435363231312e39,0x39313335313435363231322e39,0x39313335313435363231332e39,0x39313335313435363231342e39,0x39313335313435363231352e39,0x39313335313435363231362e39,0x39313335313435363231372e39,0x39313335313435363231382e39,0x39313335313435363231392e39,0x39313335313435363232302e39,0x39313335313435363232312e39,0x39313335313435363232322e39,0x39313335313435363232332e39,0x39313335313435363232342e39,0x39313335313435363232352e39,0x39313335313435363232362e39,0x39313335313435363232372e39,0x39313335313435363232382e39,0x39313335313435363232392e39,0x39313335313435363233302e39,0x39313335313435363233312e39,0x39313335313435363233322e39,0x39313335313435363233332e39,0x39313335313435363233342e39,0x39313335313435363233352e39,0x39313335313435363233362e39,0x39313335313435363233372e39,0x39313335313435363233382e39,0x39313335313435363233392e39,0x39313335313435363234302e39,0x39313335313435363234312e39,0x39313335313435363234322e39,0x39313335313435363234332e39,0x39313335313435363234342e39,0x39313335313435363234352e39,0x39313335313435363234362e39,0x39313335313435363234372e39,0x39313335313435363234382e39,0x39313335313435363234392e39,0x39313335313435363235302e39,0x39313335313435363235312e39,0x39313335313435363235322e39,0x39313335313435363235332e39,0x39313335313435363235342e39,0x39313335313435363235352e39,0x39313335313435363235362e39,0x39313335313435363235372e39,0x39313335313435363235382e39,0x39313335313435363235392e39,0x39313335313435363236302e39,0x39313335313435363236312e39,0x39313335313435363236322e39,0x39313335313435363236332e39,0x39313335313435363236342e39,0x39313335313435363236352e39,0x39313335313435363236362e39,0x39313335313435363236372e39,0x39313335313435363236382e39,0x39313335313435363236392e39,0x39313335313435363237302e39,0x39313335313435363237312e39,0x39313335313435363237322e39,0x39313335313435363237332e39,0x39313335313435363237342e39,0x39313335313435363237352e39,0x39313335313435363237362e39,0x39313335313435363237372e39,0x39313335313435363237382e39,0x39313335313435363237392e39,0x39313335313435363238302e39,0x39313335313435363238312e39,0x39313335313435363238322e39,0x39313335313435363238332e39,0x39313335313435363238342e39,0x39313335313435363238352e39+and+'0'='0--
Quote:
[Sun Feb 15 01:18:52.338818 2015] [:error] [pid 4542] [client ######] PHP Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(/**/sElEcT 1 /**/fRoM(/**/sElEcT count(*),/**/cOnCaT((/**/sElEcT(/**/sElEcT /**' at line 10' in *****\nStack trace:\n#0 *****: mysqli->query('\\n\\t\\t\\t\\t\\t\\tSELECT\\n\\t...')\n#1 *****): include_once('***o...')\n#2 {main}\n thrown in ***** on line 71, referer: *****(%2f**%2fsElEcT+1+%2f**%2ffRoM(%2f**%2fsElEcT+count(*),%2f**%2fcOnCaT((%2f**%2fsElEcT(%2f**%2fsElEcT+%2f**%2fuNhEx(%2f**%2fhEx(%2f**%2fcOnCaT(0x217e21,0x4142433134355a5136324457514146504f4959434644,0x217e21))))+%2f**%2ffRoM+information_schema.%2f**%2ftAbLeS+%2f**%2flImIt+0,1),floor(rand(0)*2))x+%2f**%2ffRoM+information_schema.%2f**%2ftAbLeS+%2f**%2fgRoUp%2f**%2fbY+x)a)+'
Quote:
[Sun Feb 15 01:18:52.597517 2015] [:error] [pid 4526] [client ######] PHP Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'Duplicate entry '!~!ABC145ZQ62DWQAFPOIYCFD!~!1' for key 'group_key'' in *****\nStack trace:\n#0 *****: mysqli->query('\\n\\t\\t\\t\\t\\t\\tSELECT\\n\\t...')\n#1 *****: include_once('***...')\n#2 {main}\n thrown in ***** on line 71, referer: *****'+and(%2f**%2fsElEcT+1+%2f**%2ffRoM(%2f**%2fsElEcT+count(*),%2f**%2fcOnCaT((%2f**%2fsElEcT(%2f**%2fsElEcT+%2f**%2fuNhEx(%2f**%2fhEx(%2f**%2fcOnCaT(0x217e21,0x4142433134355a5136324457514146504f4959434644,0x217e21))))+%2f**%2ffRoM+information_schema.%2f**%2ftAbLeS+%2f**%2flImIt+0,1),floor(rand(0)*2))x+%2f**%2ffRoM+information_schema.%2f**%2ftAbLeS+%2f**%2fgRoUp%2f**%2fbY+x)a)+and+'1'='1
Gewijzigd op 15/02/2015 21:14:59 door J C
Als ik het zo zie dan hebben ze een sql injectie gebruikt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$mainqry ="
SELECT
website_titel,
website_naam,
website_inhoud
FROM
website
";
if (!isset ($_GET['pagina']) || $_GET['pagina'] == '')
{
$mainqry .=" WHERE
website_id=201
";
}
else
{
$mainqry .=" WHERE
website_id BETWEEN 200 and 299
AND
website_naam='".mysql_real_escape_string($_GET['pagina'])."'
";
}
$mainsql = $connection->query($mainqry);
SELECT
website_titel,
website_naam,
website_inhoud
FROM
website
";
if (!isset ($_GET['pagina']) || $_GET['pagina'] == '')
{
$mainqry .=" WHERE
website_id=201
";
}
else
{
$mainqry .=" WHERE
website_id BETWEEN 200 and 299
AND
website_naam='".mysql_real_escape_string($_GET['pagina'])."'
";
}
$mainsql = $connection->query($mainqry);
IS er hier uit te halen of ze er ook in zijn gekomen?
Gewijzigd op 15/02/2015 17:41:42 door J C
Als /medewerkers/ alleen voor medewerkers toegankelijk is, zou ik die directory snel even dichttimmeren met een whitelist van vertrouwde IP-adressen in .htaccess. Dat is de snelste oplossing. (Je voorbeelden noemen slechts één kwaadaardig IP-adres, maar er kunnen meerdere IP-adressen worden gebruikt.)
Daarna eens controleren of je ergens gevoelig bent voor SQL-injectie.
Maar dat heeft dus vanaf nu prioriteit nummer 1.
Ik kan uit de database niet halen dat er iemand is ingelogd.
Dit wordt namelijk wel bijgehouden.
We hebben best wel wat medewerkers, die ook via hun telefoon inloggen op de website.
Ik zal eens kijken of ik al die ipadressen kan gebruiken.
<-- -->
mysql_real_escape_string($_GET['pagina'])
???
Gebruik je overal (nog) de mysql-extensie?
En als je dan toch een wrapper hebt, waarom maak je dan geen shorthand voor mysql_real_escape_string()?
$connection->escape() leest toch wat prettiger. Ik zou het ook $db noemen, en niet $connection.
Het zou ook logischer zijn dat als je van een wrapper gebruik maakt, ook alles in deze wrapper zit.
Daarnaast, weet je zeker dat de bovenstaande query je parten speelt?
Tevens, is je character encoding overal hetzelfde? Dit is namelijk van cruciaal belang voor de correcte werking van _real_escape_string() functionaliteit en daarmee dus ook voor het voorkomen van SQL-injectie.
En ook: het escapen van je (SQL) output alleen is soms niet genoeg. Soms moet je je input ook filteren.
Als je een numerieke waarde verwacht in $_GET['whatever'], controleer hier dan op. Als deze waarde vervolgens niet numeriek is, zou je de query niet eens uit moeten voeren.
Door de jaren heen zijn die basis bestanden een beetje verwaterd.
Het is me ook niet helemaal meer duidelijk waarom ik dit zo heb gedaan.
ik heb er nu dit van gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if(isset($_GET['pagina'])){
$pagina = $_GET['pagina'];
}
else
{
$pagina = 'home';
}
$qry ="
SELECT
website_titel,
website_naam,
website_inhoud
FROM
website
WHERE
website_id
BETWEEN 200 and 299
AND
website_naam=?
";
$statement = $connection->prepare($qry);
$statement->error;
$statement->bind_param('s', $pagina);
$statement->execute();
$result = $statement->get_result();
$maintekst = $result->fetch_assoc();
$pagina = $_GET['pagina'];
}
else
{
$pagina = 'home';
}
$qry ="
SELECT
website_titel,
website_naam,
website_inhoud
FROM
website
WHERE
website_id
BETWEEN 200 and 299
AND
website_naam=?
";
$statement = $connection->prepare($qry);
$statement->error;
$statement->bind_param('s', $pagina);
$statement->execute();
$result = $statement->get_result();
$maintekst = $result->fetch_assoc();
Hier zitten nu nog remote IP's in (die trouwens van nederlandse origine lijken te zijn :)) en de URL van je website.
Waarschijnlijk wil je juist nu niet nog meer mensen hebben die aan jouw poort(en) gaan voelen wel?
Gewijzigd op 15/02/2015 20:18:12 door Thomas van den Heuvel
We hebben een behoorlijk vermoeden wie er achter zit. Namelijk degene die al maanden probeert via het inlog scherm probeert in te loggen.
Misschien gebeurt dit via een website die een even goede beveiliging had als die van jou.
Maar gezien het ipadres en zijn geschiedenis op onze website vermoed ik wat anders.
Gewijzigd op 15/02/2015 20:37:38 door J C
Als je het IP van iemand hebt die dit doet , waarom deze niet excluden van je gehele site?
hoe doe ik dat? In de htacces?
Deny from 111.222.333.444
Evt hoofdletter gebruik even checken