sql注如pts教程_应用程序

SQL注如可导致的危害

数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

网站被挂马:传播恶意软件:修改数据库一些字段的值,嵌入网业马链接,进行挂马公鸡。

数据库被恶意操作:数据库服务器被公鸡,数据库的系统管理员帐户被窜改。

服务器被远程控制,被安装后们。经由数据库服务器提供的操作系统支持,让黑ke得以修改或控制操作系统。

一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注如的危害被进一步放大。

sql注如pts教程_应用程序_02

用户查看id为1的文章

/a.php?id=1

select * from where id = 1

查询test表中id为1的所有记录

sql注如pts教程_数据库_03


内部实现/流程的角度

业务点

url传参

表单post

Cookie

User-Agent

X-Forwarded-For

新闻/商品等查询处

用户注册/登陆处

修改用户资料时

找回密码处

搜索框

简言之:1.用户一切可以输入(可控)的地方。2.数据库一切可能导入、到处的东西

sql注如pts教程_数据库_04

根据传输方式

GET\POST\COOKIE

根据数据的类型

数字型、字符型

SQL注如(SQL Injection)是一种常见的Web安全漏东,它允许公鸡者通过构造特殊的SQL语句,将恶意代吗注入到数据库查询中,从而获取或篡改数据库中的数据。

SQL注如可以根据参数的类型分为数字型和字符型两种。

数字型SQL注如

数字型SQL注如发生在应用程序传递一个数值参数给数据库查询时。例如,假设有一个登录表单,用户名和密码都是通过GET请求传递的:

$username = $_GET['username'];
$password = $_GET['password'];
 
$query = "SELECT * FROM users WHERE username = $username AND password = $password";
  • 1.
  • 2.
  • 3.
  • 4.

如果公鸡者提交如下请求:

http://example.com/login.php?username=admin&password=1'
  • 1.

那么生成的SQL查询将会是:

SELECT * FROM users WHERE username = 'admin' AND password = 1';
  • 1.

由于password字段是一个数值字段,公鸡者可以通过提交类似1'的值来绕过密码验证。在这种情况下,1'会被解析为数字1,导致查询总是返回真。

字符型SQL注如

字符型SQL注如发生在应用程序传递一个字符串参数给数据库查询时。例如,假设有一个搜索功能,用户可以输入一个关键词:

$keyword = $_GET['keyword'];
 
$query = "SELECT * FROM products WHERE name LIKE '%$keyword%'";
  • 1.
  • 2.
  • 3.

如果公鸡者提交如下请求:

http://example.com/search.php?keyword=apple'; SELECT * FROM users; --
  • 1.

那么生成的SQL查询将会是:

SELECT * FROM products WHERE name LIKE '%apple'; SELECT * FROM users; --%'
  • 1.

在这个例子中,公鸡者通过在keyword参数中插入分号(;)来终止原来的查询,然后附加自己的查询。由于分号是SQL语句的结束标志,数据库会将分号后的查询视为一个新的查询,并执行它。

注入的模式

sql注如pts教程_SQL_05

基于联合查询

基于报错的注入模式

基于布尔的盲注

基于时间的盲注

推查询的注入模式


SQL注如公鸡有多种不同的技术和模式,每种模式都针对数据库响应的不同特性。以下是您提到的几种SQL注如模式的简要说明:

基于联合查询的注入(Union-Based Injection)

在这种模式下,公鸡者使用SQL的UNION操作符将恶意的SQL查询结果与原始查询的结果合并在一起。这通常用于检索额外的数据,如用户列表、敏感信息等。公鸡者需要知道现有查询的结构,以便正确地构造UNION查询。

示例:

SELECT column1, column2 FROM table1 WHERE id = 1 UNION SELECT username, password FROM users
  • 1.

基于报错的注入(Error-Based Injection)

这种模式利用数据库在遇到错误时返回的错误信息。公鸡击者构造特殊的查询,故意触发数据库错误,从而获取有关数据库结构的信息。这种方法依赖于应用程序没有正确地处理错误,并将错误信息暴露给用户。

示例:

SELECT * FROM users WHERE id = 1 AND (SELECT 1/0)
  • 1.

基于布尔的盲注(Boolean-Based Blind Injection)

在这种模式下,即使应用程序没有显示错误信息,公鸡者也可以通过观察应用程序的响应来推断查询结果的真假。公鸡者构造的查询会导致应用程序返回不同的响应,例如页面加载时间不同、内容变化等。

示例:

SELECT * FROM users WHERE id = 1 AND (SELECT SUBSTRING(password, 1, 1) FROM users WHERE username = 'admin') = 'a'
  • 1.

基于时间的盲注(Time-Based Blind Injection)

这种模式类似于基于布尔的盲注,但公鸡者使用数据库的延时函数(如MySQL的BENCHMARK()SLEEP())来延迟查询的执行。通过观察应用程序的响应时间,公鸡者可以推断查询结果的真假。

示例:

SELECT * FROM users WHERE id = 1 AND IF((SELECT SUBSTRING(password, 1, 1) FROM users WHERE username = 'admin') = 'a', SLEEP(5), NULL)
  • 1.

推查询的注入模式(Inferential Injection)

这种模式通常指的是公鸡者通过发送一系列精心设计的查询来推断数据库的信息。这些查询可能会导致数据库产生不同的响应,公鸡者通过分析这些响应来了解数据库的结构和内容。

示例:

SELECT * FROM users WHERE id = 1 AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'users') > 0
  • 1.

堆叠查询的注入模式

堆叠查询注入(Stacked Queries Injection),也称为多语句查询注入,是一种SQL注如技术,它允许公鸡者在单个数据库连接中执行多个SQL语句。在支持这种特性的数据库系统(如MySQL)中,可以通过在分号(;)后面添加额外的SQL语句来实现堆叠查询。

工作原理

在堆叠查询注入中,公鸡者利用应用程序对用户输入的不当处理,将多个SQL语句一起发送到数据库服务器。如果应用程序没有正确地过滤或转义用户输入,公鸡者可以在原始查询之后添加恶意SQL语句,这些语句将被数据库服务器依次执行。

示例

假设有一个简单的应用程序,它执行以下查询来更新用户信息:

UPDATE users SET email = '$newEmail' WHERE id = $userId
  • 1.

如果公鸡者能够注入恶意代吗,他们可能会发送如下请求:

http://example.com/update_email.php?newEmail=test%40example.com&userId=1;DROP TABLE users;
  • 1.

这将导致数据库执行以下两个查询:

UPDATE users SET email = 'test@example.com' WHERE id = 1; 
DROP TABLE users;
  • 1.
  • 2.

第二个查询会删除users表,造成严重的数据丢失。

内联SQL注如

sql注如pts教程_数据库_06

内联SQL注如(Inline SQL Injection)是一种SQL注如技术,其中公鸡者通过在原始SQL查询中嵌入恶意代吗来操纵查询的行为。与使用UNION操作符或堆叠查询注入不同,内联注入通常涉及修改现有的查询条件,使其返回公鸡者想要的结果。

工作原理

在内联SQL注如中,公鸡者利用应用程序对用户输入的不当处理,将恶意SQL代吗直接插入到正在执行的查询中。这通常涉及到改变查询的逻辑,例如修改WHERE子句的条件,使得原本应该被过滤掉的数据被返回。

示例

假设有一个简单的应用程序,它执行以下查询来验证用户登录:

SELECT * FROM users WHERE username = '$username' AND password = '$password'
  • 1.

如果公积者能够注入恶意代吗,他们可能会发送如下请求:

http://example.com/login.php?username=admin&password=1' OR '1'='1
  • 1.

这将导致数据库执行以下查询:

SELECT * FROM users WHERE username = 'admin' AND password = '1' OR '1'='1'
  • 1.

由于'1'='1'是一个永真的条件,公鸡者无需知道正确的密码就能绕过认证。

中止式SQL注如

sql注如pts教程_SQL_07

可能传输到后端的url还有sql语句

所以在插入的语句中加入注释符

区分数字和字符型注入

sql注如pts教程_应用程序_08

在SQL注如公鸡中,区分数字型注入和字符型注入是非常重要的,因为这两种类型的注入在公积技术和防御策略上有所不同。以下是区分这两种注入的方法:

数字型注入

数字型注入发生在应用程序将用户输入作为整数或浮点数处理的情况下。在这种情况下,公积者通常不需要使用引号来包围输入的SQL代码,因为数据库会自动将数字类型的输入转换为相应的SQL表达式。

特征
  1. 无引号:公鸡者不需要使用引号来包围输入的SQL代码。
  2. 数学运算:公积者可以使用数学运算符(如+-*/)来修改查询的逻辑。
示例

假设有一个应用程序,它执行以下查询来验证用户登录:

SELECT * FROM users WHERE user_id = $input_id
  • 1.

公鸡者可以通过输入1 OR 1=1来构造一个永真的条件,从而绕过认证。

字符型注入

字符型注入发生在应用程序将用户输入作为字符串处理的情况下。在这种情况下,公积者需要使用引号来包围输入的SQL代码,因为数据库会将字符串类型的输入作为一个完整的SQL表达式。

特征
  1. 使用引号:公鸡者需要使用引号来包围输入的SQL代码。
  2. 字符串操作:公积者可以使用字符串操作函数(如CONCATSUBSTRING)来构造复杂的SQL表达式。
示例

假设有一个应用程序,它执行以下查询来验证用户登录:

SELECT * FROM users WHERE username = '$input_username'
  • 1.

公鸡者可以通过输入' OR '1'='1来构造一个永真的条件,从而绕过认证。

区分方法

  1. 输入类型:如果应用程序将用户输入作为数字处理,很可能是数字型注入;如果应用程序将用户输入作为字符串处理,很可能是字符型注入。
  2. 引号使用:如果公积者需要使用引号来包围输入的SQL代码,很可能是字符型注入;如果不需要使用引号,很可能是数字型注入。
  3. 数学运算:如果公鸡者可以使用数学运算符来修改查询的逻辑,很可能是数字型注入;如果不能使用数学运算符,很可能是字符型注入。

小知识

如果程序逻辑上根本就不返回数据的查询结果,只会告诉你成功,不成功这种判断结果的话。用联合查询就会遇到比较多的困难,可以结合盲注、结合二进制、结合真假判断来一位一位的读取数据库信息也可以做到。

在实际运用中,利用布尔和利用报错注入的方式其实是一样的,都是利用不同响应的方式来判断真假。实际上时间注入也是如此,在任何注入都没有回显的情况下可以用时间注入的方式判断,判断为真就延时十秒,判断为假就直接输出,以此来作为判断的标准和抓手。

防范SQL注如

为了防止SQL注如,可以采取以下几种措施:

  1. 使用预编译语句(Prepared Statements):通过使用预编译语句,可以将参数与SQL语句分离,从而避免注入风险。
  2. 使用存储过程(Stored Procedures):存储过程可以将复杂的SQL逻辑封装起来,减少直接拼接SQL字符串的机会。
  3. 使用参数化查询(Parameterized Queries):参数化查询可以有效防止SQL注如,因为参数和SQL语句是分开处理的。
  4. 验证和清理用户输入:对用户输入进行严格的验证和清理,确保输入符合预期的格式。
  5. 限制数据库权限:应用程序使用的数据库账户应该只具备完成任务所需的最低权限,从而减少潜在的损害。
  6. 使用ORM框架:现代的ORM框架通常会自动处理SQL注如问题,避免手动拼接SQL字符串。

通过采取这些措施,可以大大降低SQL注如的风险,保护应用程序和数据库的安全。

为了防止SQL注如公鸡,开发人员应该遵循最佳实践,如使用参数化查询或预编译语句,限制数据库用户的权限,以及对用户输入进行严格的验证和清理。此外,定期进行安全审计和渗头测试也是保护应用程序免受SQL注如公鸡的重要措施。

注入步骤

sql注如pts教程_应用程序_09

SQL注如一般步骤

1.求闭合字符

2.选择注入模式

3.爆数据库

4.爆表名

5.爆列名

6.爆字段

SQL注如公鸡的一般步骤通常包括以下几个阶段,每个阶段都有其特定的目标和技术。以下是一个典型的SQL注如公积流程:

1. 确定闭合字符

在进行SQL注如之前,公积者需要确定应用程序如何处理SQL查询中的用户输入。这通常涉及到找到用于闭合现有SQL语句的字符。例如,如果应用程序使用单引号来包围字符串参数,公鸡者可能需要使用单引号来闭合字符串。

示例:

SELECT * FROM users WHERE username = '输入的用户名'
  • 1.

公积者可能会尝试输入' OR '1'='1来构造一个永真的条件,从而绕过认证。

2. 选择注入模式

根据应用程序的响应和数据库的特性,公鸡者会选择最合适的注入模式。这可能包括基于错误的注入、基于布尔的盲注、基于时间的盲注、联合查询注入或堆叠查询注入等。

3.爆破数据库信息

sql注如pts教程_应用程序_10

一旦确定了注入点,公积者会开始收集有关数据库的信息,包括数据库类型、版本、当前用户权限等。这通常通过构造特定的查询来实现,这些查询会触发数据库返回相关信息。

4. 爆破表名

sql注如pts教程_数据库_11

公鸡者会尝试获取数据库中的表名。这可以通过查询系统表(如information_schema)或使用暴力破接技术来实现。

示例:

SELECT table_name FROM information_schema.tables WHERE table_schema = '目标数据库名'
  • 1.

5. 爆破列名

获取表名后,公积者会进一步获取表中的列名,以确定哪些列包含感兴趣的数据。

示例:

SELECT column_name FROM information_schema.columns WHERE table_name = '目标表名'
  • 1.

6.爆破字段

sql注如pts教程_数据库_12

最后,公鸡者会尝试提取特定列中的数据,如用户名、密码、个人信息等。这可能涉及到使用UNION查询、盲注技术或其他方法来检索数据。

示例:

SELECT username, password FROM users WHERE id = 1
  • 1.

sql注如pts教程_数据库_13

MSSQL注如点的基本检查

利用MSSQL扩展存储注入公积

检查与恢复扩展存储

sa权限下扩展存储公鸡利用方法

xp_cmdshell扩展执行任意命令

xp_regwrite操作注册表与开启沙盒模式

利用sp_makewebtash写入一句话木马

DBowner权限下的扩展公积利用

MSSQL注如猜解数据库技术

Having与group by查询爆表名与字段名

order by 与数据库类型转换报错法

查询爆库的另一种方法

union select查询注入技术

窃取哈希口令